MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
MyBatis探究将是一个系列。从这篇文章开始,我将开始探究MyBatis的相关技术,包括:
MyBatis以SqlSessionFactory为中心,SqlSessionFactory的实例通过SqlSessionFactoryBuilder获得。而SqlSessionFactoryBuilder可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。
构建SqlSessionFactory
使用XML方式构建
如下的代码从XML文件中构建SqlSessionFactory:
1 | String resource = "mybatis-config.xml"; |
XML配置文件中包含了对MyBatis系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务作用域和控制方式的事务管理器(TransactionManager)。
XML文件的示例(mybatis-config.xml)如下:
1 |
|
使用代码方式构建
除了使用XML配置的方式创建代码外,也可以使用Java编码来实现,不过这种方法并不推荐,因为这种方式会导致配置与编码耦合,不利于维护。
我们看看之前的XML配置怎么样表述成代码方式:
1 | // 构建数据库连接池 |
可以看到代码配置方式和XML方式没有本质区别。要注意的是,采用这种方式:Mapper类与Mapper的xml映射文件必须防止在同一个package下,否则mybatis会找不到xml映射文件。
相关定义
假设我们的user表的结构如下:
1 | CREATE TABLE `user` ( |
User的POJO定义如下:
1 | public class User implements Serializable { |
映射器UserMapper定义如下:
1 | public interface UserMapper { |
UserMapper的sql映射文件(UserMapper.xml)如下:
1 | <?xml version="1.0" encoding="UTF-8" ?> |
映射器是由Java接口和XML文件(或注解)共同组成的,它的作用如下:
- 定义参数类型
- 描述缓存
- 描述SQL语句
- 定义查询结果和POJO的映射关系
SqlSession
有了上面的定义,我们再来看看如何使用mybatis来查询数据和插入数据:
1 | try (SqlSession session = sqlSessionFactory.openSession()) { |
可以看到,在定义好mapper和sql映射文件之后,mybatis的使用就非常便捷:
- 首先通过SqlSessionFactory获得SqlSession的实例。
- 通过SqlSession获得映射器实例(Mapper)
- 执行映射器实例中的自定义方法
SqlSession接口类似于一个JDBC的Connection接口对象,我们需要保证每次用完正常关闭它。
数据库事务MyBatis是交由SqlSession去控制的,我们可以通过SqlSession提交(commit)或者回滚(rollback)。