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

动态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>
    
    <if test="name!=null&&name.trim()!=''">AND name=#{name}if>
    
    <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>
    
    <if test="name!=null&&name.trim()!=''">AND name=#{name}if>
    
    <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>
    
    <if test="name!=null&&name.trim()!=''">name=#{name} ANDif>
    
    <if test="teacher_gender==0 or teacher_gender==1"> gender=#{teacher_gender} andif>trim>
    select>

总结:

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


choose标签

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

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

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


问题:

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

1. trim()方法 
2. set

trim():

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

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

set标签

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

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

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

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

foreach标签实现批量插入:

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


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标签#{对象.属性名}

你可能感兴趣的:(SSM框架)