本文共 8041 字,大约阅读时间需要 26 分钟。
接着,我们通过一张图,来了解一下mybatis的框架原理:
框架架构讲解:
a、加载配置文件:配置来源于两个地方,一个是配置文件,一个是java代码的注解,将sql的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
b、SQL解析:当api接口层接收到调用请求时,会接收到传入slq的id和传入对象(可以是map或者基本数据类型),mybatis会根据sql的id找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的sql语句和参数。
c、 SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
d、结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。
mybatis入门程序解析
接着,小编结合demo来具体介绍一下,需求如下: 根据用户id查询用户信息; 根据用户名称模糊查询用户信息; 添加、删除、更新用户。 第一步、建立各种包和类,工程目录如下所示:
第二步、编写SqlMapConfig.xml中的内容,配置mybatis的运行环境,数据源,事务等。代码如下所示:
第三步、编写User.java中的内容,如下所示:
package cn.itcast.mybatis.po;import java.util.Date;/** * *第四步、实现增删改查的功能,首先编写User.xml中的内容,如下所示:Title: User
*Description:用户po
* @author 丁国华 * @date 2016年7月31日 15:39:04 * @version 1.0 */public class User { //属性名和数据库表的字段对应 private int id; private String username;// 用户姓名 private String sex;// 性别 private Date birthday;// 生日 private String address;// 地址 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address=" + address + "]"; }}
第五步、编写具体的方法,如下所示:SELECT LAST_INSER_ID() insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})SELECT uuid() insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address});delete from user where id=#{id} update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
package cn.itcast.mybatis.first;import java.io.IOException;import java.io.InputStream;import java.util.Date;import java.util.List;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import cn.itcast.mybatis.po.User;public class MybatisFirst { // 根据id查询用户信息,得到一条记录结果 @Test public void findUserByIdTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 通过SqlSession操作数据库 // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数 // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象 // selectOne查询出一条记录 User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user); // 释放资源 sqlSession.close(); } //根据用户名称模糊查询用户列表 @Test public void findUserByNameTest() throws IOException{ //mybatis配置文件 String resource ="SqlMapConfig.xml"; //得到配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //List中的user和映射文件中德resultType所指定的类型一致 Listmybatis的优缺点 优点: a、易于上手和掌握。 b、sql写在xml里,便于统一管理和优化。 c、 解除sql与程序代码的耦合。 d、提供映射标签,支持对象与数据库的orm字段关系映射 e、提供对象关系映射标签,支持对象关系组建维护 f、提供xml标签,支持编写动态sql。 缺点: a、 sql工作量很大,尤其是字段多、关联表多时,更是如此。 b、sql依赖于数据库,导致数据库移植性差。 c、 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。 d、DAO层过于简单,对象组装的工作量较大。 e、 缓存使用不当,容易产生脏数据。list = sqlSession.selectList("test.findUserByName","小明"); System.out.println(list); sqlSession.close(); } public void insertUserTest() throws IOException{ //mybatis配置文件 String resource ="SqlMapConfig"; //得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到sqlsession SqlSession sqlSession = sqlSessionFactory.openSession(); //插入用户对象 User user = new User(); user.setUsername("丁国华"); user.setBirthday(new Date()); user.setSex("1"); user.setAddress("安徽合肥"); //list中的user和映射文件中的resultType所指定的类型一直 sqlSession.insert("test.insertUser",user); //提交事物 sqlSession.commit(); //关闭会话 sqlSession.close(); } //根据id删除用户信息 @Test public void deleteUserTest() throws IOException{ //mybatis配置文件 String resource = "SqlMapConfig.xml"; //得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //创建工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //传入id删除用户 sqlSession.delete("test.deleteUser",39); //提交事物 sqlSession.commit(); //关闭会话 sqlSession.close(); } // 更新用户信息 @Test public void updateUserTest() throws IOException { // mybatis配置文件 String resource = "SqlMapConfig.xml"; // 得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder() .build(inputStream); // 通过工厂得到SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 更新用户信息 User user = new User(); //必须设置id user.setId(41); user.setUsername("丁国华"); user.setBirthday(new Date()); user.setSex("2"); user.setAddress("安徽合肥"); sqlSession.update("test.updateUser", user); // 提交事务 sqlSession.commit(); // 关闭会话 sqlSession.close(); }}
mybatis和hibernate的对比 相同点:Hibernate和mybatis都可以是通过SessionFactoryBuilder由xml配置文件生成SessionFactory,然后由
SessionFactroy生成Session,最后由Session来开启执行事物和SQL语句,其中SessionFactoryBuider、
SessionFactory、Session的生命周期都是差不多的。
不同点:
mybatis:小巧、方便、高效、简单、直接、半自动;
hibernate:强大、方便、高效、复杂、绕弯子、全自动;
mybatis:
a、入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很多的SQL使用经验,对于没有
那么高的对象模型要求的项目来说,堪称perfect。
b、 可以进行更为细致的SQL优化,可以减少查询字段。
c、 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是
要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。 d、 二级缓存机制不佳。 hibernate: a、功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的
封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。 b、有更好的二级缓存机制,可以使用第三方缓存。 c、缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡
,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。
举个形象的比喻: mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。 hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。
小编寄语:该博文,小编主要简单的介绍了mybatis的基本知识,包括一个简单的增删改查的demo,mybatis的
优缺点,以及hibernate和mybatis的对比,她们之间的相同点和不同点,mybatis简单来说,就是一个持久层的框架,
mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足需要的sql语句,mybatis可以
将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。
转载地址:http://rswao.baihongyu.com/