• MybatisSQL动态语句


    MyBatis 的动态 SQL 元素与 JSTL 或 XML 文本处理器相似,

    常用 <if>、<choose>、<when>、<otherwise>、<trim>、<where>、<set>、<foreach> 和 <bind> 等元素。

    一、if标签:条件判断

    MyBatis 中 <if> 元素是最常用的元素,它类似于 Java 中的 if 语句。具体过程如下:

    在 com.mybatis 包的 UserMapper.xml 文件中添加如下 SQL 映射语句:

    <!--使用 if 元素根据条件动态查询用户信息-->
    <select id="selectUserByIf" resultType="com.po.MyUser" parameterType="com.po.MyUser">
        select * from user where 1=1
        <if test="uname!=null and uname!=''">
            and uname like concat('%',#{uname},'%')
        </if >
        <if test="usex !=null and usex !=''">
            and usex=#{usex}
        </if >
    </select>

    测试:

    // 使用 if 元素查询用户信息
    MyUser ifmu=new MyUser();
    ifmu.setUname ("张");
    ifmu.setUsex ("女");
    List<MyUser> listByif=userDao.selectUserByIf(ifmu);
    System.out.println ("if元素================");
    for (MyUser myUser:listByif) {
        System.out.println(myUser);
    }

    if 条件判断+where

    <select id="findByConditionWithIf" resultType="com.ykq.entity.Account">
             select * from account
            <where>
                 <if test="name!=null and name!=''">
                     and name like concat('%',#{name},'%')
                 </if>
                 <if test="isdeleted!=null">
                      and isdeleted=#{isdeleted}
                 </if>
            </where>
        </select>

    二、choose+when+otherwise

    有些时候不想用到所有的条件语句,而只想从中择取一二,针对这种情况,MyBatis 提供了 <choose> 元素,它有点像 Java 中的 switch 语句。具体过程如下:

    <!--使用choose、when、otherwise元素根据条件动态查询用户信息-->
    <select id="findByConditionWithChoose" resultType="com.ykq.entity.Account">
        select * from account
      <where>
        <choose>
          <when test="name!=null and name!=''">
            and name like concat('%',#{name},'%')
          </when>
          <when test="isdeleted!=null">
            and isdeleted=#{isdeleted}
          </when>
          <otherwise>
            <![CDATA[and money <1000 ]]>
          </otherwise>
        </choose>
      </where>
    </select>

    三、<trim>元素

    <trim> 元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是 prefix 和 suffix。

    可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是 prefixOverrides 和 suffixOverrides。正因为 <trim> 元素有这样的功能,所以也可以非常简单地利用 <trim> 来代替 <where> 元素的功能。

    <select id="findByConditionWithChoose" resultType="com.ykq.entity.Account">
              select * from account
                     <trim prefix="where" prefixOverrides="or|and" >
                           <choose>
                               <when test="name!=null and name!=''">
                                    and name like concat('%',#{name},'%')
                               </when>
                               <when test="isdeleted!=null">
                                   and isdeleted=#{isdeleted}
                               </when>
                               <otherwise>
                                 <![CDATA[or money <1000 ]]>
                               </otherwise>
                           </choose>
                     </trim>
        </select>

    四、foreach标签

    <foreach> 元素主要用在构建 in 条件中,它可以在 SQL 语句中迭代一个集合。

    <foreach> 元素的属性主要有 item、index、collection、open、separator、close。

    • item 表示集合中每一个元素进行迭代时的别名。
    • index 指定一个名字,用于表示在迭代过程中每次迭代到的位置。
    • open 表示该语句以什么开始。
    • separator 表示在每次进行迭代之间以什么符号作为分隔符。
    • close 表示以什么结束。

    在使用 <foreach> 元素时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

      • 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
      • 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
      • 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。
    <select id="findByConditionWithFor" resultType="com.ykq.entity.Account">
             select * from account
             <where>
                  <if test="ids!=null and ids.length>0">
                      id in
                      <foreach collection="ids" open="(" close=")" separator="," item="id">
                          #{id}
                      </foreach>
                  </if>
             </where>
        </select>
  • 相关阅读:
    【Oracle/PLSQL】没事玩一个简单的表充值程序
    findmnt命令查找已挂载的文件系统
    如何让shell脚本变成可执行文件
    在Linux中如何查看文件的修改日期
    Dutree – Linux上的命令行磁盘使用情况分析工具
    用FRP做内网穿透使用远程桌面连接家里的windows电脑
    Dog-用于DNS查询的命令行工具
    【DeFi】一文读懂预言机原理、类型、现状和发展方向
    Vitalik Buterin 解读 Nathan Schneider 论文:加密经济治理的局限与改进思路
    Vitalik:回顾区块链近 5 年经济学进展,以及新出现的问题
  • 原文地址:https://www.cnblogs.com/axinga/p/14571267.html
Copyright © 2020-2023  润新知