day114- 动态sql

发布时间 2023-06-29 20:59:53作者: 北海之上

动态SQL

解决拼接SQL语句字符串时的问题。

if标签

if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行

<!--  List<Emp> getEmpByCondition(Emp emp);  -->
<select id="getEmpByCondition" resultType="com.gu.mybatis.pojo.Emp">
    select <include refid="empColumns"></include> from t_emp where
    <if test="empName != null and empName != ''">
        emp_name = #{empName}
    </if>
    <if test="age != null and age != ''">
        and age =#{age}
    </if>
    <if test="gender != null and gender != ''">
        and gender =#{gender}
    </if>
    </select>

 

where标签

where和if一般结合使用:

a> 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字

b> 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and去掉

注意:where标签不能去掉条件最后多余的and

<!--  List<Emp> getEmpByWhere(Emp emp);  -->
<select id="getEmpByWhere" resultType="com.gu.mybatis.pojo.Emp">
    select * from t_emp
    <where>
        <if test="empName != null and empName != ''">
            emp_name = #{empName}
        </if>
        <if test="age != null and age != ''">
            and age =#{age}
        </if>
        <if test="gender != null and gender != ''">
            and gender =#{gender}
        </if>
    </where>
    </select>
        a. 若where标签中有条件成立,会自动生成where关键字。
        b. 会自动将where中内容前多余的and去掉,但内容后多余的and无法去掉
        c. 若where标签中没有任何一个条件成立,则where没有任何功能

 

trim标签

trim用于去掉或添加标签中的内容

常用属性:

prefix:在trim标签中的内容的前面添加某些内容

prefixOverrides:在trim标签中的内容的前面去掉某些内容

suffix:在trim标签中的内容的后面添加某些内容

suffixOverrides:在trim标签中的内容的后面去掉某些内容

<!--  List<Emp> getEmpByTrim(Emp emp);  -->
<select id="getEmpByTrim" resultType="com.gu.mybatis.pojo.Emp">
    select * from t_emp
    <trim prefix="where" suffixOverrides="and">
        <if test="empName != null and empName != ''">
            emp_name = #{empName} and
        </if>
        <if test="age != null and age != ''">
            age =#{age} and
        </if>
        <if test="gender != null and gender != ''">
            gender =#{gender}
        </if>
    </trim>
    </select>
 prefix,suffix:在标签中内容前或者后面添加指定内容
 prefixOverrides,suffixOverrides :在标签中内容前或者后面去掉指定内容

 

choose when otherwise标签

相当于if ... else if...else

<!--  List<Emp> getEmpByChoose(Emp emp);  -->
<select id="getEmpByChoose" resultType="com.gu.mybatis.pojo.Emp">
    select * from t_emp
    <where>
        <choose>
            <when test="empName != null and empName != ''">
                emp_name = #{empName}
            </when>
            <when test="age != null and age != ''">
                age =#{age}
            </when>
            <when test="gender != null and gender != ''">
                gender =#{gender}
            </when>
        </choose>
    </where>
    </select>
相当于Java中的if...else if ...else
when至少设置一个,otherwise最多设置一个

 

foreach标签

<!--  void insertMoreEmp(List<Emp> emps);  -->
<insert id="insertMoreEmp">
    insert into t_emp values
    <foreach collection="emps" item="emp" separator=",">
        (null,#{emp.empName},#{emp.age},#{emp.gender},null)
    </foreach>
    </insert>
<!--  void deleteMoreEmp(@Param("empIds") Integer[] empIds);  -->
<delete id="deleteMoreEmp">
<!--    delete from t_emp where emp_id in-->
<!--        <foreach collection="empIds" item="empId" separator="," close=")" open="(">-->
<!--            #{empId}-->
<!--        </foreach>-->
    delete from t_emp where
    <foreach collection="empIds" item="empId" separator="or">
        emp_id =#{empId}
    </foreach>
    </delete>
        collection:设置循环的数组集合
        item:用一个字符串表示数组或集合中的每一个数据
        separator:设置每次循环的数据之间的分割符
        open:循环内容以什么开始
        close:循环内容以什么结束

 

sql片段

<sql id="empColumns">
    emp_id,emp_name,age,gender,dept_id
</sql>

记录一些公共sql片段,进行标签引入

总结

<!--
    mybatis中的动态SQL:
    1. if标签:通过test中的表达式判断标签的内容是否有效,是否会拼接到SQL中
    2. where标签:
        a. 若where标签中有条件成立,会自动生成where关键字。
        b. 会自动将where中内容前多余的and去掉,但内容后多余的and无法去掉
        c. 若where标签中没有任何一个条件成立,则where没有任何功能
    3. trim标签:
        prefix,suffix:在标签中内容前或者后面添加指定内容
        prefixOverrides,suffixOverrides :在标签中内容前或者后面去掉指定内容
    4. choose,when,otherwise 标签
        相当于Java中的if...else if ...else
        when至少设置一个,otherwise最多设置一个
    5. foreach标签
        collection:设置循环的数组集合
        item:用一个字符串表示数组或集合中的每一个数据
        separator:设置每次循环的数据之间的分割符
        open:循环内容以什么开始
        close:循环内容以什么结束
    6. sql片段
        可以记录一个片段,在需要用的地方使用include引用
        <sql id="empColumns">
             emp_id,emp_name,age,gender,dept_id
        </sql>
        select <include refid="empColumns"></include> from t_emp
-->