logo头像

学如逆水行舟,不进则退!!!

文章目录

mybatis精讲(七)--动态sql

本文于416天之前发表,文中内容可能已经过时。

[TOC]

在我们传统的开发中我们会通过拼接sql达到数据库的操作。java中的拼接不仅效率低下而且代码很长不易维护。而Mybatis通过代理模式实现SQL语句的组装。简洁易懂。

常用标签

元素 作用 备注
if 判断语句 条件分支
choose switch 多条件分支
trim 去除空字符 特殊处理
foreach 集合循环 遍历

if元素

  • if元素是常用的语句,常常在where内部和test结合使用。
  • 在大部分if使用简单。比如我们在查询的时候就可以动态添加name字段。

<select id="selectUser">
    select id,name,user_sex from User
    <where>
        <if test="name!=null and name!=''">
            and name like concat('%',concat(#{name},'%'))
        </if>
    </where>
</select>
  • 上面的sql实现的效果就是如果方法中传递了name参数则以name为条件查询数据。如果没有传递name 则是全表查询数据

choose元素

  • choose类似于java中的switch。类似的标签还有when 、 otherwise元素

<select id="selectUser">

    select id , name , user_sex from User
    <where>
        <choose>
            <when test="name!=null and name!=''">
                and name like concat('%',concat(#{name},'%'))
            </when>
            <when test="id!=null and id!=''">
                and id=#{id}
            </when>
            <otherwise>
                and user_sex=#{userSex}
            </otherwise>
        </choose>
    </where>

</select>

trim元素

  • 上面我们已经使用了一个特殊标签 where . 这个标签加上就是产生条件语句的。如果没有条件语句name这个where 就没有。
  • 关于trim 标签也可以实现类似where的作用。

<select id="selectUser">
    select id , name , user_sex from User
    <trim prefix="where" prefixOverrides="and">  
        <if test="name!=null and name!=''">
            and name like concat('%',concat(#{name},'%'))
        </if>
    </trim>
</select>
  • trim元素就意味着我们需要去掉一些特殊字符串。prefix代表的语句的前缀。而prefexOverrides代表的是你需要去掉的字符串。上面的写法基本与where是等效的。update中使用set也是和trim是等效的。

forearch

  • forearch元素就是一个集合遍历。在我们开发中也是常用的一种数据

<select id="selectUser">

    select * from User where user_sex in
    <forearch item="sex" index="index" collection="sexList" open="(" close="}" separator=",">
        #{sex}
    </forearch>

</select>
  • collection 配置的sexList是传递过来的集合
  • item配置的是循环中当前元素
  • index 配置的当前元素在集合中下标
  • open 和 close 配置的是已什么符号将这些元素包装起来
  • separator 是各个元素的间隔符

bind元素

  • bind元素的作用是通过OGNL表达式自定义一个上下文变量。这样更方便我们使用。在我们进行模糊查询的时候,如果是Mysql数据库,我们常常用到的是一个concat用”%”和参数连接。然而Oracle数据库则是用连接符号”||”,这样SQL就需要提供两种形式实现。但是有了bind元素,我们就完全不必使用数据库语言。只需要使用Mybaits语法了。

<select id="selectUser">

    <bind name="pattern" value="'%'+_parameter+'%'"/>
    select id , name , user_sex from User
    where name like #{pattern}
</select>
  • 上面的_parameter代表的就是传递进来的参数,他和通配符连接后,赋给了pattern。我们就可以在select语句中使用这个变量进行模糊查询了。不管是Mysql还是Oracle数据库都可以使用这样进行查询。
上一篇
坚持原创技术分享,您的支持将鼓励我继续创作!

评论系统未开启,无法评论!