MyBatis之动态SQL

mybatis的动态sql语句是基于OGNL表达式的,可以方便地在sql语句中实现某些逻辑。

1. if判断是否为空或者null

2. where简化SQL语句中where的条件判断

3. set主要用在更新操作

4. trim元素可在自己包含的元素前加上前缀 ,也可在包含的内容后加上后缀,与之对应的属性时prefix和suffix;还可以把首部包含的某些内容或者尾部包含的某些内容覆盖prefixOverrides和suffixOverrides

5. choose,相当于switch。when和otherwise组合使用,只执行最开始满足条件的分支,如果都不满足执行otherwise分支的语句

6. foreach 主要用在构建in条件中

它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名;
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
open表示该语句以什么开始;
close表示以什么结束;
separator表示在每次进行迭代之间以什么符号作为分隔符;

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

用户表sys_user9:

CREATE TABLE `sys_user9` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `user_name` VARCHAR(50) DEFAULT NULL,
  `birthday` DATE DEFAULT NULL,
  `salary` DECIMAL(8,2) DEFAULT NULL,
  `address` VARCHAR(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB CHARSET=utf8;
INSERT INTO `sys_user9` VALUES(1, '陈三', '1992-02-29', 123456.78, '深圳市南山区');
INSERT INTO `sys_user9` VALUES(2, '张三', '1990-03-05', 8500, '深圳市宝安区');
INSERT INTO `sys_user9` VALUES(3, '李三', '1991-05-23', 123326.1, '深圳市福田区');
INSERT INTO `sys_user9` VALUES(4, '赵四', '1988-09-15', 8000, '深圳市龙华新区');

实体类SysUser9

public class SysUser9 {
	private int id;
	private String userName;
	private Date birthday;
	private Double salary;
	private String address;
	//...省略setter、getter方法
	public String toString(){
		return "SysUser9 [id = " + id + ", userName = " + userName + ", birthday = " + birthday + ", salary = " + salary + ", address = " + address + "]";
	}
}
在MyBatis配置文件引入映射文件<mapper resource="com/chensan/sys/mapper/SysUser9.xml"/>

SysUser9Dao接口

public interface SysUser9Dao {
	//1. if判断
	public List<SysUser9> getUser1(@Param("userName")String userName, @Param("birthday")Date birthday, @Param("salary")Double salary);
	
	//2. where简化SQL语句中where的条件判断
	public List<SysUser9> getUser2(@Param("userName")String userName, @Param("birthday")Date birthday, @Param("salary")Double salary);
	
	//3. set主要用于更新操作
	public void updateUser1(SysUser9 user);
	
	//31. set主要用于更新操作(加if判断,只更新有赋值的字段<更新部分字段>)
	public void updateUser2(SysUser9 user);
	
	//4. trim 增加或者覆盖前后缀
	public void updateUser3(SysUser9 user);
	
	//5. choose
	public void updateUser4(SysUser9 user);
	
	//6. foreach
}
映射文件SysUser9.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.chensan.sys.dao.SysUser9Dao">
  <resultMap type="com.chensan.sys.entity.SysUser9" id="sysUser9Map">
    <result property="userName" column="user_name"/>
  </resultMap>

  <select id="getUser1" resultMap="sysUser9Map">
    SELECT * FROM `sys_user9` WHERE 1=1 
    <if test="userName !=null and userName !=''">
      AND `user_name` like CONCAT('%',#{userName},'%')
    </if>
	<if test="birthday !=null">
	  AND `birthday`>#{birthday}
	</if>
	<if test="salary !=null">
	  AND `salary`<#{salary}
	</if>
  </select>
  
  <select id="getUser2" resultMap="sysUser9Map">
    SELECT * FROM `sys_user9` 
    <where>
      <if test="userName !=null and userName !=''">
        AND `user_name` like CONCAT('%',#{userName},'%')
      </if>
	  <if test="birthday !=null">
	    AND `birthday`>#{birthday}
	  </if>
	  <if test="salary !=null">
	    AND `salary`<#{salary}
	  </if>
    </where>
  </select>
  
  <update id="updateUser1" parameterType="com.chensan.sys.entity.SysUser9">
    update `sys_user9` 
    <set>
      `user_name`=#{userName},
      `birthday`=#{birthday},
      `salary`=#{salary},
      `address`=#{address}
    </set>
    where `id`=#{id}
  </update>
  
  <update id="updateUser2" parameterType="com.chensan.sys.entity.SysUser9">
    update `sys_user9` 
    <set>
      <if test="userName !=null">
        `user_name`=#{userName},
      </if>
      <if test="birthday !=null">
      `birthday`=#{birthday},
      </if>
      <if test="salary !=null">
        `salary`=#{salary},
      </if>
      <if test="address !=null">
        `address`=#{address},
      </if>
    </set>
    where `id`=#{id}
  </update>
  
  <update id="updateUser3" parameterType="com.chensan.sys.entity.SysUser9">
    update `sys_user9` 
    <trim prefix="set" suffixOverrides=",">
      <if test="userName !=null">
        `user_name`=#{userName},
      </if>
      <if test="birthday !=null">
      `birthday`=#{birthday},
      </if>
      <if test="salary !=null">
        `salary`=#{salary},
      </if>
      <if test="address !=null">
        `address`=#{address},
      </if>
    </trim>
    where `id`=#{id}
  </update>
  
  <update id="updateUser4" parameterType="com.chensan.sys.entity.SysUser9">
    update `sys_user9` 
    <trim prefix="set" suffixOverrides=",">
      <choose>
        <when test="salary !=null">
          `salary`=#{salary},
        </when>
        <otherwise>
          `address`=#{address},
        </otherwise>
      </choose>
    </trim>
    where `id`=#{id}
  </update>
</mapper>
测试类
public class MyBatisSysUser9DynamicSQLTest {
	private static SqlSessionFactory sqlSessionFactory;
    private static Reader resource;
    
    //创建会话工厂
    static{
        try{
        	//读取MyBatis配置文件
        	resource = Resources.getResourceAsReader("myBatisConfig.xml");
        	//创建SqlSessionFactory会话工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(resource);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public static SqlSessionFactory getSession(){
        return sqlSessionFactory;
    }
    
    public void getUser1(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser9Dao sysUser9Dao = sqlSession.getMapper(SysUser9Dao.class);
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1991-1-5");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	List<SysUser9> users = sysUser9Dao.getUser1("三", birthday, 123333D);
    	for(SysUser9 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public void getUser2(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser9Dao sysUser9Dao = sqlSession.getMapper(SysUser9Dao.class);
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1991-1-5");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	List<SysUser9> users = sysUser9Dao.getUser2("三", birthday, 123333D);
    	for(SysUser9 user : users){
    		System.out.println(user);
    	}
    	sqlSession.close();
    }
    
    public void updateUser1(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser9Dao sysUser9Dao = sqlSession.getMapper(SysUser9Dao.class);
    	SysUser9 user = new SysUser9();
    	user.setId(4);
    	user.setUserName("赵大光");
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1994-1-1");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	user.setBirthday(birthday);
    	user.setSalary(10000D);
    	sysUser9Dao.updateUser1(user);
    	sqlSession.commit();
    	sqlSession.close();
    }
    
    public void updateUser2(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser9Dao sysUser9Dao = sqlSession.getMapper(SysUser9Dao.class);
    	SysUser9 user = new SysUser9();
    	user.setId(3);
    	user.setUserName("李三天");
    	DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    	Date birthday = null;
		try {
			birthday = df.parse("1993-11-22");
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	user.setBirthday(birthday);
    	sysUser9Dao.updateUser2(user);
    	sqlSession.commit();
    	sqlSession.close();
    }
    
    public void updateUser3(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser9Dao sysUser9Dao = sqlSession.getMapper(SysUser9Dao.class);
    	SysUser9 user = new SysUser9();
    	user.setId(3);
    	user.setUserName("李三");
    	user.setSalary(10000D);
    	sysUser9Dao.updateUser3(user);
    	sqlSession.commit();
    	sqlSession.close();
    }
    
    public void updateUser4(){
    	//开启会话实例sqlSession
    	SqlSession sqlSession = sqlSessionFactory.openSession();
    	SysUser9Dao sysUser9Dao = sqlSession.getMapper(SysUser9Dao.class);
    	SysUser9 user = new SysUser9();
    	user.setId(2);
    	user.setSalary(11111D);
    	user.setAddress("深圳市盐田区");
    	sysUser9Dao.updateUser4(user);
    	sqlSession.commit();
    	sqlSession.close();
    }
    
    public static void main(String[] args) {
    	MyBatisSysUser9DynamicSQLTest myBatisDynamicSQLTest = new MyBatisSysUser9DynamicSQLTest();
    	//myBatisDynamicSQLTest.getUser1();
    	//myBatisDynamicSQLTest.getUser2();
    	//myBatisDynamicSQLTest.updateUser1();
    	//myBatisDynamicSQLTest.updateUser2();
    	//myBatisDynamicSQLTest.updateUser3();
    	myBatisDynamicSQLTest.updateUser4();
    } 
}

foreach的例子懒得写了。可参考:http://www.cnblogs.com/duanxz/p/3851253.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值