MyBatis实践之动态SQL及关联查询

前端之家收集整理的这篇文章主要介绍了MyBatis实践之动态SQL及关联查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

序言

MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了。它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的。

MyBatis的一个强大特性之一就是动态sql能力了,能省去我们很多串联判断拼接sql的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护和扩展。

动态sql

动态sql提供了对sql语句的灵活操作,通过表达式进行判断,对sql进行拼接/组装.

if

查询条件进行判断,如果输入参数不为空才进行查询条件的拼接.

mapper

sql;">

自动处理第一个AND(MyBatis还提供了自定义行为的元素,详细可参考MyBatis文档).

UserDAO

sql;"> PHP">List selectUser(User user) throws Exception;

Client

sql;"> PHP">

由于id与name为null,因此这两个条件不会拼接在sql中,这一点可以调试时日志中看出.

choose/when/otherwise

有些时候,我们并不想用到所有的条件语句,而只想从中选择一二.针对这种情况,MyBatis提供了元素,他有点像Java中的switch.

sql;"> PHP">

set

用于动态更新语句的解决方案为,set元素可以被用于动态包含需要更新的列,而舍去其他的.

sql;"> PHP"> WHERE id = #{id};

foreach

使用foreach可以实现向sql中传递数组或List:

传入List

查询多个id的用户信息,可以由下面两种sql实现:

sql;"> PHP">sql">SELECT * FROM user WHERE (id = ? OR id = ? OR id = ?); SELECT * FROM user WHERE id IN (?,?,?);

因此其foreach的定义也有如下两种方案:

sql;"> PHP">sql"> PHP">sql">

元素 描述


collection sql解析的参数名
index 循环下标
item 单个元素的名
open 循环开始输出
close 循环结束输出
separator 中间分隔输出

传递List作为parameterType时,sql解析参数名固定为list.

UserDAO

sql;"> PHP">sql"> selectUser(List ids) throws Exception;

批量插入用户案例

mapper

sql;"> PHP">sql">

UserDAO

sql;"> PHP">sql"> users) throws Exception;

Client

sql;"> PHP">sql">

传入数组

mapper

sql;"> PHP">sql">

与List类似,传递数组作为parameterType时,sql解析参数名固定为array.

UserDAO

sql;"> PHP">sql"> selectUser(Integer[] ids) throws Exception;

sql片段

可以将一段公共的sql语句抽取出来,作为一个sql片段,供其他sql调用:

sql;"> PHP">sql">sql id="user_where"> @H_46_403@@H_175_404@ association: 映射关联查询的单条记录(将关联查询信息映射到PO对象属性).

OrderDAO

sql;"> PHP">sql">

Client

sql;"> PHP">sql">

‘一对多'查询

需求: 查询订单及订单明细的信息(一对多).

PO: 定义OrderDetail,并在Order中添加List orderDetails订单明细属性:

sql;">

mapper

sql;">

OrderDAO

sql;"> PHP">List selectUserItem() throws Exception;

resultMap小结:

使用和可以完成一对一和一对多的高级映射.

association: 将关联查询信息映射到一个PO对象中. collection: 将关联查询信息映射到一个集合中.

延迟加载

关联查询时,使用MyBatis 延迟加载 特性可有效减轻数据库压力.首次查询查询主表信息,等需要时再去查询关联表信息.的/具备延迟加载功能.

需求: 查询订单信息并关联查询用户信息.

延迟加载开关

在MyBatis核心配置文件(mybatis-configuration.xml)中配置:

1) lazyLoadingEnabled : 设置是否懒加载.默认false,则所有关联查询都会被初始化加载.

2) aggressiveLazyLoading : 设置是否积极加载. 默认true,所有关联属性被初始化加载.

Settings配置:

sql;"> PHP">

Mapper

查询订单信息

sql;"> PHP">