初识Mybatis

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!
该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!(侵权可联系我,进行删除,如果雷同,纯属巧合)
1.什么是Mybatis?
- MyBatis 是当前主流的Java持久层框架之一,它与Hibernate一样,也是一种ORM框架。因其性能优异,且具有高度的灵活性、可优化性和易于维护等特点,所以受到了广大互联网企业的青睐,是目前大型互联网项目的首选框架。
- MyBatis (前身是iBatis )是一个支持普通SQL查询、存储过程以及高级映射的持久层框架 ( 即操作数据库的框架),MyBatis 消除了几乎所有的 JDBC代码 和 参数的手动设置以及对结果集的检索,并使用简单的XML或注解进行配置和原始映射,用以将接口 和 Java的POJO ( Plain Old Java Object,普通Java对象)映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。
- MyBatis框架也被称之为ORM ( Object/Relational Mapping,即对象关系映射) 框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
- ORM框架的工作原理如下图所示 :
从上图可以看出,使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象( Persisent Object, PO),而ORM框架则会通过映射关系将这些面向对象的操作转换成底层的SQL操作。- 常见的 ORM(对象关系映射)框架有 : Hibernate 和 MyBatis。
2.Hibernate 和 MyBatis的区别?
Hibernate :
是一个 全表映射的框架。通常开发者只需定义好持久化对象到数据库表的映射关系,就可以通过Hibernate提供的方法完成持久层操作。开发者并不需要熟练地掌握SQL语句的编写,Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用 JDBC 接口来执行,所以其开发效率会高于MyBatis。
( Hibernate 优点 : Hibernate开发效率高于Mybatis )然而Hibernate自身也存在着一些 缺点, 例如 ① 它在多表关联时,对SQL查询的支持较差; ② 更新数据时,需要发送所有字段; ③ 不支持存储过程;④ 不能通过优化SQL来优化性能等。这些问题导致Hibernate只适合在场景不太复杂且对性能要求不高的项目中使用。
( Hibernate 缺点 : 只适合在常见不太复杂 且对性能要求不高的项目中使用 )
MyBatis :
是一个 半自动映射的框架。这里所谓的“半自动"是相对于Hibernate全表映射而言的,MyBatis 需要手动匹配提供POJO (普通java对象 )、SQL 和 映射关系,而Hibernate 只需提供 POJO 和 映射关系 即可。
与Hibernate 相比,虽然使用MyBatis 手动编写sql语句要比使用Hibernate的工作量大,但是 MyBatis可以配置动态SQL并优化SQL,它还支持存储过程 等。对于一些复杂的和需要优化性能的项目来说,使用MyBatis更加合适。
( MyBatis优点 : 适合在常见不太复杂 且对性能要求不高的项目中使用,实际开发中,更倾向于使用Mybatis来操作数据库 )
3.Mybatis的下载和使用
使用Mybatis框架很简单,只需在 应用程序中引入Mybatis的核心包 和 Mybatis的依赖包 (lib目录中的依赖包)即可。
Mybatis框架网址 : https://github.com/mybatis/mybatis-3/releases
lib目录下的详细Jar包内容 如下:
Mybatis网址 (可下载Mybatis核心包 和 Mybatis的依赖包)
获得Mybatis核心包 和 Mybatis的依赖包 (百度网盘)
jar包 / maven( 依赖 ) 下载( 可自行按需下载JAR )注意 :
如果底层采用的是MySQL数据库,那么还需要将MySQL数据库的驱动JAR包添加到应用程序的径中;如果采用其他类型的数据库,则同样需要将对应类型的数据库驱动包添加到应用程序的类路径中。
4.Mybatis的工作原理
MyBatis框架在操作数据库时,大体经过了8个步骤 :
第一步、 读取 Mybatis配置文件 (mybatis-config.xml ) :
通过 输入流 来 读取 Mybatis-config.xml 配置文件。
package com.myh.test; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class MybatisTest { // 测试类 : 根据id来查询数据 /** * 根据客户编号查询客户信息 */ public void findCustomerByIdTest() throws Exception{ //1.读取mybatis框架的配置文件 String resource = "mybatis-config.xml"; //通过“输入流”读取mybatis配置文件 /* 在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置, 可实施加载“映射文件” */ InputStream inputStream = Resources.getResourceAsStream(resource); } }
mybatis-config.xml 中现在 要配置的 内容有 : 配置Mybatis的 运行环境、获取数据库的连接。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- Mybatis的配置文件: mybatis-config.xml : 为全局配置文件,配置了“运行环境的信息”, 主要内容是 : 数据库的连接 --> <!-- 1.配置环境,默认环境id为mysql --> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"/> <!-- 用于指定MyBatis获取数据库连接的方式。“POOLED”代表的是连接池。 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration>
第二步、 加载“映射文件” (Mapper.xml ) :
XxxMapper.xml文件 即 SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行 )。mybatis-config.xml可以加载多个配置文件,每个配置文件对应数据库中的一张表。
(加载映射文件 (实际操作为 : ) : 在原mybatis-config.xml中 配置 XxxMapper.xml文件的位置)<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 2.配置Mapper文件的位置 : mybatis.config.xml配置文件要读取映射文件: 即读取mapper.xml文件 --> <!-- 所以此处要映射文件CustomerMapper.xml (因为Mybatis-config.xml要加载"映射文件") --> <mappers> <mapper resource="com/myh/CustomerMapper.xml"/> </mappers> </configuration>
此时 mybatis-config.xml配置文件 中的 完整 代码 如 :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- Mybatis的配置文件: mybatis-config.xml : 为全局配置文件,配置了“运行环境的信息”, 主要内容是 : 数据库的连接 --> <!-- 1.配置环境,默认环境id为mysql --> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"/> <!-- 用于指定MyBatis获取数据库连接的方式。“POOLED”代表的是连接池。 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 2.配置Mapper文件的位置 : mybatis.config.xml配置文件要读取映射文件: 即读取mapper.xml文件 (读取映射文件) --> <!-- 因为按照"Mybatis框架的执行流程图 : 加载了mybatis-config.xml配置文件之后,是要加载"映射文件"的,所以 --> <mappers> <mapper resource="com/myh/CustomerMapper.xml"/> </mappers> </configuration>
第三步、 构造 “会话工厂” (SqlSessionFactory) : 根据 mybatis-config.xml配置文件 构建 会话工厂 : SqlSessionFactory :
通过 调用 “Sql会话工厂生成器”对象 (SqlSessionFactoryBuilder) 的 build( )方法 来构建 会话工厂 :package com.myh.test; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class MybatisTest { // 测试类 : 根据id来查询数据 /** * 根据客户编号查询客户信息 */ public void findCustomerByIdTest() throws Exception{ // //1.读取mybatis框架的配置文件 // String resource = "mybatis-config.xml"; // //通过“输入流”读取mybatis配置文件 // /* // 在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置, // 可实施加载“映射文件” // */ // InputStream inputStream = Resources.getResourceAsStream(resource); //2.根据配置文件“构建会话工厂 : SqlSessionFactory ” SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } }
第四步、构造 “会话对象” (SqlSession) :
由 会话工厂 (sqlSessionFactory) 创建SqlSession对象,该对象 (SqlSession) 中包含了执行SQL的所有方法。//3.通过SqlSessionFactory(会话工厂)创建SqlSession("会话"对象) SqlSession sqlSession = sqlSessionFactory.openSession();
第五步、Executor执行器 :
MyBatis底层定义了一个Executor接口来操作数据库,它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。第六步、MappedStatement对象 :
在Executor接口的执行方法中,包含一个MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等。Mapper.xml文件中一个SQL对应一个MappedStatement对象,SQL的 id 即是MappedStatement 的 id。
第七步、输入映射 (Map、List类型、String、Integer等基本数据类型、POJO类型) :
在执行方法时,MapedStatement对象会对用户执行SQL语句的输入参数进行定义 (可以定义为Map、List 类型、基本类型和POJO类型),Executor执行器会通过MappedStatement对象在执行SQL前,将输入的Java对象映射到SQL语句中。这里对输入参数的映射过程就 类似于 JDBC 编程中对 preparedStatement对象设置参数的过程。第八步、输出映射 (Map、List类型、String、Integer等基本数据类型、POJO类型) :
在数据库中执行完SQL语句后,MappedStatement 对象会对SQL执行输出的结果进行定义 (可以定义为Map和List类型、基本类型、POJO类型),Executor执行器会通过MappedStatement对象在执行SQL语句后,将输出结果映射至Java对象中。这种将输出结果映射到 Java对象的过程就类似于JDBC编程中对结果的解析处理过程。第五到 - 第八步 :实际操作 : 大致可以理解为 :
通过SqlSession对象操作数据库 (包括查询、添加、修改、删除以及提交事务。)
完成代码例子 (测试类) 如下 :
package com.myh.test; import com.myh.po.Customer; 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 java.io.InputStream; public class MybatisTest { // 测试类 : 根据id来查询数据 /** * 根据客户编号查询客户信息 */ @Test //Junit4"单元测试" public void findCustomerByIdTest() throws Exception{ //1.读取mybatis框架的配置文件 String resource = "mybatis-config.xml"; //通过“输入流”读取mybatis配置文件 /* 在该mybatis-config.xml配置文件中,已配置了“数据源”信息 和配置了"映射文件 : XxxMapper.xml”的位置, 可实施加载“映射文件” */ InputStream inputStream = Resources.getResourceAsStream(resource); //2.根据配置文件“构建会话工厂 : SqlSessionFactory ” SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3.通过SqlSessionFactory(会话工厂)创建SqlSession("会话"对象) SqlSession sqlSession = sqlSessionFactory.openSession(); //4.SqlSession执行"映射文件"中定义的SQL,并返回"映射结果" //SelectOne()中的参数为 : "映射文件"中的sql语句 + 该sql语句对应的参数为:1 ---执行获得指定id下的“顾客信息” Customer customer = (Customer)sqlSession.selectOne("CustomerMapper.findCustomerById", 1); //打印输出结果 System.out.println(customer.toString()); //5.关闭SqlSession sqlSession.close(); } }
5.Mybatis操作的大致步骤
(1) 读取配置文件 (得事先配置好 mybatis-config.xml 、XxxMapper.xml映射文件、log4j.properties 、通过“输入流”的方式读取配置文件 等)。
(2) 根据mybatis-config.xml 配置文件构建 SqlSessionFactory。
(3) 通过SqlSessionFactory创建 SqlSession。
(4) 使用SqlSession对象操作数据库(包括查询、添加、修改、删除以及提交事务等)。
通过SqlSession对象的方法 + 映射文件中的sql语句等来操作数据库。(5) 关闭SqlSession。