7.动态sql

来源:互联网 发布:马小丝的淘宝店 编辑:程序博客网 时间:2024/06/04 23:26

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();    }}
原创粉丝点击