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 && lastName!=''">
last_name like #{lastName} and
</if>
<if test="email!=null and email.trim()!=""">
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分支。