• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Mybatis之动态sql标签的使用

mybatis 搞代码 4年前 (2022-01-09) 14次浏览 已收录 0个评论

1.Mybatis动态sql

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

2.常见的动态sql标签

2.1 if

在现实的工作场景中,我们通常需要按照不同的维度对数据进行查询。比如我们
通过员工管理系统要查询一个name 为”Tom”的人,在大一点的公司可能有几个name都为”Tom”的同事并且他们有可能分部在不同的部门,而在小点的公司可能只有一个人根本就不用按部门来过滤,这个时候我们可以通过传参来控制我们的过滤条件如下:

/**
 * @Description employee的dao层代码
 * @Author xiaoqx <[email protected]>
 * @Version V1.0.0
 * @Since 2017/11/26
 */
public interface EmployeeMapper {

 List<Employee> selectEmployeeList(Employee employee);
}
<select id="selectEmployeeList" resultType="com.worldly.config.entity.Employee" databaseId="mysql">
  select
  *
  from t_emp e
  where
   <if test="name!=null and name!=''">
    e.emp_name=#{name,jdbcType=VARCHAR}
   </if>
   <if test="dep!=null">
    and e.emp_dep=#{dep.id,jdbcType=INTEGER}
   </if>
 </select>

配合一个“_databaseId”变量的 databaseIdProvider 可用于动态代码中,这样就可以根据不同的数据库厂商构建特定的语句。比如下面的例子:

<insert id="insert">
 <selectKey keyProperty="id" resultType="int" order="BEFORE">
 <if test="_databaseId == 'oracle'">
  select seq_use<strong style="color:transparent">本文来源gaodai#ma#com搞@@代~&码网^</strong>rs.nextval from dual
 </if>
 <if test="_databaseId == 'db2'">
  select nextval for seq_users from sysibm.sysdummy1"
 </if>
 </selectKey>
 insert into users values (#{id}, #{name})
</insert>

2.2 where

我们可以想象一下如果我们只要按部门编号查询某个部门的同事时,生成的sql 语句会是怎么样的? 很容易得出结论,最终生成的sql 就会如下:


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Mybatis之动态sql标签的使用
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址