MyBatis 简介
MyBatis 是一个基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需关注 SQL 语句本身,而不用再花费精力去处理诸如注册驱动、创建 Connection、配置 Statement 等繁杂过程。
Mybatis 通过 xml 或注解的方式将要执行的各种 Statement、PreparedStatement 等配置起来,并通过 Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射成 Java 对象并返回。
MyBatis 与 Hibernate
Hibernate 框架是提供了全面的数据库封装机制的 全自动 ORM,即实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行。
相对于此,MyBatis 只能算作是 半自动 ORM。其着力点,是在 POJO 类与 SQL 语句之间的映射关系。也就是说,MyBatis 并不会为程序员自动生成 SQL 语句。具体的 SQL 需要程序员自己编写,然后通过 SQL 语句映射文件,将 SQL 所需的参数,以及返回的结果字段映射到指定 POJO。
MyBatis 特点
在 XML 文件中配置 SQL 语句,实现了 SQL 语句与代码的分离,给程序的维护带来了很大便利。
可以结合数据库自身的特点灵活控制 SQL 语句,因此能够实现比 Hibernate 等全自动 ORM 框架更高的查询效率,能够完成复杂查询。
Spring 整合 Mybatis
引入依赖
在 pom.xml 引入 Mybatis 相关依赖。
org.mybatismybatis3.2.8org.mybatismybatis-spring1.3.1org.springframeworkspring-jdbc4.3.17.RELEASE
创建 Mybatis 配置文件
在 resource 目录下创建 mybatis-config 配置文件。
<?xml version="1.0" encoding="UTF-8"?>
创建集成配置文件
在 resource 目录下创建一个 spring-context-mybatis.xml 的集成配置文件。
<?xml version="1.0" encoding="UTF-8"?>
CRUD 案例
新增
INSERT INTO tb_user (
id,
username,
password,
phone,
email,
created,
updated
)
VALUES
(
#{id},
#{username},
#{password},
#{phone},
#{email},
#{created},
#{update}
)
删除
DELETE FROM tb_user WHERE id = #{id}
查询
SELECT
a.id,
a.username,
a.password,
a.phone,
a.email,
a.created,
a.updated AS "update"
FROM
tb_user AS a
WHERE
a.id = #{id}
更新
UPDATE
tb_user
SET
username = #{username},
password = #{password},
phone = #{phone},
email = #{email},
created = #{created},
updated = #{update}
WHERE id = #{id}
MyBatis 动态 SQL
动态 SQL 主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查询条件进行查询。**提交的查询条件不同,执行的 SQL 语句不同。**若将每种可能的情况均逐一列出,对所有条件进行排列组合,将会出现大量的 SQL 语句。此时,可使用动态 SQL 来解决这样的问题。这里的条件判断使用的表达式为 OGNL 表达式。常用的动态 SQL 标签有 、、、 等。
**注意:**在 mapper 的动态 SQL 中若出现 >、<、>=,<= 等符号,最好将其转换为实体符号。否则,XML 可能会出现解析出错问题,特别是 < 在 XML 中是绝对不能出现的。
if 标签
对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片断拼接到其所在的 SQL 语句中。
案例
为了解决两个条件均未做设定的情况,在 where 后添加了一个“1=1”的条件。这样就不至于两个条件均未设定而出现只剩下一个 where,而没有任何可拼接的条件的不完整 SQL 语句。
<?xml version="1.0" encoding="UTF-8" ?>
SELECT
*
FROM
student
WHERE 1 = 1
AND name LIKE concat('%', #{name}, '%')
AND age > #{age}
where 标签
标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 1=1 的子句。因为,若 where 后的所有 条件均为 false,而 where 后若又没有 1=1 子句,则 SQL 中就会只剩下一个空的 where,SQL 出错。所以,在 where 后,需要添加永为真子句 1=1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。
案例
SELECT
*
FROM
student
AND name LIKE concat('%', #{name}, '%')
AND age > #{age}
choose 标签
该标签中只可以包含 、,可以包含多个 与一个。它们联合使用,完成 Java 中的开关语句 switch case 功能。
案例
本例要完成的需求是,若姓名不空,则按照姓名查询;若姓名为空,则按照年龄查询;若没有查询条件,则没有查询结果。
SELECT
*
FROM
student
AND name LIKE concat('%', #{name}, '%')
AND age > #{age}
AND 1 != 1
foreach 标签
该标签用于实现对于数组与集合的遍历。对其使用,需要注意:collection 表示要遍历的集合类型,这里是数组,即 array。open、close、separator 为对遍历内容的 SQL 拼接。
遍历数组案例
SELECT
*
FROM
student
WHERE id IN
#{id}
遍历泛型为基本类型的集合案例
public List selectByForeachWithListBase(List ids);
SELECT
*
FROM
student
WHERE id IN
#{id}
遍历泛型为自定义类型的集合案例
public List selectByForeachWithListCustom(List students);
SELECT
*
FROM
student
WHERE id IN
#{student.id}
sql 标签
该标签用于定义 SQL 片断,以便其它 SQL 标签复用。而其它标签使用该 SQL 片断, 需要使用 子标签。该标签可以定义 SQL 语句中的任何部分,所以 子标签可以放在动态 SQL 的任何位置。
案例
SELECT
id,
name,
age,
score
FROM
student
使用 sql 标签
文章作者:彭超
本文首发于个人博客:antoniopeng.com
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 [彭超的博客]!