MyBatis

DAO层的其他工具与框架

JDBC 的缺陷

  • 代码啰嗦、开发效率低
  • 需要关注 Connection, preparedStatement, ResultSet 对象的创建与释放
  • ResultSet 的查询结果,需要自己封装为 List
  • 代码重复的地方多,
  • 业务代码和数据库的操作混杂在一起
  • 最严重的:SQL语句是硬编码在程序中的,造成了强耦合——如果要优化 SQL 语句,就需要对整个项目进行重新编译,打包。

Hibernate-数据库交互的框架(Object Relation Mapping,ORM),他将整个与 MySQL 操作有关的逻辑都封装好了。我们在编写业务的时候,不用管MySQL的具体操作。

  • 随这业务逻辑便的越来越复杂,对MySQL操作语句的要求变得越来越高,而Hibernate关于MySQL的操作又是封闭的,这就带来很大不便。即:无法满足定制SQL
  • 是一个全映射框架(即,每次查询默认查询所有字段),部分字段映射能做,但是很困难。

所以我们现希望:一个能支持定制化SQL,同时SQL语句也不要硬编码在Java程序中,并有着强大的功能。

原生 JDBC 的操作流程

  1. 获取数据库连接
  2. 写 SQL
  3. 获取 PreparedStatementps= connection.preparedStatement(sql),将参数化的SQL语句传给数据库进行预编译。
  4. 填充参数:ps.setObject(i+1, ars[i])
  5. 执行 sql:ps.excute()
  6. 封装结果

MyBatis

中文文档地址

MyBatis 是 SQL Mapper Framework for Java(SQL 映射框架),是一个强化版的 JDBC,即:

  • SQL Mapper:SQL 映射
    • 把数据库的表中的一行数据,映射成为一个 Java 对象。对这个对象的操作,就相当于操作表中的数据
  • Data Access Objects (DAOs): 数据访问
    • 对数据库进行增删改查。

MyBatis 底层就是对原生 JDBC 的一个简单封装。但其,将SQL硬编码在Java程序中这一部分抽取出来,改写在配置文件中。实现了 SQL 和 Java 编码分开的效果,功能边界清晰,一个专注业务,一个专注数据。

其余的步骤则封装成一个整体。

这样就完全解决了数据库优化问题,在带来了便捷性还保证了灵活性。

MyBatis 提供了哪些功能:

  • 提供了创建 Connection, Statement(PreparedStatement), ResultSet 的能力,不在需要我们来创建这些对象了
  • 提供了执行 sql 语句的能力,不用我们自己执行 sql
  • 提供了循环 sql,把 sql 查询结果转化为 Java 对象,List 集合的能力
  • 提供了关闭资源的能力,不用我们手动关闭了。

因此,我们只需要提供 SQL 语句。流程是:

  1. 提供 sql 语句
  2. MyBatis 处理该语句
  3. 得到 JavaBean 对象或 List 集合

Hello World

基础环境搭建:

  1. 创建一个数据库,其内有一个 user 表,字段如下:

    • id

    • name

    • password

    • address

    • phone

  2. 创建一个对应的 JavaBean:User

  3. 创建 UserDAO 接口

    public interface UserDAO {
        User getUserById(Integer id);
    }
    

MyBatis 开始:

  1. 导入三个包:

    • mybatis-3.5.7.jar
    • mysql-connector-java-8.0.23.jar
    • log4j-1.2.17:日志包,依赖于 classpath 目录下的 log4j.xml。(不需要日志的话,可不用)
  2. 写配置:

    1. 第一个配置文件:mybatis-config.xml,其作为 MyBatis 的 全局配置文件,配置了事务管理器,和dataSource。目的是:

      • 指导 MyBatis 如何正确运行,比如连接向哪个数据库。
    2. 第二个配置文件:编写 DAO 接口的实现配置文件,相当于 DAOImpl。主要实现以下几个地方

      • 1、namespace 属性:告诉 Mabits 当前配置文件用于实现哪个接口类

      • 2、重写接口类中的方法,如: