ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mybatis MySql 动态SQL 语句

2020-08-21 15:32:36  阅读:333  来源: 互联网

标签:ename age SQL sex emp sql MySql Mybatis eid


动态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>



标签:ename,age,SQL,sex,emp,sql,MySql,Mybatis,eid
来源: https://www.cnblogs.com/luoyunyan/p/13541295.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有