Mybatis MySql 动态SQL 语句

动态SQL语句

如果没设置条件,一定不用在 sql 语句中设置

where

使用在查询的时候,

where 是添加 where 关键字删除多余的and

使用 if 进行判断,test = "判断的条件"

    <select id="getEmpByParam" parameterType="lyy.bean.Emp" resultType="lyy.bean.Emp">
      SELECT
          `eid`,
          `ename`,
          `age`,
          `sex`,
          `did`
      FROM
      `emp`
       <where>
           <if test=" eid != null">
              AND `eid` = #{eid}
           </if>
           <if test=" ename != null and ename != ''">
              AND `ename` = #{ename}
           </if>
           <if test=" age != null and age != ''">
              AND `age` = #{age}
           </if>
           <if test=" sex == '1' or sex == '0'">
              AND `sex` = #{sex}
           </if>
       </where>
   </select>

trim

trim : 截取并拼接
- prefix : 在操作的sql语句前加入某一些内容
- suffix : 在操作的sql语句后加入某一些内容
- prefixOverrides : 把操作的sql语句前的某些内容去掉
- suffixOverrides = and|or : 把操作的sql语句后的某些内容去掉,(and|or)去掉and或者or
<select id="getEmpByParamOne" parameterType="lyy.bean.Emp" resultType="lyy.bean.Emp">
      SELECT
          `eid`,
          `ename`,
          `age`,
          `sex`,
          `did`
      FROM
          `emp`
       <trim prefix="where" suffix="" prefixOverrides="" suffixOverrides="and|or">
           <!-- 使用 if 进行判断,test = "判断的条件" -->
           <if test=" eid != null">
              `eid` = #{eid} AND
           </if>
           <if test=" ename != null and ename != ''">
              `ename` = #{ename} AND
           </if>
           <if test=" age != null and age != ''">
              `age` = #{age} AND
           </if>
           <!-- 判断值是否相等必须使用数值 -->
           <if test=" sex == '1' or sex == '0'">
              `sex` = #{sex} AND
           </if>
       </trim>
   </select>

Set

主要解决修改sql语句中多出现的逗号问题

<update id="updateEmp">
      UPDATE
          `emp`
       <set>
           <if test="">

           </if>
       </set>
      WHERE
          1
   </update>

Choose(when、otherwise)

主要是用于分支判断,类似于 java 中的 seitch case 只会满足所有分支中的一个,可用根据某一个已有的条件进行查询

<select id="getEmpByParam" parameterType="lyy.bean.Emp" resultType="lyy.bean.Emp">
      SELECT
          `eid`,
          `ename`,
          `age`,
          `sex`,
          `did`
      FROM
      `emp`
       <where>
           <choose>
          <when test="id != null">
              id = #{id}
               </when>
              .
              .
              .
               <!-- 都不满足的执行 -->
               <otherwise>
              .....
               </otherwise>
           </choose>
       </where>
   </select>

如果不使用 foreach 进行批量删除

拼接之后: DELETE FROM emp WHERE eid IN ('11,13,14') 运行结果: 只会删除 eid = 11 这条数据 如果使用该方式进行批量删除必须使用 DELETE FROM emp WHERE eid IN (${value})

    <delete id="deleteMoreEmp">
      DELETE FROM `emp` WHERE `eid` IN (#{value})
   </delete>

foreach

主要用于循环迭代

foreach:
              - collection:指定要遍历的集合或数组,如果不使用@Param那么如果传入的参数是List那么key值就为list,如果传入的参数为 Array 那么key值为array
              - item:设置元素的别名
              - close:设置循环体的结束内容
              - open:设置循环体的开始内容
              - separator:每一次循环之间的分隔符
              - index:
                  - 若遍历的是list集合,遍历的是下标
                  - 容遍历的是map集合,遍历的是key值
    <delete id="deleteMoreByList">
      DELETE FROM `emp` WHERE `eid` IN
       <foreach collection="list" item="eid" separator=",">
          #{eid}
       </foreach>
   </delete>

执行结果的SQL语句:DELETE FROM emp WHERE eid IN ( ? , ? , ? )

批量删除

  • delete(删除):

    • delete from emp where id in ();

    • delete from emp where id = 1 or id = 2 or id = 3

  • select(查询):

    • 和 delete 写法相同

  • update(更新):

    • 预编译对象只可以有1条 SQL 语句

    • 在连接的数据库的 url 加上 allowMultiQueries=true

    • 写法

      • <update id="updateMoreByArray">
           <foreach collection="emps" item="emp" separator=";">
              UPDATE emp SET ename = #{emp.ename},age = #{emp.age},sex = #{sex} WHERE eid = #{emp.eid}
           </foreach>
        </update>
  • insert(添加)

    • insert into emp values(),(),()

    • 写法

      • <!--
           Integer addEmpByArray(@Param("empList") Emp[] emps);
        -->
        <insert id="addEmpByArray">
          INSERT INTO `emp`( `ename`, `age`, `sex`) VALUES
           <foreach collection="empList" item="emp" separator=",">
              (#{emp.ename},#{emp.age},#{emp.sex})
           </foreach>
        </insert>

SQL 标签

用于设置一段 sql 片段,即公共 sql 可以被当前映射文件所有的 sql 语句访问

设置公共片段

<sql id="key">
      SELECT
          `eid`,
          `ename`,
          `age`,
          `sex`,
          `did`
      FROM
          `emp`
   </sql>

使用公共片段

    <select id="getEmpByParam" resultType="lyy.bean.Emp">
       <!--访问某个 SQL 片段 -->
       <include refid="key"></include>
   </select>



上一篇:练习oracle第一天emp表的习题练习


下一篇:18.MySQL中的LIKE(模糊查询) 和 NOT LIKE