动态sql之if(映射文件深入)
动态SQL语句概述:
MyBatis的映射文件中, 前面我们的SQL都是比较简单的, 但是以后有一些时候业务逻辑比较复杂的时候,我们的SQL是动态变化的, 此时在前面的学习中我们的静态SQL就不能满足了
关于动态SQL, 我们要学习四个标签:
- if
- choose(when, otherwise)
- trim(where, set)
- foreach
- if和foreach标签比较重要, if标签最重要的, 我们以后使用if标签使用的也是最多的
动态sql实际问题引入:
映射文件中:
<mapper namespace="com.ffyc.mapper.UserMapper">
<select id="findByCondition" parameterType="user" resultType="user">
select * from user where id=#{id} and username=#{username} and password=#{password}
</select>
</mapper>
创建Mapper接口:
public interface UserMapper{
public List<User> findByCondition(User user);
}
编写逻辑层代码:
public void test1() throws IOException{
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//模拟条件User, 也就是创建一个User对象用来测试
User condition = new User();
condition.setId(1);
condition.setUsername("zhangsan");
condition.setPassword("123");
List<User> userList = mapper.findByCondition(condition);
System.out.println(userList);
}
-
所以我们的测试结果应该是将这个id属性值为1, username为zhangsan, password属性值为123的人查询出来
-
但是如果我们将condition.setPassword(“123”)注释掉,这个时候我们再查询的时候就会发现是查询不出结果的, 这个时候是因为我们前面映射文件中写的是: select * from user where id=#{id} and username=#{username} and password=#{password}, 但是这个时候我们没有给password属性赋值, 这个时候对应的执行的语句就会是: select * from user where id=1 and username=zhangsan and password=null
-
因为我们的password是我们的User类中的成员变量, 如果我们没有给这个成员变量赋值的时候就默认值为: null, 所以此时我们查询的时候就是查询表中id值为1, username值为zhangsan, password属性值为null的, 满足这个条件的我们的数据库中是没有的, 所以最终就会返回一个null, 然后我们最终打印的userList的结果就会是一个null
-
这个时候我们的需求是: 当我们如果给某个字段没有填充值的时候这个字段就不参与where条件后面的判断:
- eg: 比如此时我们没有给User对象的password属性赋值, 此时那么我们就应该只使用id和username属性来判断数据库中是否有满足条件的记录, 也就是执行的查询语句为: select * from user where id=1 and username=zhangsan
-
那么我们要如何才能做到我们的需求?
- 这个时候我们要将映射文件改为如下:
<mapper namespace="com.ffyc.mapper.UserMapper"> <select id="findByCondition" parameterType="user" resultType="user"> select * from user where 1 = 1 <if test = "id != 0"> and id = #{id} </if> <if test = "username != null"> and username = #{username} </if> <if test = "password != null"> and password = #{password} </if> </select> </mapper>
-
-