第 10 章 MyBatis入门
MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联起来。MyBatis 可以使用XML 或注解进行配置或映射,MyBatis 通过将参数映射到配置的 SQL 中形成最终执行的 SQL 语句,最后将执行SQL 的结果映射成 Java 对象并返回。本章主要内容有:
(1)从JDBC到MyBatis;
(2)第一个MyBatis示例(基于Maven);
(3)MyBatis框架原理;
(4)MyBatis核心组件的生命周期。
10.1 从JDBC到MyBatis
JDBC(Java数据库连接)是一种用于执行 SQL语的JavaAPI可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。下面来简单回顾一下JDBC是如何工作的。
(1)加载JDBC驱动程序:
try { Class.forName("org.postgresql.Driver"); // 加载 PostgreSQL 的驱动类 } catch(ClassNotFoundException e) { System.out.println("找不到驱动程序,加载驱动失败!") }
(2)建立并获取数据库连接:
String url="jdbc:postgresql://127.0.0.1:5432/mybatis_db"; String usr="postgres"; conn=DriverManager.getConnection(url,usr,psd);
(3)创建 Statement 对象:
String stringsql="INSERT INTO t_user(name,gender,email VALUES(?,?,?)"; PreparedStatement ps=conn.prepareStatment(stringsql);
(4)设置 SQL 语句的传入参数:
ps.setString(1, name); ps.setString(2, gender); ps.setString(3,email);
(5)执行 SQL 语句并获得查询结果:
int rs=ps.executeUpate();
(6)对查询结果进行转换处理并将结果返回:
if(rs>0){ out.println("插入成功"); }else { out.println("插入失败"); }
(7)释放连接资源:
ps.close() conn.close()
上述 7 个步骤是 JDBC 的基本步骤,也是不可缺少的步骤。
如果进行过 JDBC 的相关开发,从 JDBC 的实现过程中会发现一些问题。其主要其中在一下几点。
(1)数据库连接过于频繁。每次都需要配置数据源、进行数据连接,结束后还要关闭资源,导致重复代码较多,频繁进行这些操作也会降低一些效率。
(2)SOL 语句过于零散,不利于管理。使用 JDBC 操作数据库时,SOL 语基本上都散落在各个 Java 类中,这样有 3 个不足之处:第一可读性很差,不利于维护以及做性能调优第二,改动 Java 代码需要重新编译、打包部署;第三,不利于取出 SOL 并在数据库客户端执行(取出后还要删掉其中的 Java 代码,编写好的 SOL 语写好后还要通过十号在 Java 中进行拼凑)。
(3)SOL 语句的参数不够活。很多情况下,可以通过在 SQL 语句中设置占位符来达到使用传入参数的目的,这种方式本身有一定的局限性,它是按照一定顺序传入参数的,要与占位符一一匹配。但如果传入的参数是不确定的(如列表查询,根据用户填写的查询条件不同,传入查询的参数也是不同的,有时是一个参数,有时可能是3 个参数),那么就要在后台代码中根据请求的传入参数去拼凑相应的 SOL 语句这样还是要在 Java 代码中写 SOL语句。
(4)不支持结果映射和结果缓存。其没有映射,每次执行后,必须将结果取出,这个结果如果是常用的一个集合,通常会将其封装,但是由于其没有自动映射的功能,每次都需要手工将结果集映射到实体(Bean)中,比较费时。此外,结果是一次性的,下次再使用或者查询时,需要重新执行 SOL,那么如果能够缓存结果,就可以提升 SOL 查询的性能。
(5)SQL 重用度不高。由于 SL 语都有不同的配置,当几个功能的 SOL 语句差不多的时候,就没有办法实现重用,当需要修改这些 SOL 时还需要修改每一处需要修改的 SQL,非常不利于维护。
(6)不安全 JDBC 中的 SOL 语有的地方需要使用拼接字符串的方式实现,这是非常危险的,容易导致 SQL 注入,如果不做处理,则安全性是非常差的。
这些都是 JDBC 的弊端,当然,JDBC 由于是直接编译实现 SOL 语的运行,其执行效率是很高的。在实际工作中,我们很少使用 JDBC 进行编程,于是提出了对象关系映射(ObiectRelationalMapping,ORM)。ORM 模式是一种用于解决面向对象与关系数据库存在的互不匹配的现象的技术。简单地说,ORM 通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
MyBatis 和 Hibernate 都是目前较为流行的 ORM 框架。Hibernate 是一个面向 Java环 境的 ORM 工具它将对象模型表示的简单的 Java 对象(PlainOrdinaryJavaObiect,POJO)映射到基于 SOL 的关系数据结构中 POJO作为普通的 JavaBean 对象并不具备持久化操作能力,Hibermate 通过定义映射文件将 POJO 映射到相应的数据库获得持久化对象PO,通过操作PO,实现对数据库的增、删、改、查操作。
MyBatis本是 Apache的一个开源项目 iBatis,2010年,其由 Apache Software Foundation 迁移到了 Google Code,并且改名为MyBatis,2013年11月迁移到Github。 MyBatis官方网址为 https://githubcom/mybatis,在其中可以看到 MyBatis 的多个子项目。
MyBatis 和 Hibernate 均属于 ORM 框架,用于实现持化类与数据库之间的相映射通过操作持久化类,从而实现对数据库的操作。它们的基本实现过程是相似的,首先,其由配置文件获取数据源;其次,采用工厂模式(即 MyBatis 的 SglSessionFactory,Hibernate 的 SessionFactory),获取与之交互的接口(即MyBatis 的 SqlSession,Hibernate 的 Session),进而获得操作持久化类的接口对象(即MyBatis 的Mapper,Hiberate的Transaction和Query)。Hibermate 的 SOL 大多是自动生成的,无法直接维护 SOL,虽然配备了 Hibernate 查询语言(HOL)但 HOL 在能上还是不如 SOL 丰富。此外,Hibermate 查询数据表会直接将所有字段查询出来,这样会影响查询效率,而如果 Hibermate 采用自己编写的 SOL来查询,又破坏了 Hibermate 开发自动生成 SOL的特点,因此在这一点上,手动编写 SOL 的 MyBatis 更为灵活,可以按需指定查询字段,在查询效率上更优。