mybatis 原有mapper.xml的语法标签写法过于繁琐,如下面的
这些写法功能单一还要写很多不必要的代码,于是可用自定义语法代替这类标签,如:
使用自定义标签代替 Mybatis 原有的查询条件相关语法,如:if、forEach 标签,解决原有语法写法太繁琐的问题,且增加了一些参数常用的操作和功能。
1、自定义语法,由于mybatis已经使用了 ${} 和 #{} 标签,所以自定义语法使用 { { }} 和 [ ] 作为标签
2、格式: { {sql [name,key]}} ,如:{ {and code = [code,notEmpty]}} ,本语句的意思:条件 code = ? 在参数code不为空且不为空字符串的条件下生效,比如 code=2 时,生成条件 code = 2。参数名称必须放在第一个位置,关键字可为空。
3、参数说明:以上格式中的 sql 代表一般的sql语句,[ ] 中的 name 代表参数名称,key 代表关键字。
4、关键字类型: notNull 、 notEmpty 、 notBlank 、 trim 、 upper 、 lower 、 list 、 like 、 llike 、 rlike 、 const 、 hidden 、 default
5、其中 list 、 like 、 llike 、 rlike 、 const 、hidden 为参数类型关键字,notNull 、 notEmpty 、 notBlank 为参数条件类型关键字, trim 、 upper 、 lower 为参数特殊处理关键字。
6、语法标签中所有参数值用英文逗号,分隔,关键字严格区分大小写,除了参数类型关键字,其它关键字可组合使用。
7、参数类型关键字必须放在第二个位置,且一个参数只能是其中一种参数类型,同一个参数不能同时是两个或多个参数类型。
8、条件类型和特殊处理类型关键字可组合使用,且位置不固定,可随意搭配。当参数没有参数类型关键字时,条件类型和特殊处理类型关键字可放在第二个位置。
9、参数名称最多可以为三级名称,即:code 、user.code、user.dept.code,名称层级取决于入参类型。当mapper接口的参数为单个对象参数,如:Map、User等,参数名可直接使用 id、code、name等。当参数为两个及以上,需要使用 @Param 定义参数名称,如:func(@Param("user") User user, @Param("map") Map map),则参数名称需要为:user.id, user.name, map.code 等。
default
本关键字用于为参数设置默认值,当参数不满足指定条件时,使用默认值生成sql语句。如:{ {and type = [type,default,1]}},当参数 type 为 null(空) 时,使用默认值生成语句:and type = 1。当参数 type 的值为 2时,生成语句:and type = 2。
注意:默认值关键字 default 后面必须跟一个长度不为0的默认值,否则该关键字不生效。而且default 关键字和默认值必须放在标签最后面。
notNull
本关键字用于声明该参数不能为空,即该参数必填,否则会报参数为空异常。如:{ {and code = [code,notNull]}},当参数code为空(null)时,报异常:参数[code]不能为空。但空字符串""不会触发本条件,如需过滤空字符串,则需要与下面两个关键字组合使用。
注意:notNull 和 default 在逻辑上是有冲突的,所以当设置了默认值default,则本关键字会失效。
notEmpty
本关键字用于声明该参数不能为空且长度不能为0,即:str != null && str.length() != 0。且本关键字主要用于字符串参数。如:{ {code = [code,notEmpty]}},当参数code为null或字符串""时,条件不生效。
关键字组合:{ {and code = [code,notNull,notEmpty]}},即参数code必填且不能为空字符串。
notBlank
本关键字与 notEmpty 的区别就是多了一个 trim 操作,即:str != null && str.trim().length() != 0。且本关键字主要用于字符串参数。
notBlank 的功能包含了 notEmpty,所以这两个关键字只需要存在一个即可。
trim
本关键字也是作用于字符串参数,用于自动 trim 字符串前后空格。如:{ {and code = [code,trim]}},当参数code=" a "时,生成语句:and code = 'a'。
关键字组合:{ {and code = [code,notNull,notBlank,trim]}}
upper
本关键字的作用即自动将参数转换为大写,如参数 code = 'abc' 自动转换成 code = 'ABC'。
关键字组合:{ {and upper(code) = [code,notNull,notBlank,trim,upper]}}
lower
本关键字即把参数自动转换成小写,与 upper 的作用相同。
like、llike、rlike
参数类型关键字:即模糊查询,自动给参数加上 % 符号。分别对应:'%value%'、'%value'、'value%'。如:{ {and name like [name,like,trim,notEmpty]}}。当参数 name = ' 张三 '时,生成语句:and name like '%张三%'。
注意:所有参数类型关键字需要放在标签 [ ] 中的第二个位置,第一个位置是参数名称。
list
参数类型关键字:本参数作用于 in 查询条件,参数必须是 Controller> 类的子类,如 List、ArrayList等。语法:{ {and id in ([ids,list])}}。当参数 ids = [1,2,3] 时,生成语句:and id in (1,2,3)。
注意:list 类型的参数,当参数 ids == null || ids.size() == 0 时,条件都不会生效。
关键字组合:
1、default 当 list 与 default 组合使用时,设置默认值需要用 | 代替 , 号,如需要默认值 1,2,3,需要填写成 1|2|3。即:{ {and id in (ids,list,default,1|2|3)}}
2、notEmpty、notBlank、trim、upper、lower 当 list 与 以上五个关键字组合使用时,以上五个关键字都是作用于 list 中的元素而不是list本身。如:{ {and id in ([ids,trim,notBlank,upper])}},当参数ids=['a',