项目目录
动态 SQL 之if标签
持久层 Dao 接口
/** * 根据传入的参数条件 * @param user 查询的条件,有可能有用户名 ,性别,或都没有 * @return */ List<User> finduserCondition(User user);
持久层 Dao 映射配置
<!--根据条件查询--> <select id="finduserCondition" resultMap="userMap" parameterType="user"> select * from user where 1=1 <if test="userName != null"> and username = #{userName} </if> <if test="userSex != null"> and sex = #{userSex} </if> </select>
测试代码
/** * 根据条件查询 if标签 * @throws Exception */ @Test public void testfinduserCondition() throws Exception { User u = new User(); u.setUserName("老王"); u.setUserSex("男"); //5.使用代理对象执行方法 List<User> users = userDao.finduserCondition(u); for (User user : users) { System.out.println(user); } }
测试结果:
动态 SQL 之where标签
为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。
持久层 Dao 映射配置
<select id="finduserCondition" resultMap="userMap" parameterType="user"> select * from user <where> <if test="userName != null"> and username = #{userName} </if> <if test="userSex != null"> and sex = #{userSex} </if> </where> </select>
效果和上面的if标签一样
动态 SQL 之foreach标签
需求
传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND (id =10 OR id =19 OR id=36)
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND id IN (10,19,36)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
在 QueryVo 中加入一个 List 集合用于封装参数
QueryVo:
package com.keafmd.domain; import java.util.List; /** * Keafmd * * @ClassName: QueryVo * @Description: * @author: 牛哄哄的柯南 * @date: 2021-02-08 21:08 */ public class QueryVo { private User user; private List<Integer> ids; public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
持久层 Dao 接口
/** * 根据QueryVo中提供的id集合查询 * @param vo * @return */ List<User> findUserInIds(QueryVo vo);
持久层 Dao 映射配置
<!--根据QueryVo中的id集合实现查询查询用户列表--> <select id="findUserInIds" resultMap="userMap" parameterType="queryvo"> <include refid="defaultUser"></include> <where> <if test="ids!=null and ids.size()>0"> <foreach collection="ids" open = "and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
测试代码
@Test public void testfindUserInIds() throws Exception { QueryVo vo = new QueryVo(); List<Integer> list = new ArrayList<Integer>(); list.add(41); list.add(42); list.add(50); vo.setIds(list); //5.使用代理对象执行方法 List<User> users = userDao.findUserInIds(vo); for (User user : users) { System.out.println(user); } }
测试结果:
Mybatis中简化编写的 SQL 片段
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
这样可以简化我们每次都需要在sql语句中写的select * from user。
定义代码片段
<!--了解的内容,抽取重复的sql语句--> <sql id="defaultUser"> select * from user </sql>
注意细节:在抽取重复的sql语句尽量不要写分号;,因为可能还会和后面的sql语句进行拼接,有分号就会导致报错。
引用代码片段
<!--配置查询所有--> <select id="findAll" resultMap="userMap"> <include refid="defaultUser"></include> </select> <!--根据QueryVo中的id集合实现查询查询用户列表--> <select id="findUserInIds" resultMap="userMap" parameterType="queryvo"> <include refid="defaultUser"></include> <where> <if test="ids!=null and ids.size()>0"> <foreach collection="ids" open = "and id in (" close=")" item="uid" separator=","> #{uid} </foreach> </if> </where> </select>
以上就是Mybatis的动态SQL语句的全部内容。