mybatis动态查询
2017-07-12 本文已影响140人
Dl_毛良伟
mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几个标签:
-
if标签
作用: 起一个判断的作用,即你传入什么条件它就查询对应的信息,,从而就可以过滤掉空值.
如:
//查询部门相关信息
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>