我们之前在配置文件中写的sql都是死代码,每次查询需要不同的条件都需要去修改sql语句,如果我们将sql语句设置成动态的,就可以根据参数的不同进行不同的查询了。
一、if判断
我们可以通过if语句对传入的参数进行判断,检查是否有此参数,如果条件参数为空或空字符串,那么就不添加这个条件;如果有这个条件参数,就进行条件查询。
第一步:定义接口中的方法
//动态sql:if判断
List<User> queryUserList(User user);
第二步:在配置文件中添加sql语句
<!-- 1=1:如果没有这个恒等式,if条件满足了,sql语句的拼接就会出现问题
if里面的test:用于添加if判断的条件
-->
<select id="queryUserList" resultType="domain.User">
select * from user where 1=1
<if test="id != null ">
and id = #{id}
</if>
<if test="address != null and address != ''">
and address = #{address}
</if>
</select>
第三步:在测试类中进行测试
@Test
public void getUserIf() throws Exception {
UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
User user = new User();
user.setId(16);
user.setAddress("上海");
List<User> list = mapper.queryUserList(user);
for (User user2 : list) {
System.out.println(user2.toString());
}
}
二、where
在我们不知道是否有查询条件的时候,如果只使用if进行判断的话,还需要添加一个恒等条件,防止sql语句出现问题;如果我们配合where标签使用,就会非常简单。
修改上面案例中的配置文件,然后进行测试
<select id="queryUserList" resultType="domain.User">
select * from user
<where>
<if test="id != null ">
and id = #{id}
</if>
<if test="address != null and address != ''">
and address = #{address}
</if>
</where>
</select>
三、foreach
sql语句中可以使用in进行范围查询,如果我们想要实现动态输入范围,就需要使用foreach。
接口添加方法
//使用in范围查询
List<User> queryUserIn(List<Integer> list);
在配置文件中添加sql语句
- collection:属性值应该与我们输入映射的参数一致
- open:指定我们开始的连接部分
- close:指定我们结束部分的连接
- separator:指定连接的连接符
- item:表示我们循环迭代的别名
<select id="queryUserIn" resultType="domain..User">
select * from user
<where>
<foreach collection="list" open=" id in (" close=")" separator="," item="id">
#{id}
</foreach>
</where>
</select>
在测试类中进行测试
@Test
public void queryUserIn() throws Exception {
UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(10);
list.add(16);
list.add(22);
List<User> userList = mapper.queryUserIn(list);
for (User user : userList) {
System.out.println(user.toString());
}
sqlSession.close();
}
四、sql片段
sql片段可以用来存放我们需要查询的内容。
接口中添加方法
//使用sql片段查询
List<User> getUsers(User user);
在配置文件中添加sql语句
<!-- sql片段 -->
<sql id="baseSql">
id,username,birthday,sex,address
</sql>
<select id="getUsers" resultType="domain.User">
select <include refid="baseSql"/>
from user where
address like '%${address}%'
</select>
在测试类中进行测试
@Test
public void queryUsers() throws Exception {
UserMapperInterface mapper = sqlSession.getMapper(UserMapperInterface.class);
User user = new User();
user.setAddress("上海");
List<User> list = mapper.getUsers(user);
for (User user2 : list) {
System.out.println(user2.toString());
}
}
网友评论