全栈工程师程序员

mybatis动态查询

2017-07-12  本文已影响140人  Dl_毛良伟

mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几个标签:

作用: 起一个判断的作用,即你传入什么条件它就查询对应的信息,,从而就可以过滤掉空值.
如:

//查询部门相关信息
   List<Map<String, Object>> depts(Dept dept);

对应的sql语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="demo.ssm.dao.DynamicSQL">

    <select id="depts" resultType="map">
        select * from dept
        <where>
            <if test="deptId!=null">
                dept_id = #{deptId}
            </if>
            <if test="deptName!=null">
                AND dept_name = #{deptName}
            </if>
        </where>
    </select>

</mapper>

它可以根据id查询,也可以根据name查询,
测试类:


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class Test {

    @Autowired
    DynamicSQL dynamicSQL;

    @Autowired
    SqlSessionTemplate sqlSessionTemplate;

    @org.junit.Test
    public void test01() {
        DynamicSQL mapper = sqlSessionTemplate.getMapper(DynamicSQL.class);
        Dept dept = new Dept();
//        dept.setDeptId(1);
        dept.setDeptName("开发部");
        List<Map<String, Object>> depts = mapper.depts(dept);
        for (Map<String,Object> dept1 : depts) {
            System.out.println(dept1);
        }
    }
}

查询结果:

根据id进行查询 根据name进行查询

同理也可以将两个条件都带上.此外,where标签很好的解决了,当第一个查询条件为空时,后面的语句出错的的情况,因为当地一个查询条件为空时,sql就会自动的去匹配下一个条件可是下一个条件是这样写的:

      <if test="deptName!=null">
             AND dept_name = #{deptName}
      </if>

这样写肯定不符合sql语法,就会导致sql语句出错,where标签非常智能。如果标签内部没有合适的语句,where标签就不会生成任何东西,防止出现错误语句。
有时候where标签还不能满足需求。这时候还可以使用trim标签进行更高级的定制。trim标签中的prefix和suffix属性会被用于生成实际的SQL语句,会和标签内部的语句拼接。如果语句的前面或后面遇到prefixOverrides或suffixOverrides属性中指定的值,MyBatis会自动将它们删除。在指定多个值的时候,别忘了每个值后面都要有一个空格,保证不会和后面的SQL连接在一起。下面这个例子和where标签完全等效。

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

set标签(用于智能执行更新语句)

<update id="updateEmp">
  update emp
    <set>
      <if test="empId != null">emp_id=#{empId},</if>
      <if test="empName != null">emp_name=#{empName},</if>
      <if test="email != null">email=#{email},</if>
      <if test="gender != null">gender=#{gender}</if>
    </set>
  where id=#{id}
</update>

与它等价的trim标签如下。

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>
上一篇下一篇

猜你喜欢

热点阅读