通过mybatis提供的各种标签方法实现动态拼接sql
我们将在上一个项目的基础上实现,使用的是User类
我们将实现三种动态sql语句的拼接,我直接写完,然后再进行讲解
这是我们需要用到的接口方法
/**
* 方法描述:动态sql -if 查找用户,去掉and
* @return
*/
public List<User> selectIf(Map< String , Object> map);
/**
* 方法描述:动态sql -set 修改用户,去掉逗号
* @return
*/
public int updateUser(User user);
我们开始写配置文件。
在现实生活中,我们需要依据用户传进来的数据进行查询,当有好几个条件的时候,我们接受起来会变得困难,因为有些选择可以空着。
比如你给他设计的可以传入用户名、性别、地址,用户可能只输入用户名,也可能只输入地址。
我们最先想到的是先判断用户传过来的数据是否为空,如果为空,就不使用了,如果不为空,就把条件加到sql语句的where中。
而且同样的问题也出现在修改里面,用户进入修改页面,有可能只是修改几个值,但我们用form表单传回来的时候,其他值就会是null,我们写update语句的时候,如果不小心加上,就会出现把一些信息清空的现象。
所以我们也需要进行判空。
我们使用mybatis动态管理,就有了更好的处理办法。
可以使用 if 标签来进行判断
如下:
<!-- 动态sql :if用例 -->
<select id="selectIf" parameterType="map" resultType="User">
select * from user where
<if test="sex!=null and sex!=''">
sex = #{sex}
</if>
<if test="address!=null and address!=''">
and address like concat ("%", #{address},"%")
</if>
</where>
</select>
注意,第二个 if 语句里面要加上and
进行连接。但会出现问题,就是当用户不传入sex,生成的where语句就会多了一个and,这样该怎么处理呢?
我么也可以在where后面加一个1=1,就可以完美的避开这个问题,这种方式也是我们手工实现sql拼接的方式。然而现在我们有了更好的方法。
我们使用where标签
<!-- 动态sql :if用例 -->
<select id="selectIf" parameterType="map" resultType="User">
select * from user
<!-- where:去除多余的and 或者是 or -->
<where>
<if test="sex!=null and sex!=''">
and sex = #{sex}
</if>
<if test="address!=null and address!=''">
and address like concat ("%", #{address},"%")
</if>
</where>
</select>
如图where的作用是 where:去除多余的and 或者是 or
这样我们就完成了一个动态sql拼接。可以使用了。
同样的修改也有相对应的标签,标签使用如下:
<!-- set :去除多余的逗号-->
<update id="updateUser" parameterType="User" >
update user
<set>
<if test="userName!=null and userName!=''">
username = #{userName},
</if>
<if test="sex!=null and sex!=''">
sex = #{sex},
</if>
<if test="address!=null and address!=''">
address = #{address}
</if>
</set>
where id = #{id}
</update>
俩个的测试方法如下
public void testIf(){
HashMap<String, Object> map = new HashMap<>();
map.put("sex", "男");
map.put("address","山东");
List<User> list = userMapper.selectIf(map);
System.err.println(list);
sqlSession.close();
}
@Test
public void testSet() {
User user = new User();
user.setId(53);
user.setUserName("rosss");
user.setAddress("啊啊啊");
int updateUser = userMapper.updateUser(user);
System.err.println(updateUser);
sqlSession.commit();
sqlSession.close();
}
新增和删除单个就不需要条件了。删除多个也可以用where。
还有一个批量操作
foreach
使用foreach可以应用于delete多条数据的时候,就是你知道好几个id,然后一次性删除。(或者一次性查询多个知道id的信息)
我们的sql语句可以使用这种方式
delete from user where id in (53,54)
就是把id为53、54删除掉。
我们来实现这个
接口方法如下
/**
* 方法描述:动态sql -foreach : 批量删除
* @param ids
* @return
*/
public int deleteBatch(List<Integer> ids);
测试方法如下
@Test
public void testForEach() {
List<Integer> ids = new ArrayList<>() ;
ids.add(49);
ids.add(101);
userMapper.deleteBatch(ids);
sqlSession.commit();
System.err.println();
sqlSession.close();
}
我们使用的是用一个list数组进行传递我们知道的id信息。
配置文件如下:
<!-- foreach : 批量删除
collection: 集合的类型。可以是list(list集合) / array(数组) / map /pojo包装类中的属性名
item: 循环中的当前对象
open: 循环的开始
close: 循环的结束
separator: 分隔符
-->
<delete id="deleteBatch" parameterType="int">
delete from user where id in
<foreach collection="list" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
上面就是我们的配置文件,使用foreach的方法,进行遍历id,也挺简单的
本场到此结束
END