mybatis动态查询

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

  • if标签

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

//查询部门相关信息
   List> depts(Dept dept);

对应的sql语句





    


它可以根据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> depts = mapper.depts(dept);
        for (Map dept1 : depts) {
            System.out.println(dept1);
        }
    }
}

查询结果:

mybatis动态查询_第1张图片
根据id进行查询
mybatis动态查询_第2张图片
根据name进行查询

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

      
             AND dept_name = #{deptName}
      

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


  ...

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


  update emp
    
      emp_id=#{empId},
      emp_name=#{empName},
      email=#{email},
      gender=#{gender}
    
  where id=#{id}

与它等价的trim标签如下。


  ...

你可能感兴趣的:(mybatis动态查询)