准备工作:
public class User {
private int id;
private String lastName;
private int sex;
14.1、if 语句
说明: if语句,可以动态的根据你的值来决定,是否需要动态的添加查询条件。
UserMapper类中的方法
public interface UserMapper { public List<User> queryUsersByNameAndSex(User user); }
UserMapper配置文件中的配置
<!-- if语句 --> <select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User"> select id,last_name lastName,sex from t_user where <!-- 我们希望动态的创建这个条件语句 --> <if test="lastName != null"> last_name like concat('%',#{ lastName },'%') </if> <if test="sex == 0 or sex == 1"> and sex = #{sex} </if> </select>
测试代码:
@Test public void testQueryUsersByNameAndSex() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 1)); System.out.println(users); } finally { session.close(); } }
执行的结果:
14.2、where 语句
说明: where语句,可以帮我们在多个动态语句中,有效的去掉前面的多余的and 或 or 之类的多余关键字
UserMapper配置文件
<!-- where - if语句 --> <select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.atguigu.bean.User"> select id,last_name lastName,sex from t_user <where> <!-- 我们希望动态的创建这个条件语句 --> <if test="lastName != null"> last_name like concat('%',#{ lastName },'%') </if> <if test="sex == 0 or sex == 1"> and sex = #{sex} </if> </where> </select>
测试的代码是:
@Test public void testQueryUsersByNameAndSex() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.queryUsersByNameAndSex(new User(0, null, 1)); System.out.println(users); } finally { session.close(); } }
测试的结果:
14.3、trim语句
说明: trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
prefix 前面添加内容
suffix 后面添加内容
suffixOverrides 去掉的后面内容
prefixOverrides 去掉的前面内容
UserMapper配置文件中的内容
<!-- trim - if 语句 --> <select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User"> select id,last_name lastName,sex from t_user <!-- trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容 prefix 前面添加内容 suffix 后面添加内容 suffixOverrides 去掉的后面内容 prefixOverrides 去掉的前面内容 --> <trim prefix="where" suffixOverrides="and" prefixOverrides=""> <!-- 我们希望动态的创建这个条件语句 --> <if test="lastName != null"> last_name like concat('%',#{ lastName },'%') and </if> <if test="sex == 0 or sex == 1"> sex = #{sex} </if> </trim> </select>
测试代码:
@Test public void testQueryUsersByNameAndSex() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 5)); System.out.println(users); } finally { session.close(); } }
测试的结果:
14.4、choose( when , otherwise )语句
说明:choose when otherwise 可以执行多路选择判断,但是只会有一个分支会被执行。类似switch case 语句
UserMapper接口中添加的方法:
public List<User> queryUsersByNameAndSexForChoose(User user);
UserMapper配置文件的内容:
<!-- choose when otherwise 语句 有点类似于switch case 多路判断。只执行一路。 --> <select id="queryUsersByNameAndSexForChoose" parameterType="com.bean.User" resultType="com.bean.User"> select id,last_name lastName,sex from t_user <where> <choose> <when test="id > 0"> id = #{ id } </when> <when test="lastName != null"> last_name = #{lastName} </when> <otherwise> 1 = 1 </otherwise> </choose> </where> </select>
测试的代码:
@Test public void testQueryUsersByNameAndSexForChoose() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.queryUsersByNameAndSexForChoose(new User(1, "admin", 0)); System.out.println(users); } finally { session.close(); } }
测试的结果:
14.4、set语句
说明: set语句可以去掉,更新时候,set更新的多个列,由于动态生成的sql语句,而导致多出来的逗号
UserMapper中添加的方法
public int updateUserForSet(User user);
UserMapper配置文件中的内容:
<!-- update语句 set标签,可以去掉,多个列中的逗号 --> <update id="updateUserForSet" parameterType="com.bean.User"> update t_user <set> <if test="lastName != null"> last_name = #{lastName}, </if> <if test="sex == 0 or sex == 1"> sex = #{sex} </if> </set> where id = #{id} </update>
测试代码:
@Test public void testUpdateUserForSet() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); userMapper.updateUserForSet(new User(3, "xxxx", 10)); session.commit(); } finally { session.close(); } }
测试结果:
14.5、foreach语句
说明: foreach语句,可以遍历输出一个集合的数据
在UserMapper中添加的方法
public List<User> queryUserByidsForIn(@Param("ids")List<Integer> ids);
UserMapper配置文件中的内容
<!-- foreach语句可以遍历输出数据 collection属性设置遍历的集合 open 属性设置遍历输出前的内容 close 属性设置遍历输出后的内容 separator 属性设置每输出一个元素中间的间隔内容 item 属性 当前正在遍历到的数据名 --> <select id="queryUserByidsForIn" resultType="com.bean.User"> select id,last_name,sex from t_user where id in <foreach collection="ids" open="(" close=")" separator="," item="item_id"> #{item_id} </foreach> </select>
测试代码:
@Test public void testQueryUserByidsForIn() { SqlSession session = sqlSessionFactory.openSession(); try { UserMapper userMapper = session.getMapper(UserMapper.class); List<Integer> ids = new ArrayList<>(); ids.add(3); ids.add(6); ids.add(7); List<User> users = userMapper.queryUserByidsForIn( ids ); System.out.println(users); } finally { session.close(); } }
测试结果: