MyBatis 是 Java 系的 ORM(Object Relational Mapping) 框架,提供了非常简洁的编程接口。用简单的话来说就是可以将数据库表映射到 Object 中 MyBatis 就是中间辅助处理的框架。
类似于 Python 中的 [[SQLAlchemy]]。
整体架构
分为三层
- 基础支持层
- 核心处理层
- 接口层
基础支持层包含了如下模块
- 反射,封装了原生反射接口
- 类型转换,别名机制,JDBC 类型和 Java 类型装换
- 日志,集成第三方优秀日志框架
- 资源加载,类加载器封装,确定类加载器使用顺序,提供加载类文件和及其他资源文件
- 解析器,对 XPath 封装;处理动态 SQL 语句中占位符
- 数据源,连接池,检测连接状态,自身提供,也提供与第三方数据源集成接口
- 事务,事务接口抽象和实现
- 缓存,一级缓存和二级缓存,运行在同一个 JVM,共享同一块堆内存
- Binding,通过 Binding 模块将用户自定义 Mapper 接口与映射配置文件关联,避免拼写错误
核心处理层包括
- 配置解析,初始化过程中,会加载
mybatis-config.xml
配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中 - SQL 解析和 scripting 模块,动态 SQL 语句
- SQL 执行
- 插件
接口层相对较简单,核心是 SqlSession
接口,接口定义了 MyBatis 暴露给应用程序的 API。
基本使用流程
所以如果要使用 MyBatis 基本有如下几个步骤:
- 开发 Java 类,编写 Mapper 定义 SQL
- 获取 SqlSessionFactory
- 获取 SqlSession
- 面向对象方式操作数据
- 关闭事务,关闭 SqlSession
SqlSession 是 MyBatis 关键对象,持久化操作的对象,类似 JDBC 中 Connection。SqlSession 对象完全包含以数据库为背景的所有执行 SQL 操作的方法,底层封装了 JDBC 连接。每个线程都应该有自己的 SqlSession 实例,SqlSession 实例线程不安全,不能共享,绝对不要将 SqlSession 实例引用放到类静态字段或者实例字段中。使用完 SqlSession 一定关闭。
Mapper 文件
Mapper 文件针对 SQL 文件构建。
select
select 语句用来映射查询语句。
<select id="selectUser" parameterType="int" resultType="hashmap">
SELECT * FROM USER WHERE ID = #{id}
</select>
这个语句被称为 selectUser,接受 int 参数,返回 HashMap 类型。
insert, update, delete
比如
<insert id="insertUser">
insert into USER (id, username, password, email, address)
values (#{id},#{username},#{password},#{email},#{address})
</insert>
sql
sql 元素用来定义可重用的 SQL 代码。
Parameter
如果 parameterType 传入一个对象,那么 #{id}
在查询时会去对象属性查询。
<insert id="insertUser" parameterType="User">
insert into USER (id, username, password, email, address)
values (#{id},#{username},#{password},#{email},#{address})
</insert>
ResultMaps
ResultMaps 元素是 MyBatis 中最重要最强大的元素,告诉 MyBatis 从结果集中取出数据转换成 Java Object。
怎么用
MyBatis 是一个比较大的项目,下面包含了很多子项目,如果看这个项目列表就能够清晰的看到一些
- MyBatis 3 项目自身,提供核心的功能
- Generator 代码生成,是一款 maven 插件,可以快速生成 Mapper 和对应的 Object 实体文件
- mybatis spring 则是和 Spring 的整合,项目列表页上还有和 Spring Boot 的结合 和 Guice 的结合,和 Memcache 的整合等等
Ant 则直接在 classpath 引入 jar 包,Maven 则
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
使用 mybatis-spring 将 MyBatis 无缝嵌入到 Spring 中。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>x.x.x</version>
</dependency>
mybatis generator 作为插件引入:
<project ...>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
</plugin>
...
</plugins>
...
</build>
...
</project>
更多关于 MyBatis Generator 的内容可以参考这里