1、动态SQL简介
●动态SQL是MyBatis强大的特性之一,极大的简化我们SQL拼装的操作
●动态SQL元素和使用JSTL或其它类似基于XML的标签类似
●MyBatis采用功能强大的基于OGNL的表达式来简化操作
●OGNL对象图导航语言,这是一种强大的表达式语言,通过它可以非常方便的操作对象属性。类似于我们的EL表达式。
○访问对象属性 ${对象名.属性名}
○调用方法 ${对象名.方法名}
○运算符:算术运算符、逻辑运算符(and or not )、比较运算符
●动态SQL就是通过一系列的标签来完成判断,进行SQL语句的组装
2、where和if标签
需求:根据用户名、id、state等多个条件查询用户信息
<?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接口的路径-->
<mapper namespace="com.bdit.dao.IUserMapper">
<!--模糊查询like #后面的名字任意-->
<select id="find" resultType="User" parameterType="String">
select * from user where id=#{id} or name like #{name}
</select>
</mapper>
@Test
public void find() {
IUserMapper userMapper = sqlSession.getMapper(IUserMapper.class);
User user = new User();
user.setId(9);
user.setUsername("%an%");
List<User> list = userMapper.findUser(user);
for (User user1:list) {
System.out.println(user1);
}
}
加入以上查询条件,我们不传递id,而且条件由or换成and,就会查不到任何数据。实际情况下的组合查询,都会进行非空判断,然后进行查询条件的组装。在MyBatis框架中,提供类where标签和if标签来实现动态SQL语句。
●where标签:处理SQL语句,自动添加where关键字,并去掉紧跟在它后面的一个and或者or
●if标签:test属性,判断表达式真假
<select id="find" resultType="user">
select * from user
<where>
<if test="id!=null">
or id=#{id}
</if>
<if test="name!='' and name!=null">
or name like #{name}
</if>
</where>
</select>
3、SQL标签
将SQL语句通用的部分进行抽取,其它SQL语句通过标签引入也可以使用。
<select id="find" resultType="user">
select <include refid="user_common"/> from user
<where>
<if test="id!=null">
or id=#{id}
</if>
<if test="name!='' and name!=null">
or name like #{name}
</if>
</where>
</select>
<!--封装sql里面的数据名,便于查询-->
<sql id="user_common">
id,name,keyword,description
</sql>
4、foreach标签传入集合
删除多条数据的SQL语句,delete from user where id in(1,2,4,5,6)
foreach标签遍历集合拼接SQL语
●collection 属性:遍历传入的集合,当参数是集合时,collection属性值固定为list
●open属性:遍历拼接前
●close属性:遍历拼接后
●separator属性:拼接的符号
●item属性:遍历到的元素
<select id="findList" resultType="user" parameterType="list">
select <include refid="user_common"></include> from user
<foreach collection="list" open="where id in(" close=")" separator="," item="item">
#{item}
</foreach>
</select>
@Test
public void findList(){
IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List<User> list2=iUserMapper.findList(list);
for(User l:list2){
System.out.println(l);
}
}
5、foreach标签传入数组
foreach标签遍历集合拼接SQL语句
●collection 属性:遍历传入的数组,当参数是数组时,collection属性值固定为array
●open属性:遍历拼接前
●close属性:遍历拼接后
●separator属性:拼接的符号
●item属性:遍历到的元素
<select id="findArray" resultType="user" parameterType="int[]">
select <include refid="user_common"></include> from user
<foreach collection="array" open="where id in(" close=")" separator="," item="item">
#{item}
</foreach>
</select>
@Test
public void findArray(){
IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
int[] id={1,2,3};
List<User> list=iUserMapper.findArray(id);
for(User l:list){
System.out.println(l);
}
}
6、foreach标签传入POJO对象
foreach标签遍历集合拼接SQL语句
●collection 属性:遍历传入的pojo对象中的集合,collection属性值为pojo中的集合属性名
●open属性:遍历拼接前
●close属性:遍历拼接后
●separator属性:拼接的符号
●item属性:遍历到的元素
<select id="findQuary" resultType="user" parameterType="quary">
select <include refid="user_common"></include> from user
<foreach collection="list" open="where id in(" close=")" separator="," item="item">
#{item}
</foreach>
</select>
//批量查询->POJO全局变量是集合
@Test
public void findQuary(){
IUserMapper iUserMapper=sqlSession.getMapper(IUserMapper.class);
Quary quary=new Quary();
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(25);
list.add(20);
quary.setList(list);
List<User> list2=iUserMapper.findQuary(quary);
for(User l:list2){
System.out.println(l);
}
}