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