7.动态sql

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();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值