作为中国最流行的开源orm框架,mybatis在使用时通常会感受到很多便利,但很少进行深入分析。mybatis源代码少,功能丰富。这是一个很好的学习例子。本系列文章将与您一起学习mybatis框架
1.MyBatis概述1.1 框架- 在文献中看到的framework被翻译成框架
- Java常用框架:
- SSM三大框架:Spring + SpringMVC + MyBatis
- SpringBoot
- SpringCloud
- 等。。
- 框架实际上是包装一般代码,提前写了一堆接口和类别,我们可以直接引入这些接口和类别(引入框架),基于这些现有的接口和类别开发,可以大大提高开发效率。
- 框架通常以jar包的形式存在。(jar包中有class文件和各种配置文件。)
- SSM三大框架的学习顺序:MyBatis、Spring、SpringMVC(只是建议)
- 表现层(UI):直接与前端交互(一是接收前端ajax请求,二是将json数据返回前端)
- 业务逻辑层(BLL):一是处理表现层转发的前端请求(即具体业务),二是将从持久层获取的数据返回表现层。
- 数据访问层(DAL):CRUD直接操作数据库,并将获得的数据返回到上一层(即业务逻辑层)。
- Java持久层框架:
- MyBatis
- Hibernate(JPA规范已经实现)
- jOOQ
- Guzz
- Spring Data(JPA规范已经实现)
- ActiveJDBC
- ...
- 示例代码1:
// ...// sql语句写死在java程序String中 sql = "insert into t_user(id,idCard,username,password,birth,gender,email,city,street,zipcode,phone,grade) values(?,?,?,?,?,?,?,?,?,?,?,?)";PreparedStatement ps = conn.prepareStatement(sql);// 繁琐的赋值:想想这种规律的代码是否可以通过反射机制自动化。ps.setString(1, "1");ps.setString(2, "123456789");ps.setString(3, "zhangsan");ps.setString(4, "123456");ps.setString(5, "1980-10-11");ps.setString(6, "男");ps.setString(7, "zhangsan@126.com");ps.setString(8, "北京");ps.setString(9, "大兴区凉水河二街";ps.setString(10, "1000000");ps.setString(11, "16398574152");ps.setString(12, "A");// 执行SQLint count = ps.executeUpdate();// ...
- 示例代码2:
// ...// sql语句写死在java程序String中 sql = "select id,idCard,username,password,birth,gender,email,city,street,zipcode,phone,grade from t_user";PreparedStatement ps = conn.prepareStatement(sql);ResultSet rs = ps.executeQuery();List<User> userList = new ArrayList<>();// 思考下面循环中的所有代码是否可以通过反射自动包装。while(rs.next()){ // 获取数据 String id = rs.getString("id"); String idCard = rs.getString("idCard"); String username = rs.getString("username"); String password = rs.getString("password"); String birth = rs.getString("birth"); String gender = rs.getString("gender"); String email = rs.getString("email"); String city = rs.getString("city"); String street = rs.getString("street"); String zipcode = rs.getString("zipcode"); String phone = rs.getString("phone"); String grade = rs.getString("grade"); // 创建对象 User user = new User(); // 赋值对象属性 user.setId(id); user.setIdCard(idCard); user.setUsername(username); user.setPassword(password); user.setBirth(birth); user.setGender(gender); user.setEmail(email); user.setCity(city); user.setStreet(street); user.setZipcode(zipcode); user.setPhone(phone); user.setGrade(grade); // 添加到集合 userList.add(user);}// ...
- JDBC不足:
- Java程序中写的SQL语句不灵活。如果你改变SQL,你必须改变Java代码。OCP违反开闭原则。
- 传值繁琐。能自动化吗???
- 把结果集包装成Java对象很麻烦。能自动化吗???
- MyBatis本质上是JDBC的封装,CRUD是通过MyBatis完成的。
- MyBatis负责三层架构中的持久层,属于持久层框架。
- MyBatis的发展历程:【引用百度百科】
- MyBatis原本是apache的开源项目iBatis,2010年由apache项目组成 software foundation迁移到google code,并更名为MyBatis。2013年11月迁至Github。
- “IBATIS”一词来源于“internet”和“abatis“组合是基于Java的持久层框架。IBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)。
- 打开mybatis代码可以看到它的包结构包含:ibatis
- ORM:对象关系映射
- O(Object):Java虚拟机Java对象
- R(Relational):关系数据库
- M(Mapping):将Java虚拟机中的Java对象映射到数据库表中的一行记录,或将数据库表中的一行记录映射到Java虚拟机中的Java对象。
- ORM图示
- MyBatis属于半自动ORM框架。
- Hibernate属于全自动ORM框架。
- MyBatis框架特点:
- 支持定制化 SQL、存储过程、基本映射和高级映射
- 几乎所有的东西都被避免了 JDBC 手动设置参数并获取代码中的结果集
- 支持XML开发和注释式开发。【为了保证SQL语句的灵活性,mybatis大多采用XML开发。】
- 将接口和 Java 的 POJOs(Plain Ordinary Java Object,简单普通的Java对象)映射成数据库中的记录
- 体积小,好学:两个jar包,两个XML配置文件。
- 完全实现sql解耦合。
- 提供基本的映射标签。
- 提供高级映射标签。
- 提供XML标签,支持动态SQL的编写。
- ...