什么是MyBatis
MyBatis是当前主流的Java持久层框架之一,是一种ORM框架。
所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象(PO),而ORM框架则会通过映射关系将这些面向对象的操作转换成底层的SQL操作。
常见的ORM框架有Mybatis、Hibernate。它们的主要区别如下:
Hibernate:是一个全表映射的框架。通常开发者只需定义好持久化对象到数据表的映射关系,就可以通过Hibernate提供的方法完成持久层操作。Hibernate会根据制定的存储逻辑,自动的生成对应的SQL,并调用JDBC接口来执行,所以其开发效率要高于MyBatis。
缺点如下:
- 多表关联时,对SQL的查询支持较差
- 不能通过优化SQL来优化性能
- 不支持存储过程
- 更新数据时,需要发送所有字段
- 只适用于场景不太复杂、性能要求不高的项目中去使用
MyBatis:是一个半自动映射的框架。(相对于Hibernate全表映射来说),MyBatis需要手动匹配提供PO、SQL和映射关系。虽然手动编写SQL工作量大,但MyBatis可以配置动态SQL并优化SQL,可以通过配置决定SQL的映射规则;同时还支持存储过程。
对于一些复杂的和需要优化性能的项目来说,MyBatis更加合适。
MyBatis的工作原理
- 读取MyBatis配置文件 mybatis-config.xml,其中配置了数据库的连接等信息。在配置文件中,可以配置多个映射文件。
- 加载映射文件Mapper.xml。即SQL映射文件,该文件中配置了操作数据库的SQL语句,需要在 mybatis-config.xml文件中加载才能执行。
- 构建会话工厂SqlSessionFactory。
- 由会话工厂创建SqlSession对象,该对象中包含了执行SQL的所有方法。
- MyBatis底层定义了一个Executor接口来操作数据库,它会根据SqlSession传递的参数动态地生成需要执行的SQL语句,同时负责查询缓存的维护。
- 在Executor接口的执行方法中,包含一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等。Mapper.xml文件中的一个SQL对应一个 MappedStatement对象,SQL的id即是 MappedStatement的id。
- 输入参数映射。
- 输出结果映射。
MyBatis的核心对象
主要涉及两个核心对象:SqlSessionFactory、SqlSession
SqlSessionFactory的主要作用是创建SqlSession。
SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或者定义好的Configuration实例构建出SqlSessionFactory的实例。
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。
通常一个数据库只对应一个SqlSessionFactory。
SqlSession:
它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。SqlSession对象包含了数据库中所有执行SQL操作的方法,由于底层封装了JDBC连接,所以可以直接使用其实例来执行已映射的SQL语句。SqlSession类似于JDBC中的Connection。
每一个线程都应该有一个自己的SqlSession实例,并且该实例是不能被共享的。
SqlSession是线程私有的,因此它不具备线程安全性。
SqlSession实例是线程不安全的。使用完要及时关闭。
SqlSession session = factory.openSession();