MyBatis

MyBatis
黄文胜回顾 JDBC开发
- 优点:简单易学,上手快, 非常灵活构建SQL,效率高
- 缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等)。开发者既要写业务逻辑,又要管理对象的创建和销毁,同时必须关注底层数据库的语法。
- 适合超大批量数据操作,速度快
性能比较:jdbc
> mybatis
> hibernate
> jpa
什么是 MyBatis,有什么特点
- MyBatis 结合了 JDBC 和 ORM 的优点,避免了各自的缺点,因此被广泛应用于企业中。
- MyBatis 的前身是 iBatis,原为 Apache 的开源项目,2010年迁移至 Google,并改名为 MyBatis。2013年移至 GitHub。
- iBATIS 一词来源于“internet”和“abatis”的组合,是基于 Java 的持久层框架,提供了 SQL Maps 和 DAO。
- 常见的持久层技术:
- JDBC/Dbutils/springDAO
- ORM框架:包括 MyBatis、Hibernate、JPA 等
1. 准备 Maven pom.xml
在 IntelliJ IDEA 中配置 pom.xml
引入类库:
1 | <properties> |
2. 创建 POJO 实体类
使用 @Data
注解自动生成 getter、setter 和 toString
方法。
1 | // lombok类库 生成getter, setter, toString |
3. 创建 mybatis-config.xml
配置文件
在 src/main/resources
目录下新建 mybatis-config.xml
文件。此文件包含 MyBatis 的核心配置,包括数据库连接、SQL Mapper 映射文件等。
- 配置相关属性(可选):引入数据库连接信息。
- 配置连接池环境:设定数据库连接和事务管理。
- 注册 SQL Mapper 映射文件:定义 SQL Mapper 映射的 XML 文件。
mybatis-config.xml
配置示例
1 |
|
jdbc.properties
1 | jdbc.driver=com.mysql.cj.jdbc.Driver |
<typeAliases>
类型别名
<typeAliases>
用于为 Java 类型设置简短的名字,帮助减少类的完全限定名,提升 XML 配置的可读性。
1 | <typeAliases> |
<settings>
特性配置
<settings>
配置包含 MyBatis 中的一些重要调整选项,可以影响 MyBatis 的运行时行为。
1 | <settings> |
logImpl
:指定日志的实现方式,LOG4J
表示使用 Log4j 日志框架。
cacheEnabled
:全局二级缓存开关,true
表示启用二级缓存。此设置使映射器默认支持二级缓存。
4. 创建 SqlSessionFactory
使用 SqlSessionFactory
通过加载核心配置文件来创建实例。
1 | public static void main(String[] args) { |
5. 编写 SQL 映射文件
MyBatis 使用 XML 文件编写 SQL 映射配置。以下是常用的 SQL 语句元素和动态 SQL 元素。
SQL 语句元素
<select>
:查询语句<insert>
:插入语句<update>
:更新语句<delete>
:删除语句
动态 SQL 元素
<where>
:用于生成动态WHERE
子句<if>
:条件判断<choose>
:分支结构<trim>
:灵活地处理 SQL 语句中的逗号等<foreach>
:循环处理<bind>
:绑定变量
<mapper>
根元素
<mapper>
的 namespace
通常是接口映射的全类名。在同一命名空间内,SQL 语句的 id
必须唯一。
<mapper>
配置示例
1 |
|
<select>
与 <where>
元素
<select>
用来编写 SELECT
语句,而 <where>
用于生成 WHERE
关键字,并自动添加必要的逻辑操作符。
<select>
配置示例
1 | <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap"> |
id
:定义该查询语句的唯一标识符。parameterType
:指定传入参数的 Java 类型。resultMap
:引用结果映射,定义如何将查询结果映射到 Java 对象。
<resultMap>
结果映射元素
<resultMap>
用于将查询结果集映射到实体类的属性中,以确保数据库字段与 Java 对象属性之间的正确对应关系。
<resultMap>
配置示例
1 | <resultMap id="BaseResultMap" type="com.lanqiao.domain.Employee"> |
id
:定义resultMap
的唯一标识符,用于在<select>
等元素中引用。type
:指定映射的目标 Java 类型(即结果映射的实体类)。:映射主键字段。 property
:实体类中的属性名。column
:数据库表中的列名。jdbcType
:指定该列的 JDBC 类型。
<result>
:用于映射普通字段,property
和column
属性类似于<id>
标签。
此示例将 empno
和 ename
列映射到 Employee
类中的对应属性。
<association>
多对一、一对一关联映射
<association>
用于映射实体类中的多对一或一对一关系,通常用于定义一个实体类包含另一个关联实体类的情况(如一个员工属于一个部门)。
<association>
配置示例
1 | <resultMap id="baseResultMap" type="Employee"> |
property
:在父类(Employee
)中表示关联对象的属性名(这里是dept
)。javaType
:关联对象的 Java 类型(如Department
)。<id>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
:用于映射关联对象的主键字段。
- `property`:关联对象(`Department`)中的主键属性名。
- `column`:数据库中关联对象的主键列名。
- `<result>`:用于映射关联对象中的其他字段。
在此示例中,`Employee` 类包含一个 `Department` 对象,关系通过 `dept` 属性表示,其中 `deptno` 和 `dname` 分别映射到 `Department` 类的属性。
## `<collection>` 一对多关联映射
`<collection>` 用于映射实体类中的一对多关系,适合映射一个实体类包含多个关联实体类的情况。例如,一个部门包含多个员工。
### `<collection>` 配置示例
```xml
<resultMap id="baseResultMap" type="department">
<collection property="employeeList" ofType="employee" column="deptno"
resultMap="com.lanqiao.mapper.EmployeeMapper.baseResultMap">
</collection>
</resultMap>property
:在父类(Department
)中表示关联集合的属性名(此处为employeeList
)。ofType
:集合中每个元素的 Java 类型(如Employee
类)。column
:用于关联的数据库列名(此处为deptno
,表示员工表中的外键)。resultMap
:指定关联的resultMap
配置,用于映射集合中的每个元素(如Employee
对象)。
在此示例中,Department
类包含一个 employeeList
集合属性,关联多个 Employee
对象,通过 deptno
列进行一对多映射。
<sql>
通用 SQL 片段
<sql>
元素用于定义可复用的 SQL 片段,使得在多条 SQL 语句中可以共享相同的片段,避免重复代码。
<sql>
配置示例
1 | <sql id="Base_Column_List"> |
可以在其他 SQL 语句中通过 <include>
元素来引用这个通用 SQL 片段:
<if>
元素
<if>
元素用于根据条件判断来动态生成 SQL 语句的一部分。在运行时,只有满足条件的 SQL 片段才会被加入到最终生成的 SQL 中。
<if>
配置示例<if>
1 | <where> |
test
:条件表达式,只有当条件为真时,<if>
中的 SQL 片段才会被包含在最终生成的 SQL 语句中。
在此示例中,<where>
会动态生成 WHERE
子句,包含根据条件加入的 ENAME
和 JOB
字段的过滤条件。