数据库
首页 > 数据库> > mybats动态sql

mybats动态sql

作者:互联网

动态SQL

根据特定条件动态拼装SQL的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点

IF标签

根据标签中test属性所对应的表达式来决定标签中的内容,是否拼接到语句中

当if标签不成立,where空了 / and关键字多余了怎么办

1=1恒等式

List<Emp> getEmpDYById(@Param("emp")Emp emp);
    <select id="getEmpDYById" resultType="Emp">
        select * from t_emp where 1=1
        <if test="eid != null and eid !=''">
            and eid = #{eid}
        </if>
        <if test="empName != null and empName !=''">
            and emp_name = #{empName}
        </if>
        <if test="age != null and age !=''">
            and age = #{age}
        </if>
        <if test="sex != null and sex !=''">
            and sex = #{sex}
        </if>
        <if test="email != null and email !=''">
            and eid = #{eid}
        </if>
    </select>

where标签

当where标签中有内容时会生成where关键字,并且将内容多余的 and/or 自动去除,内容的去除不了,当where标签中没有内容时,不会生成where关键字

    <select id="getEmpDYById" resultType="Emp">
        select * from t_emp 
        <where>
            <if test="eid != null and eid !=''">
                eid = #{eid}
            </if>
            <if test="empName != null and empName !=''">
                emp_name = #{empName}
            </if>
            <if test="age != null and age !=''">
                age = #{age}
            </if>
            <if test="sex != null and sex !=''">
                sex = #{sex}
            </if>
            <if test="email != null and email !=''">
                eid = #{eid}
            </if>
        </where>
    </select>

trim标签

若标签中没有内容时,trim标签没有任何效果

若标签中有内容时候:

这里的意思就是 最后生成的sql语句,不管从哪个if语句开始,最前面要加上where,最后一个and/or一定要去除

    <select id="getEmpDYById" resultType="Emp">
        select * from t_emp
        <trim prefix="where" suffixOverrides="and|or">
            <if test="eid != null and eid !=''">
                eid = #{eid} and 
            </if>
            <if test="empName != null and empName !=''">
                emp_name = #{empName} or 
            </if>
            <if test="age != null and age !=''">
                age = #{age} and 
            </if>
            <if test="sex != null and sex !=''">
                sex = #{sex} and 
            </if>
            <if test="email != null and email !=''">
                eid = #{eid} and 
            </if>
        </trim>
    </select>

choose、when、otherwise(类似于if、else if、else)

<choose>
    <when test="">
        ...
    </when>
    <when test="">
        ...
    </when>
    <otherwise>
        ...
    </otherwise>
</choose>

根据标签中test属性所对应的表达式来决定标签中的内容,是否拼接到语句中,when标签至少有一个,otherwise只能有一个

    <select id="getEmpDYById" resultType="Emp">
        select * from t_emp where 1=1
        <choose>
            <when test="eid != null and eid !=''">
                and eid = #{eid}
            </when>
            <when test="empName != null and empName !=''">
                and emp_name = #{empName}
            </when>
            <when test="age != null and age !=''">
                and age = #{age}
            </when>
            <when test="sex != null and sex !=''">
                and sex = #{sex}
            </when>
            <when test="email != null and email !=''">
                and eid = #{eid}
            </when>
        </choose>
    </select>

foreach标签

foreach用于循环一个数组

数组批量删除

int deleteEmpByArray(@Param("eIds")Integer[] eIds)
   <delete id="deleteEmpByArray">
        delete from t_emp where eid in
        <foreach collection="eids" item="eid" separator="," open="(" close=")">
            #{eid}
        </foreach>
    </delete>

list批量添加

int insertEmpByList(@Param("emps")List<Emp> emps)
    <insert id="insertEmpByList">
        insert into t_emp values
        <foreach collection="emps" item="emp" separator=",">
            (null, #{emp.empName}, #{emp.age}, #{emp.sex}, #{emp.email})
        </foreach>
    </insert>

sql / include标签

sqll标签:将常用的一个sql片段进行记录

include标签:将sql标签进行引用

  <sql id="insert">
        (null, #{emp.empName}, #{emp.age}, #{emp.sex}, #{emp.email})
    </sql>
  <!--int insertEmpByList(@Param("emps")List<Emp> emps);-->
    <insert id="insertEmpByList">
        insert into t_emp values
        <foreach collection="emps" item="emp" separator=",">
            <include refid="insert">
        </foreach>
    </insert>

标签:标签,age,sex,emp,sql,mybats,动态,where,eid
来源: https://www.cnblogs.com/phonk/p/16607548.html