目录
第一节 Mybatis的动态SQL
1.1 if 和where的使用
- if标签:是作为判断参数来使用的,如果符合条件,就把if标签体内的SQL拼接上,不符合条件就不拼接
- 注意:用if进行判断是否为空时,不仅要判断null,还要判断空字符串’'
- where标签:会去掉条件中的第一个and符号
- 在UserMapper.java接口中写一个方法
- 在UserMapper.xml中配置sql
- 测试与效果
package com.it.test;
import com.it.mapper.UserMapper;
import com.it.model.User;
import com.it.vo.UserQueryVo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @ClassName Demo02
* @Author shuyy
* @Date 2020/9/22
**/
public class Demo01 {
SqlSession sqlSession;
@Before
public void before() throws IOException {
System.out.println("before...获取session");
//1.读取配置文件
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.通过SqlSessionFactoryBuilder创建SqlSessionFactory会话工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.通过SqlSessionFactory创建SqlSession
sqlSession = sessionFactory.openSession();
}
@After
public void after(){
System.out.println("after...关闭session");
//5.关闭SqlSession
sqlSession.close();
}
@Test
public void test1(){
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//System.out.println(userMapper);//返回的是一个代理对象
//查询条件
UserQueryVo queryVo = new UserQueryVo();
User user = new User();
user.setSex("男");
user.setUsername("shu04");
queryVo.setUser(user);
List<User> list = userMapper.findUserList(queryVo);
System.out.println(list);
//sqlSession.commit();//增删改记得提交事务
}
}
- 如果注释了姓名设置,会查询所有符合性别条件的
- 如果注释了性别设置,虽然不会报错,但是查询不到结果,这是由于sql所致
- 为了正确的使用sql,使用if与where来拼接sql,如果要查询的字段值为空,就不把该字段的条件加到sql上,起到动态拼接sql的效果
<!--if与where的使用--><!--查询性别和名字-->
<select id="findUserList" parameterType="UserQueryVo" resultType="user">
select * from user
<where>
<if test="user != null">
<if test="user.sex != null and user.sex != ''">
sex = #{user.sex}
</if>
<if test="user.username != null and user.username != ''">
and username like '%${user.username}%'
</if>
</if>
</where>
</select>
- 注释一些配置的效果,就算注释了设置user,user为空也不报错
- where会去除条件中第一个and符号(上面的语句中写的是and username like ‘%${user.username}%’),拼接后的语句中去除了and,防止了SQL错误
- 注释了条件,就不拼接到对应的sql上
1.2 SQL片断
- Mybatis提供了SQL片段的功能,可以提高SQL的可重用性。
<!--if与where的使用--><!--查询性别和名字-->
<!--声明一个sql片段-->
<sql id="select_user_where">
<if test="user != null">
<if test="user.sex != null and user.sex != ''">
sex = #{user.sex}
</if>
<if test="user.username != null and user.username != ''">
and username like '%${user.username}%'
</if>
</if>
</sql>
<select id="findUserList" parameterType="UserQueryVo" resultType="user">
select * from user
<where>
<!--引用sql片段-->
<include refid="select_user_where"/>
</where>
</select>
- 成功执行
1.3 foreach遍历
- 先在包装类中提供一个List,并提供get/set
- 在UserMapper.java中提供一个方法
- 在UserMapper.xml中提供对应的sql
<!--foreach的使用-->
<select id="findUserByIds" parameterType="userQueryVo" resultType="user">
select * from user
<where>
<if test="ids != null and ids.size > 0">
<!--
foreach标签:表示一个foreach循环
collection:集合参数名称,如果是直接传入集合参数,则该处的参数名称只能填 list
item:每次遍历出来的对象
open:开始遍历时拼接的串(sql)
close:结束遍历时拼接的串(sql)
separator:遍历出的每个对象之间需要拼接的字符
-->
<foreach collection="ids" item="id" open="id in (" separator="," close=")">
${id}
</foreach>
</if>
</where>
</select>
- 测试
package com.it.test;
import com.it.mapper.UserMapper;
import com.it.model.User;
import com.it.vo.UserQueryVo;<