Mybatis官方中文文档
http://www.mybatis.org/mybatis-3/zh/index.html
在实际的场景中,经常会遇到动态SQL的增、删、改、查问题,这里就必要说明何谓动态SQL,我们举一个实际的例子,比如,在一个web工程中,经常会有一个搜索框,并且在搜索之前通常会进行一个关键词的过滤,比如可以过滤的条件有:姓名、年龄等,这样的话当我们姓名和年龄都不选,则等价于下面的SQL语句
select * from students; – 不去限制姓名和年龄
1
当我们将年龄选择为>20时,相当于下面的SQL语句:
select * from students where age>20;
1
当我们同时选择条件姓名为:张三,年龄>20,则相当于下面的SQL语句:
select * from students where age>20 and name=’张三’;
1
当我们有很多的条件时,此时就需要我们去组合这些条件,并动态的生成一个可执行的SQL语句,这样就不是一个简单的SQL语句能够解决问题,那么我们该怎么办呢?在MyBatis中同样是支持这种动态SQL的写法,具体见下面的内容。
MyBatis动态SQL支持
动态SQL之查询
<mapper namespace="com.yztc.yx.pojo.Emp">
<select id="findEmpBySalNameJob" parameterType="com.yztc.yx.pojo.EmpCondition"
resultType="com.yztc.yx.pojo.Emp">
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
where
ename like '%${kw}%' and job=#{job} and sal<=#{hisal} and
sal>=#{losal}
select>
mapper>
动态SQL之插入
<sql id="key">
<trim suffixOverrides=",">
<if test="ename!=null">
ename,
if>
<if test="job!=null">
job,
if>
<if test="mgr!=null">
mgr,
if>
<if test="hiredate!=null">
hiredate,
if>
<if test="sal!=null">
sal,
if>
<if test="comm!=null">
comm,
if>
<if test="deptno!=null">
deptno,
if>
trim>
sql>
<sql id="value">
<trim suffixOverrides=",">
<if test="ename!=null">
#{ename},
if>
<if test="job!=null">
#{job},
if>
<if test="mgr!=null">
#{mgr},
if>
<if test="hiredate!=null">
#{hiredate},
if>
<if test="sal!=null">
#{sal},
if>
<if test="comm!=null">
#{comm},
if>
<if test="deptno!=null">
#{deptno},
if>
trim>
sql>
<insert id="add" parameterType="com.yztc.yx.pojo.Emp">
insert into emp(
<include refid="key" />
) values (
<include refid="value" />
)
insert>
动态SQL之删除
<delete id="delete" parameterType="int[]">
delete from emp where empno in
<foreach collection="array" item="arrs" open="(" separator=","
close=")">#{arrs}foreach>
delete>
动态SQL之更新
<update id="update" parameterType="com.yztc.yx.pojo.Emp">
update emp
<set>
<if test="ename">ename=#{ename},if>
<if test="job">job=#{job},if>
<if test="mgr">mgr=#{mgr},if>
<if test="hiredate">hiredate=#{hiredate},if>
<if test="sal">sal=#{sal},if>
<if test="comm">comm=#{comm},if>
<if test="deptno">deptno=#{deptno},if>
set>
where empno=#{empno}
update>
动态SQL之条件不确定删选
<select id="findEmpChanges" parameterType="com.yztc.yx.pojo.EmpCondition"
resultType="com.yztc.yx.pojo.Emp">
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp
<where>
<if test="kw!=null">and ename like '%${kw}%'if>
<if test="job!=null">and job=#{job}if>
<if test="losal!=null&&hisal!=null">and sal between #{losal} and #{hisal} if>
where>
select>