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




發佈了102 篇原創文章 · 獲贊 49 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章