Mybatis的一个强大的特性之一就是它的动态sql能力。当我们查询的条件不固定,可能是一个或多个,传统的jdbc方式我们只能按条件采用拼sql字符串方式来编写,但是确保中间的空格或在列表的最后省略逗号的清除。Mybatis采用功能强大的机遇OGNL的表达式来消除其他元素。
用于条件判断
<if test="条件"></if>
用于条件语句,如果此标记中无内容则不会出现where,如果有内容,则会去掉第一个and或or
<where></where>
只是用于update,去掉最后一个逗号
<set></set>
用于选择判断,工资为空则赋值3000,不为空则设置为更新值
<choose>
<when test="sal!=null">
sal=#{sal},
</when>
<otherwise>
sal=3000,
</otherwise>
</choose>
用于遍历collection参数,为数组(使用array)或集合(使用list),open以什么值开头,close以什么结尾,separator以什么分隔
<foreach collection="" open="" close="" separator="" item="">
</foreach>
prefix前缀,prefixOverrides去掉set里面的第一个填写的值,多个值用“|”符号相连,suffixOverrides去掉set里面的最后一个填写的值
<trim prefix="" prefixOverrides="" suffixOverrides="">
</trim>
模拟set
<trim prefix="set" suffixOverrides=","></trim>
模拟where
<trim prefix="where" prefixOverrides="and|or"></trim>
EmpDao.java
package com.cjq.dao;
import com.cjq.vo.Emp;
import java.util.List;
import java.util.Map;
/**
* Created by cjq on 2017/9/16.
*/
public interface EmpDao {
public List<Emp> select1(Map map);
public void update1(Emp emp);
public void delete1(int []deptnos);
}
<select id="select1" parameterType="map" resultType="com.cjq.vo.Emp">
select * from emp
<where>
<if test="job!=null">
job=#{job}
</if>
<if test="deptno!=null">
and deptno=#{deptno}
</if>
<if test="dname!=null">
and sal=#{dname}
</if>
</where>
</select>
<update id="update1" parameterType="com.cjq.vo.Emp">
update emp
<set>
<if test="job!=null">
job=#{job},
</if>
<choose>
<when test="sal!=null">
sal=#{sal},
</when>
<otherwise>
sal=3000,
</otherwise>
</choose>
<if test="ename!=null">
ename=#{ename}
</if>
</set>
where eno=#{eno}
</update>
<!--collection="array",array对应数组,list对应集合 -->
<delete id="delete1" parameterType="int[]" >
delete from emp where eno in
<foreach collection="array" open="(" close=")" separator="," item="a">
#{a}
</foreach>
</delete>
测试
package com.cjq.vo;
import com.cjq.dao.EmpDao;
import com.cjq.dao.SessionFactory;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by cjq on 2017/9/16.
*/
public class EmpDaoTest {
//获取session
SqlSession session= SessionFactory.getSession();
//获得Dao
EmpDao dao=session.getMapper(EmpDao.class);
@Test
public void select1(){
Map<String,Object> map=new HashMap<String,Object>();
map.put("deptno",1);
map.put("dname","hello");
List<Emp> list=dao.select1(map);
for(Emp e:list){
System.out.println(e);
}
}
@Test
public void update1(){
Emp emp=new Emp();
emp.setEno(1);
emp.setEname("hello1");
dao.update1(emp);
session.commit();
session.close();
}
@Test
public void delete1(){
dao.delete1(new int[]{3,4});
session.commit();
session.close();
}
}