关于mybatis|关于mybatis if else if 条件判断SQL片段表达式取值和拼接问题
前言
最近在开发项目的时候涉及到复杂的动态条件查询,但是mybaits
本身不支持if elseif
类似的判断但是我们可以间接通过 chose when otherwise
去实现其中choose
为一个整体 when
是if otherwise
是else
快速使用
以前我们进行条件判断时候使用if
标签进行判断,条件并列存在
AND seat_no = #{seat_no}
现在 使用
chose when otherwise
条件只要有一个成立,其他的就不会再判断了。如果没有成立的条件则默认执行otherwise
中的内容…… ……
以下是我自己真实使用的例子,并且经过了测试,仅供参考:
根据动态条件筛选查询用户信息
select tu.USER_ID,tu.USERNAME,tu.SSEX,td.DEPT_NAME,tu.MOBILE,tu.EMAIL,tu.STATUS,tu.CREATE_TIME,td.DEPT_IDfrom t_user tu left join t_dept td on tu.DEPT_ID = td.DEPT_IDand tu.ADMIN_TYPE_ID in(2,3) and tu.ADMIN_TYPE_ID in(0,1) and tu.ADMIN_TYPE_ID=#{userParams.adminType} and (select group_concat(ur.ROLE_ID)from t_user uright join t_user_role ur on ur.USER_ID = u.USER_ID,t_role rwhere r.ROLE_ID = ur.ROLE_IDand u.USER_ID = tu.USER_ID and r.ROLE_ID=#{userParams.roleId}) AND tu.MOBILE =#{userParams.mobile} AND tu.USERNAMElike CONCAT('%',#{userParams.username},'%') AND tu.SSEX=#{userParams.ssex} AND tu.STATUS =#{userParams.status} AND td.DEPT_ID =#{userParams.deptId} AND DATE_FORMAT(tu.CREATE_TIME,'%Y%m%d') BETWEEN substring_index(#{userParams.createTime},'#',1) and substring_index(#{userParams.createTime},'#',-1)
这里就用到啦
if else if
判断。 choose
标签中when
条件一但不成立,就会执行otherwise
标签中的条件,判断语句,也就是我下面包含的sql片段条件【关于mybatis|关于mybatis if else if 条件判断SQL片段表达式取值和拼接问题】更详细的条件标签使用参考我这一篇文章点击进入
SQL片段拼接 我们再写sql语句的时候往往会有这样一些要求,一些重复的sql语句片段,我们不想重复去写,那么可以通过sql片段方式去抽离,公共sql然后在需要的地方去引用
MyBatis
中
元素用于定义一个 SQL
片段,用于分离一些公共的 SQL 语句,例如:SELECT
关键字和 WHERE
关键字之间的部分。其中:id
:唯一标识符,用于在其他地方使用
标签引用;lang:
设置字符编码;databaseId
:指定执行该 SQL 语句的数据库ID,数据库ID在 mybatis-cfg.xml 中的 中配置。同时,你也能够看见
标签中可以使用、、、、、、、
等标签定义复杂的 SQL 片段简单使用定义sql片段如下:
`user_id`, `name`, `sex`, `age`
在
标签中使用
标签引入定义的sql片段,如下:`user_id`, `name`, `sex`, `age`
场景使用案例如:查询用户信息
`user_id`, `name`, `sex`, `age` select from `user`
SQL参数取值和OGNL表达式 看到我们上面去值参数通过
#{params}
这种方式来去值的其中传进来的参数 #{xx} 就是使用的 OGNL
表达式。Mybatis 官方文档中「XML 映射文件」模块里边,有解析到:
说当我们使用 #{} 类型参数符号的时候,其实就是告诉 Mybatis 创建一个预处理语句参数,通过 JDBC,这样的一个参数在 SQL 中会由一个 "?" 来标识,并传递到一个新的预处理语句中。
文章图片
也就是说当我们使用 #{XX} OGNL 表达式的时候, 它会先帮我们生成一条带占位符的 SQL 语句,然后在底层帮我们设置这个参数:ps.setInt(1, id);
OGNL 是 Object-Graph Navigation Language 的缩写,对象-图行导航语言,语法为:#{ }。
是不是有点懵,不知道这是个啥?
OGNL 作用是在对象和视图之间做数据的交互,可以存取对象的属性和调用对象的方法,通过表达式可以迭代出整个对象的结构图
MyBatis常用OGNL表达式如下:
文章图片
上述内容只是合适在MyBatis中使用的OGNL表达式,完整的表达式点击这里。
MyBatis中可以使用OGNL的地方有两处:
- 动态
SQL
表达式中 ${param}
参数中
select id,name,... from countryname like concat('%', #{name}, '%')
上面代码中test的值会使用OGNL计算结果。
例二,通用 like 查询:
select id,name,... from countryname like #{nameLike}
这里 的value值会使用OGNL计算。
注:对在通用Mapper中支持一种UUID的主键,在通用Mapper中的实现就是使用了 标签,这个标签调用了一个静态方法,大概方法如下:
这种方式虽然能自动调用静态方法,但是没法回写对应的属性值,因此使用时需要注意。
${params}
中的参数上面like的例子中使用下面这种方式最简单
select id,name,... from countryname like '${'%' + name + '%'}'
这里注意写的是
${'%' + name + '%'},
而不是%${name}%,
这两种方式的结果一样,但是处理过程不一样。在
MyBatis
中处理${}
的时候,只是使用OGNL
计算这个结果值,然后替换SQL中对应的${xxx}
,OGNL处理的只是${这里的表达式}。
这里表达式可以是OGNL支持的所有表达式,可以写的很复杂,可以调用静态方法返回值,也可以调用静态的属性值。
例子,条件判断入参属性值是否包含子字符串可以直接使用
contains
判断find_in_set(#{item.value},base.${item.cname}) DATE_FORMAT(base.${item.cname},'%Y-%m-%d') = DATE_FORMAT(#{item.value},'%Y-%m-%d') base.${item.cname} = #{item.value}
到此这篇关于mybatis if else if 条件判断SQL片段表达式取值和拼接的文章就介绍到这了,更多相关mybatis if else if 条件判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- mybatisplus如何在xml的连表查询中使用queryWrapper
- mybatisplus|mybatisplus where QueryWrapper加括号嵌套查询方式
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 四首关于旅行记忆的外文歌曲
- 醒不来的梦
- 关于自我为中心的一点感想
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 关于Ruby的杂想