Mybatis踩坑第五弹—DynamicSQL

MyBatis 中用于动态SQL的标签包括 if、where 、choose、trim、foreach、bind、sql,下面来分别说明一下。

if 标签可以通过判断传入的值来确定查询条件,其中 test 指定一个OGNL表达式,Mybatis 会根据表达式的值决定是否使用标签体内的查询条件,

但是,在某些情况下,只是用 if 标签会出现 SQL 拼装的问题,比如多出来 and 或者 or,通常有以下几种解决方案:

1、直接在 where 关键字后面加上 1=1,后面的 SQL 统一写成 and xxx(不够优雅)。

2、使用 where 标签,Mybatis 会将 where 标签中多余的第一个 and 或者 or 去掉(相对优雅),但有时也会出现问题,比如在每个 if 标签体的最后写 and

3、Trim 标签可以用于自定义字符串截取规则,Trim 标签体中是整个字符串拼串后的结果,perfix 属性给拼串后的整个字符串加一个前缀,perfixOverrides 属性去掉整个字符串前面多余的字符,suffix 属性给拼串后的整个字符串加一个后缀,suffixOverrides 属性去掉整个字符串后面多余的字符。

Tips:在 XML 文件中书写特殊字符时需要转义为实体名称;OGNL 会自动进行字符串与数字的转化比较

choose 标签实现的是选择分支的功能,类似于 java 中的 switch,主要子标签是 when 和

otherwise。

在更新操作时,可以使用 set 标签,将需要更行的列与赋值放在里面。

同理,foreach 标签的用法类似 java

里面的 foreach 操作,实现的是循环便利;当接口实现类传入的参数是一个集合类时,可以使用 foreach 标签来循环取值,然后赋值给查询条件,可以用于批量操作;在使用 MySQL 时,可以使用一条插入语句 或者 多条插入语句的方式进行批量操作,如果采用多条查询语句的方式,需要设置数据库连接属性 allowMultiQueries=true;如果在接口处不用 @Param 注解设置参数的值,那么集合类参数的值要取 collection 或者 list,反之,则可以设置为注解的 value 值。

Tip:在MySql中,insert、update、delete中不能使用别名,如果有外键约束时,插入或更新不存在的外键值会报错。

bind 标签可以用于将 OGNL 表达式的值绑定到一个变量上,方便后来引用这个变量。

sql 标签用于抽取可重用的 sql 片段,方便 SQL 语句的复用;

1、sql 抽取:经常要查询的列名,或者插入用的列名

2、使用 include 标签来引用已经抽取的 sql

3、还可以使用 include 标签来自定义一些 property 属性

注意:在 sql 标签中只能使用 ${} 取值,不能使用 #{}取值。

Mybatis 中有两个内置参数,分别是 _parameter 和 _databaseId;_parameter 代表接口的参数,如果是单个参数,就指单个参数对象,如果是多个参数,就指多个参数封装的 map 对象;_databaseId 代表当前数据库厂上的别名标识,在配置有多数据库厂商别名 databaseIdProvider 标签时可以用来做鉴别选择。

关注微信公众号:Javall咖啡屋
每天更新各种技术学习心得体会
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章