mybatis动态sql语句

JAVA ginotang 756℃ 0评论

动态拼装sql

mybatis允许我们根据实际情况进行动态sql语句的拼装。mybatis提供了下面的几个关键字,从而提供强大的sql拼装能力:

  • if
  • choose(when, otherwise)
  • trim(where, set)
  • foreach

if元素

if是最常用的判断语句,常常和test属性一起使用,用于判断条件是否符合要求。例如:如果有传入用户id,则根据此id查询用户,否则查询所有用户。

在StaffMapper接口中添加方法:

测试代码:

这里有个需要注意的地方:selectStaffList方法中的参数类型是Staff,通过Staff来封装id。因为如果直接传入Integer类型或者int类型参数,运行时会抛异常:

Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named ‘id’ in ‘class java.lang.Integer’

如果确实只需要传入Integer/int类型,那么需要更改<select>中的sql语句:

把test属性中的id更改为_parameter。然后就可以简单把参数传进去:

choose、when、otherwise元素

这三个元素类似java中的switch…case…default元素。根据第一条匹配的规则查询数据库。

例如:如果bean中提供了id值,就根据id查询职员名称和职位,如果没有提供id,而提供了职位,就按照职位查询对应的职员id和名称。

测试代码1

下面的代码先测试的是提供id的情况, 虽然bean信息中含有职位信息,但是id匹配了第一个when条件,后面的when条件会自动跳过

控制台打印日志

测试代码2

这一次去掉id信息,只提供职位信息

控制台日志输出

where、trim、set元素

上面的查询语句中出现了奇怪的where 1=1, 实际上,这个语句是为了防止后面的查询语句语法出错的问题。如果去掉了它,那么语法就会变成:

显然这是一个错误的sql语句。

使用where简化where1=1

现在使用where元素去掉where 1=1

测试代码

控制台输出

trim元素

trim的作用和where等价

set元素

set元素一般在update语句的时候可以智能帮我们去掉相关字段的逗号,例如下面的代码:

如果name、gender和id都有值的话,打印出的sql语句如下:

注意gender后面的逗号被自动去掉了。

foreach元素

很明显它是一个集合迭代语句,mybatis可以使用它分解传递进sql的集合参数并重新拼装。

例如,查询谁是公司的CEO和CTO,假设员工和职位之间的关系是一对多。

foreach相关属性解释:

  • collection:传入的参数,这里的list是固定写法,说明参数是一个列表,也可以是array
  • item:循环中的当前元素
  • index:当前元素的下标
  • open和close:解析出来的元素用什么符号括起来,例如这里是()
  • separator:元素分隔符

测试代码

控制台输出日志

上面sql语句中的collection可以使用自定义的值,但需要把参数封装进Map中:

sql就可以这样使用:

 

转载请注明:Pure nonsense » mybatis动态sql语句

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x