Mybatis动态sql语句常用标签及应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/82492641

动态sql:

if标签

注意这里是传入一个对象 根据对象的属性有无值来传入对于的值

    <mapper namespace="dao.TeacherMapperDynamicSQL">
    <resultMap type="entity.Teacher" id="Teacher">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="gender" property="teacher_gender"/>
    </resultMap>
    <select id="getTeachersByIf" resultMap="Teacher">
    SELECT * FROM teachers where
    <if test="id!=null">id=#{id}</if>
    <!-- 遇见特殊符号应该去写转义字符:&quot;代表引号 &amp;代表并且 -->
    <if test="name!=null&amp;&amp;name.trim()!=''">AND name=#{name}</if>
    <!-- 会进行字符串与数字的转换判断  "0"==0 -->
    <if test="teacher_gender==0 or teacher_gender==1">AND gender=#{teacher_gender}</if>
    </select>
</mapper>

注意:
如果第一个id没有传入,那就会有 where and xx语法错误 。

可以再where后面加上1=1 以后的条件都and xx即可
还有一种方式使用·where标签·


where标签

<select id="getTeachersByIf" resultMap="Teacher">
    SELECT * FROM teachers 
    <where>
    <if test="id!=null">id=#{id}</if>
    <!-- 遇见特殊符号应该去写转义字符:&quot;代表引号 &amp;代表并且 -->
    <if test="name!=null&amp;&amp;name.trim()!=''">AND name=#{name}</if>
    <!-- 会进行字符串与数字的转换判断  "0"==0 -->
    <if test="teacher_gender==0 or teacher_gender==1">AND gender=#{teacher_gender}</if></where>

    </select>

注意:
where标签只会处理第一个多出来的and或者or 也没法解决and拼在后面的
所以使用where的时候 and 要写在第一位
后面多出的and或者or where标签不能解决

还有一个解决方案就是 trim截取标签.


trim截取标签

        prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。
                prefix给拼串后的整个字符串加一个前缀 
        prefixOverrides="":
                前缀覆盖: 去掉整个字符串前面多余的字符
        suffix="":后缀
                suffix给拼串后的整个字符串加一个后缀 
        suffixOverrides=""
                后缀覆盖:去掉整个字符串后面多余的字符
<!-- 自定义字符串的截取规则 -->

<select id="getTeachersByIf" resultMap="Teacher">
    SELECT * FROM teachers 
    <trim prefix="where" suffixOverrides="and">
    <if test="id!=null">id=#{id} AND </if>
    <!-- 遇见特殊符号应该去写转义字符:&quot;代表引号 &amp;代表并且 -->
    <if test="name!=null&amp;&amp;name.trim()!=''">name=#{name} AND</if>
    <!-- 会进行字符串与数字的转换判断  "0"==0 -->
    <if test="teacher_gender==0 or teacher_gender==1"> gender=#{teacher_gender} and</if></trim>
    </select>

总结:

前面都是if配合其他的标签
实现 带了什么属性 就将他们统一拼起来 查询同时满足


choose标签

分支选择: switch-case
如果带了id就用id查 如果带了 其他属性就用其他属性查

特点:只取一个属性来查询
<select id="getTeachersByIf" resultMap="Teacher">
        SELECT * FROM teachers
        <where>
            <choose>
                <when test="id!=null">
                    id=#{id}
                </when>
                <when test="name!=null&amp;&amp;name.trim()!=''">
                    name=#{name}
                </when>
                <when test="teacher_gender==0 or teacher_gender==1">
                    gender=#{teacher_gender}
                </when>
            </choose>
        </where>
    </select>

一般都是要用where这样比较结构好看
如果传入多个 那就只取最前面那个
如果都不传入 那就取<otherwise>


问题:

要实现修改呢? 传入什么属性 就修改什么属性
有两个方法

1. trim()方法 
2. set

trim():

suffixOverrides=","   指定两个参数之间的连接符

    <update id="updateTeachers">
    UPDATE teachers 
    <trim prefix="set" suffixOverrides=",">
        <if test="name!=null&amp;&amp;name.trim()!=''">
        name=#{name},
        </if>
        <if test="teacher_gender==0 or teacher_gender==1">
        gender=#{teacher_gender},
        </if>
    </trim>
    <where>id=#{id}</where>
    </update>

set标签

注意 这个时候 name=#{name}之类的 后面必须加, 不然 就报错

    <update id="updateTeachers">
    UPDATE teachers 
    <set>
        <if test="name!=null&amp;&amp;name.trim()!=''">
        name=#{name},
        </if>
        <if test="teacher_gender==0 or teacher_gender==1">
        gender=#{teacher_gender},
        </if>
    </set>
    <where>id=#{id}</where>
    </update>

foreach标签:遍历数据,可以实现批处理

collection:指定要遍历的集合。
list类型的参数会特殊处理封装在map中,map的key就叫list
item:将当前遍历出的元素赋值给指定的变量
separator:每个元素之间的分隔符
open:遍历出所有结果拼接一个开始的字符
close:遍历出所有结果拼接一个结束的字符
index:索引。遍历list的时候是index就是索引,item就是当前值
遍历map的时候index表示的就是map的key,item就是map的值
#{变量名}就能取出变量的值也就是当前遍历出的元素
//接口,这一步需要给她取别名 不取就报错
public List<Teacher> getTeachersByForeach(@Param("m")List<Integer> numb);
//映射文件
<select id="getTeachersByForeach" resultMap="Teacher">
    select * FROM teachers 
    <foreach collection="m" item="item_id" open="where id in(" close=")" separator=",">
    #{item_id}
    </foreach>
</select>
//测试
List<Teacher> teachers = findTeacher.getTeachersByForeach(Arrays.asList(2,3,4));

foreach标签实现批量插入:

//接口
public void insertTeachers(@Param("list")List<Teacher> list);
//映射文件  
<insert id="insertTeachers">
    insert into teachers(name,gender,school_id)  values
    <foreach collection="list" item="item" separator=",">
        (#{item.name},#{item.teacher_gender},#{item.student.id})
    </foreach>
</insert>

list.add(new Teacher(null,"aa","1"));
list.add(new Teacher(null,"bb","0"));
findTeacher.insertTeachers(list);
sqlSession.commit();

注意:
同样是list list对象可以不用@Param 而list integer类型需要
传入对象#{属性名} 传入对象集合foreach标签#{对象.属性名}

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/82492641
今日推荐