天天看点

java持久层框架_Java 持久层框架之 MyBatis

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 框架更高的查询效率,能够完成复杂查询。

java持久层框架_Java 持久层框架之 MyBatis

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 许可协议。转载请注明来自 [彭超的博客]!