mybatis04动态sql

通过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删除掉。
我们来实现这个

扫描二维码关注公众号,回复: 5631562 查看本文章

接口方法如下

	/** 
	 * 方法描述:动态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

猜你喜欢

转载自blog.csdn.net/qq_37989076/article/details/88602326