序言
MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了。它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的。
MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护和扩展。
动态SQL
动态SQL提供了对SQL语句的灵活操作,通过表达式进行判断,对SQL进行拼接/组装.
if
对查询条件进行判断,如果输入参数不为空才进行查询条件的拼接.
mapper
会自动处理第一个AND(MyBatis还提供了自定义行为的元素,详细可参考MyBatis文档).
UserDAO
selectUser(User user) throws Exception;
Client
由于id与name为null,因此这两个条件不会拼接在SQL中,这一点可以调试时日志中看出.
choose/when/otherwise
有些时候,我们并不想用到所有的条件语句,而只想从中选择一二.针对这种情况,MyBatis提供了元素,他有点像Java中的switch.
set
用于动态更新语句的解决方案为,set元素可以被用于动态包含需要更新的列,而舍去其他的.
WHERE id = #{id};
foreach
使用foreach可以实现向SQL中传递数组或List:
传入List
查询多个id的用户信息,可以由下面两种SQL实现:
因此其foreach的定义也有如下两种方案:
元素 描述
collection SQL解析的参数名
index 循环下标
item 单个元素的名
open 循环开始输出
close 循环结束输出
separator 中间分隔输出
传递List作为parameterType时,SQL解析参数名固定为list.
UserDAO
selectUser(List ids) throws Exception;
批量插入用户案例
mapper
UserDAO
users) throws Exception;
Client
传入数组
mapper
与List类似,传递数组作为parameterType时,SQL解析参数名固定为array.
UserDAO
selectUser(Integer[] ids) throws Exception;
SQL片段
可以将一段公共的SQL语句抽取出来,作为一个SQL片段,供其他SQL调用:
|