(九)Mybatis的入门教程—— 动态sql之trim、set、choose标签

trim(where(封装查询条件),set(封装修改条件))标签:自定义字符串的截取规则

接口

public interface EmployeeMapperDynamicSQL{
    public List<Employee> getEmpsByConditionTrim(Employee employee);
}

映射文件

trim标签体中是整个字符串拼串后的结果。

prefix=" ";该属性表示前缀,给拼串后的整个字符串加一个前缀。(可写可不写)

prefixOverrides=" ";该属性表示前缀覆盖,去掉整个字符串前面多余的字符。(可写可不写)

suffix=" ";该属性表示后缀,给拼串后的整个字符串加一个后缀。(可写可不写)

suffixOverrides=" "; 该属性表示后缀覆盖,去掉整个字符串后面多余的字符。(可写可不写)

关于where标签

<select id="getEmpsByConditionTrim" resultType="com.mybatis.bean.Employee">
    select * from tbl_employee 
    <trim prefix="where" suffixOverrides="and"> 
        <if test="id!=null">
            id=#{id} and
        </if>
 
        <if test="lastName!=null &amp;&amp; lastName!=''">
            last_name like #{lastName} and 
        </if>
 
        <if test="email!=null and email.trim()!=&quot;&quot;">
            email=#{email} and 
        </if>
 
        <if test="gender==0 or gender==1">
            gender=#{gender}
        </if>
    </trim>
</select>

测试

@Test
public void testDynamicSql(){
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    SqlSession openSession = sqlSessionFactory.openSession();
        try{
            EmployeeMapperDynamicSQL mapper =                                                 
                                  openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(null, "%e%", null, null);
            List<Employee> emps = mapper.getEmpsByConditionIf(employee);
            for(Employee emp : emps){
                System.out.println(emp);
                }
            List<Employee> emps2 = mapper.getEmpsByConditionIf(employee);
             for(Employee emp : emps2){
                System.out.println(emp);
                    }
            }finally{    
    
            }
}

就算对于后面多余的and,该标签也能处理好,结果就正常了

trim标签用的不太多,可以了解一下就行。


关于set标签

接口

public interface EmployeeMapperDynamicSQL{
    public void updateEmp(Employee employee);
}

映射文件

<update id="updateEmp">
    update tbl_employee
    set 
    <if test="lastName!=null">
        last_name=#{lastName},
    </if>
    <if test="email!=enull">
        email=#{email},
    </if>
    <if test="gender!=null">
        gender=#{gender}
    </if>
    where id=#{id}
</update>

测试

@Test
public void testDynamicSql(){
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    SqlSession openSession = sqlSessionFactory.openSession();
        try{
            EmployeeMapperDynamicSQL mapper =                                                 
                                  openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(1, "Admin", null, null);
            mapper.updateEmp(employee);
            openSession.commit();
         }finally{    
                openSession.close();
            }
}

结果出现报错,

但是修改映射文件为以下样式,则就不用担心这些多出来的逗号之类的问题了。

<update id="updateEmp">
    update tbl_employee
    <set> 
        <if test="lastName!=null">
            last_name=#{lastName},
        </if>
        <if test="email!=enull">
            email=#{email},
        </if>
        <if test="gender!=null">
            gender=#{gender}
        </if>
    </set>
    where id=#{id}
</update>

结果正常,数据库也更新成功

或者用trim标签也能完成相同操作(但更新操作,一般还是推荐用set标签

<update id="updateEmp">
    update tbl_employee
    <trim prefix="set" suffixOverrides=","> 
        <if test="lastName!=null">
            last_name=#{lastName},
        </if>
        <if test="email!=enull">
            email=#{email},
        </if>
        <if test="gender!=null">
            gender=#{gender}
        </if>
    </trim>
    where id=#{id}
</update>

choose(when, otherwise)标签:分支选择,相当于带了break的switch-case。

场景:如果查询员工信息的时候带了id就用id查询,如果传入的是last_name,就用last_name查询;只会进入其中一个分支。

接口

public interface EmployeeMapperDynamicSQL{
    public List<Employee> getEmpsByConditionChoose(Employee employee);
}

映射文件

<select id="getEmpsByConditionChoose" resultType="com.mybatis.bean.Employee">
    select * from tbl_employee 
      <where>
           <choose>
                <when test="id!=null">
                    id=#{id}
                </when>

                <when test="lastName!=null">
                    last_name like {lastName}
                </when>

                <when test="email">
                    email=#{email}
                </when>

                <otherwise>
                    gender=0
                </otherwise>
           </choose>
    </where>
</select>

测试

@Test
public void testDynamicSql(){
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    SqlSession openSession = sqlSessionFactory.openSession();
        try{
            EmployeeMapperDynamicSQL mapper =                                                 
                                  openSession.getMapper(EmployeeMapperDynamicSQL.class);
            Employee employee = new Employee(null, "%e%", null, null);
            List<Employee> list = mapper.getEmpsByConditionChoose(employee);
            for(Employee emp : list){
                System.out.println(emp);
             }

            }finally{    
    
            }
}

结果

如果传入lastName的同时,id也传入1,则查询不会进入last_name,仅仅是进入id分支。

猜你喜欢

转载自blog.csdn.net/Steriles_/article/details/81705670