动态SQL

动态SQL中的关键字

>    if

>    choose

>    foreach

>    where、trim、set

我们在映射器中配置相应的SQL语句

1、if  多条件查询(动态查询)

    通过test属性进行条件判断,决定是否拼接相应的SQL语句

        <select id="getPersonList3" resultMap="Person2" parameterType="map">
		select * from t_person
		where pid > #{pid}
		<if test="pname!=null">
			and person_name like #{pname}
		</if>
		<if test="age!=null">
			and age > #{age}
		</if>
		<if test="address!=null">
			and person_address like #{address}
		</if>
	</select>

 对应的java 测试代码

	@Test
	public void getPersonList3(){
		Map<String,Object> params = new HashMap<String, Object>();
		params.put("pid",5);
//		params.put("pname", "%m%");
//		params.put("age", 10);
//		params.put("address", "%k%");
		List<Person> persons = session.selectList("com.kgc.mybatis.pojo.getPersonList3", params);
		for (Person person : persons) {
			System.out.println(person);
		}
	}

描述需求:一般查询中,会根据自己的意愿,可以有多个或者模糊查询来控制条件,也有可能没有条件。

2、choose

相当于java中的switch 语句,提供了多种判断条件,如果有符合要求的下面的不执行。

	<select id="getPersonList4" resultMap="Person2" parameterType="map">
		select * from t_person
		where pid > #{pid} 
		<choose>
			<when test="pname!=null">
				 and person_name like #{pname} 
			</when>
			<when test="age!=null">
				 and age > #{age} 
			</when>
			<when test="address!=null">
				 and person_address like #{address} 
			</when>
			<otherwise> and 1=1 </otherwise>
		</choose>	
	</select>

    choose、when、otherwise 对应的是java中的switch、case、default,根据条件判断执行哪一个分支

对应的java 测试代码

	@Test
	public void getPersonList4(){
		Map<String,Object> params = new HashMap<String, Object>();
		params.put("pid",1);
//		params.put("pname", "%m%");
//		params.put("age", 10);
//		params.put("address", "%k%");
		List<Person> persons = session.selectList("com.kgc.mybatis.pojo.getPersonList4", params);
		for (Person person : persons) {
			System.out.println(person);
		}
	}

3、where

   前面两个我们都用了 where 1=1 ,但是使用 where 可以不这样处理

映射代码如下:

	<select id="getPersonList5" resultMap="Person2" parameterType="map">
		select * from t_person
		<where>
			<if test="pid!=null">
			<!--第一个 and 可以删  -->
				and pid > #{pid}
			</if>
			<if test="pname!=null">
				and person_name like #{pname}
			</if>
			<if test="age!=null">
				and age > #{age}
			</if>
			<if test="address!=null">
				and person_address like #{address}
			</if>
		</where>
	</select>

 如上,当判断第一个是,会只能删除前面多余的 and。

   以下对应测试代码,跟上面相同,考虑到篇幅就不写了。

4、set

  当我们更新操作时,使用set元素可以帮助我们去掉多余的逗号

映射代码如下:

	<update id="updatePerson" parameterType="map">
		update t_person
		<set>
			<if test="pname!=null"> person_name = #{pname}, </if>
			<if test="age!=null"> age = #{age}, </if>
			<if test="address!=null"> person_address = #{address}, </if>
		</set>
		where pid = #{pid} 
	</update>

java测试代码如下:

	@Test
	public void updatePerson(){
		Map<String,Object> params = new HashMap<String, Object>();
		params.put("pid",1);
		params.put("pname", "jim");
		params.put("age", 10);
		params.put("address", "kgc");
		int count = session.update("com.kgc.mybatis.pojo.updatePerson", params);
		System.out.println(count>0?"update success":"update fail!");
	}

5、trim

trim可以帮我们加入和减少SQL的前缀和后缀

映射代码如下:

	<select id="getPersonList6" resultMap="Person2" parameterType="map">
		select * from t_person
		<trim prefix="where" prefixOverrides="and|or">
				<if test="pid!=null">
					pid > #{pid}
				</if>
				<if test="pname!=null">
					and person_name like #{pname}
				</if>
				<if test="age!=null">
					and age > #{age}
				</if>
				<if test="address!=null">
					 and person_address like #{address}
				</if>
		</trim>
	</select>

以上代码就相当于使用 where 标签, 当 if 条件成立时,profixOverrides="and"的作用是去掉SQL前面的“and”,prefix=“where” 的作用是在SQL前面加上“where”。

相应的属性还有suffix 和 suffixOverrides ,用于处理SQL 后面的内容(set)

	<update id="updatePerson2" parameterType="map">
		update t_person
		<trim prefix="set" suffixOverrides=",">
			<if test="pname!=null"> person_name = #{pname}, </if>
			<if test="age!=null"> age = #{age}, </if>
			<if test="address!=null"> person_address = #{address}, </if>
		</trim>
		where pid = #{pid} 
	</update>

 

6、foreach

映射代码如下:

	<select id="getPersonList7" resultMap="Person2" parameterType="map">
		select * from t_person where pid in
		<foreach collection="list" item="pidTemp" open="(" close=")" separator=",">
			#{pidTemp}
		</foreach>
	</select>

  foreach元素中的属性含义解释如下:

>  collection: 传递进来的 list 接口

>  item: 配置循环的当前元素,表示集合中每一个元素进行迭代时的别名

>  index: 当前元素的索引值,指定一个名称,用于表示在迭代的过程中每次迭代到的位置

>  open、close: 配置使用什么符号把集合元素包装起来

>  separator: 每个元素的间隔符

测试关键代码:

	@Test
	public void getPersonList7(){
		List<Integer> list = new ArrayList<Integer>();
		list.add(1);
		list.add(2);
		list.add(3);
		List<Person> persons = session.selectList("com.kgc.mybatis.pojo.getPersonList7", list);
		for (Person person : persons) {
			System.out.println(person);
		}
	}

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值