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