动态SQL where + if

动态SQL:提高SQL的可重用性 ,工作中查询最多。

案例一:
分析需求:2个搜索字段任意查询:
1,可以按照用户查询
2,可以按照密码查询
3,可以按照用户名+密码查询
4,可以都不输入查询

四种情况分析:
默认两个字段都查询的情况:
select * from t_blog where uname=? and upass=?
如果两个字段都为空的情况:
select * from t_blog <where> (多了一个where)
如果只用第一个字段查询的情况:
select * from t_blog where uname=? and
如果只用第二个字段查询的情况:
select * from t_blog <where> and upass=?(可以自动移除多余的and)

所以根据上面的分析,这里需要我们用到动态SQL来解决问题:

在动态SQL中可以根据条件直接判断内容,动态生成需要执行的SQL语句。
<select id=”searchUserInfoByNameAndPass” parameterType=”com.zyh.pojo.UserInfo” resultMap=”BaseResultMap”>
SELECT
<include refid=”Base_Column_List”/>
FROM t_user_info
<where>
<if test=”uName !=null”>
u_name=#{uName}
</if>
<if test=”uPass !=null”>
AND u_pass=#{uPass}
</if>
</where>
</select>

if 判断 (test:指定判断表达式) 注意判断条件里面使用的是实体类中的属性进行判断。 分别注意一下 if 内部的两个参数的类型 第一个参数是数据库字段 ,第二个参数是 实体类里面的对应的属性。
<if test=”uName !=null”>
u_name=#{uName}
</if>
where 优化where条件判断 : 注意判断条件里面使用的是实体类中的属性进行判断。 分别注意一下 if 内部的两个参数的类型 第一个参数是数据库字段 ,第二个参数是 实体类里面的对应的属性。
<where>
<if test=”uName !=null”>
u_name=#{uName}
</if>
<if test=”uPass !=null”>
AND u_pass=#{uPass}
</if>
</where>
Where标签默认去掉第一个有参后面的and,如果无参数都不显示。

注意上面出入的输入参数是 对象类型 , 将上面的输入参数修改称为Map 类型 ,也是可以完成的。 请注意下面的映射文件 ,仅仅修改的地方就是 输入参数类型

<select id=”searchUserInfoByNameAndPassMap” parameterType=”java.util.Map” resultMap=”BaseResultMap”>
SELECT
<include refid=”Base_Column_List”/>
FROM t_user_info
<where>
<if test=”uName !=null”>
u_name=#{uName}
</if>
<if test=”uPass !=null”>
AND u_pass=#{uPass}
</if>
</where>
</select>

上面的两个映射文件对应的接口声明如下所示:

List<UserInfo>  searchUserInfoByNameAndPass(UserInfo userInfo);

List<UserInfo>  searchUserInfoByNameAndPassMap(Map map);

分别对应的测试类如下所示:
@Test
public void testSearchUserInfoByNameAndPass(){
SqlSession sqlSession=SqlSessionFactoryUtilSingleL.getSqlSession();
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
UserInfo user=new UserInfo();
/* user.setuPass(“111”);
user.setuName(“111”);*/
List<UserInfo> userInfos = mapper.searchUserInfoByNameAndPass(user);
System.out.println(userInfos);
}
@Test
public void testSearchUserInfoByNameAndPassMap(){
SqlSession sqlSession=SqlSessionFactoryUtilSingleL.getSqlSession();
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
Map<String ,String> integerMap =new HashMap<>();
integerMap.put(“uName”,”张颖豪”);
// integerMap.put(“uPass”,”12″);
List<UserInfo> userInfos = mapper.searchUserInfoByNameAndPassMap(integerMap);

    System.out.println(userInfos);
}
    原文作者:神豪VS勇士赢
    原文地址: https://www.jianshu.com/p/6e15f7f375d2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞