mybatis if else if 条件判断SQL片段表达式取值和拼接 |
您所在的位置:网站首页 › if的判断能判断数组吗 › 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_ID from t_user tu left join t_dept td on tu.DEPT_ID = td.DEPT_ID and 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 u right join t_user_role ur on ur.USER_ID = u.USER_ID, t_role r where r.ROLE_ID = ur.ROLE_ID and u.USER_ID = tu.USER_ID and r.ROLE_ID=#{userParams.roleId}) AND tu.MOBILE =#{userParams.mobile} AND tu.USERNAME like 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片段条件 更详细的条件标签使用参考我这一篇文章点击进入 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}参数中如下例子MySql like 查询: select id,name,... from country name like concat('%', #{name}, '%')上面代码中test的值会使用OGNL计算结果。 例二,通用 like 查询: select id,name,... from country name like #{nameLike}这里的value值会使用OGNL计算。 注:对 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |