动态sql(if,choose, when,otherwise,where,set,foreach,trim)

MyBatis的-一个强大的特性之-通常是它的动态SQL能力。提供了OGNL表达式动态生成SQL的功能。动态SQL有:

  1. if
  2. choose, when, otherwise
  3. where, set
  4. foreach

下面都以示例来进行说明动态SQL的用法!

if:进行判断

需求1:查询男性用户,如果输入了姓名,进行模糊查找,如果不输入就按男性用户来查询。

  1. 定义接口
/** 
*查询男性用户,如果输入了姓名,进行模糊查找。
* @param name
* @return
* /
public List<User> queryUserLikeName (@Param( "name[" )String name);
  1. 编写mapper和测试类
    使用# {}的方式

mapper:

<!--进行模糊查询
	需求1:查询男性用户,如果输入了姓名,进行模糊查找。
一->
<select id= "queryByL ikeName" resultType= "User">
	select * from t_ user where sex ='男‘
	<if test="name !=null and name !='' "><!-- test可以写表达示-->
		and user_ name like #{name}
	</if>
</select>

测试类:

@Test
public void testqueryUserL ikeName(){
	List<User> list = this . userMapper . queryUserL ikeName("%cc%");
	for(User res : list){
	System. out . print1n(res);|
	}
}
  1. 使用${}的方式进行取出数据,要求在sql语句中

'%${}%'

  1. 使用#{} 去取出数据,要求在传递参数的时候,就把% 进行拼接到参数上。%张%

choose,when,otherwise:相当于java中的 if, else if的逻辑

需求二:查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找。

  1. 定义接口
/**
	*查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找。
	*@param name
	* @param age
	* @return
* /
public List<User> queryUserLikeNameOrAge(@Param(" name”)String name , @Param("age" )Integer age);
  1. 编写mapper.xml

如果其中的一个when 成立,则后的都不执行,如果所有when的都不成立,那么就执行otherwise!!!也就是谁在前面谁优先

<select id= "queryUserL ikeNameOrAge" resultType= "User">
	select * from t_ user where sex='男
	<choose>
		<when tept= "name !=null and name !=' '">
			and name = #{name }
		</when>
		<when test="age !=null and age !='' ">
			and age = #{age}
		</when>
		<otherwise></otherwise>
	</choose>
</select>
  1. 测试
@Test
public void testqueryUserL ikeNameorage(){
	List<User> user = userMapper . queryUserLikeNameorage("yanqi", nu11);
	System. out.println(user);
}

where:完成WHERE关键字,并且处理SQL语句的中语法错误

需求三:查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询。

  1. 定义接口
/**
*查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询。
*如果两个都输入,则都是条件
* @return
* /
pub1ic List<User> queryUserL ikeNameAndAgek(@Param( " name" )String name , @Param(" age")Integer age) ;

  1. 编写mapper.xml
    Where标签 代替了 where这个关键字 , 并且会把多余的and去掉
<select id= "queryUserL ikeNameAndAge" resultType= "User">
	select * from tb_ user
	<where>
		<if test= "name!=null and name!='' ">
			and name like #{ name }
		</if>
		<if test= "age!=null and age!='' ">
			and age = #{age}
		</if>
	</where>
</select>
  1. 测试
@Test
public void testqueryUserLikeNameAndAge(){
	List<User> users = userMapper. queryUserL ikeNameAndAge( "%张%",30);
	for(User user: users){
		System. out . println(user);
	}

结果:将多余的and去掉!(log4j里面的内容)
在这里插入图片描述

set:Set标签 相当于 sql中 set 关键字(和where类似)

需求四:如果名字信息不是null,则修改名字, 如果age信息不是null,同时也修改age

  1. 定义接口
/**
	*修改用户信息
	*如果名字信息不是null,则修改名字,如果age信息不是nu1l同时也修改age
	*@param user
	* @return
	*/
public Integer updateUser(@Param( "name" )String name ,@Param(“age" )Integer age ,@Param("id")Long id) ;
  1. 配置mapper.xml
    会自动去掉错的 ,(逗号)
<update id= "updateUser">
	update tb_ user
	<set>
		<if test="age != null and age != '"> age = #{age}, </if>
		<if test="name != null and name != ''"> name = #{name}, </if>
	</set>
	where id = #{id}
</update>
  1. 测试
@Test
public void testupdateUser(){
	Integer integer = userMapper . updateUser("jack", nu1l, 9);
	sqlSession. commit();
	System. out.println(integer);
}

foreach:

需求五:按照多个id查询用户信息

Select * from t_user where id in(1,2,3)
  1. 定义接口
/**
*方法描述:按照多个id查询用户信息
* @author:yangi
*/
public List<User> QueryIds (@Param("ids") int[] ids);
  1. 配置mapper.xml
    Collection:要遍历的集合, item:接受遍历集合的值in( 1,2,3)
<select id="queryUserByIds" resultType= "User">
	select * from tb_ user where id in
	<!--
		collection接受的集合
		item一个对应的变里
		open字符串拼接的开头
		close:字符串拼接的结尾
		separator,每个变里连接的时候 ,使用的分隔符
	-->
	<foreach collection= "ids" item= "id" open="(" close=")" separator=", ">
		#{id}
	</foreach>
</select>
  1. 测试
@Test
public void testqueryids(){
	List<User> list = userMapper . queryids(new int[]{1,2,3});
	for(User user : list){
		System. out. println(user);
	}
}

trim:

trim元素的主要功能是可以在自己包含的内容前加上某些前缀,也可以在其后加上某写后缀,与之对应的属性是prefix和suffix;

可以把包含内容的首部某些内容覆盖,即忽略,也可以把尾部的某些内容覆盖,对应的属性是prefixOverrides和suffixOver

  1. 案例一:(这个代替前缀,类似where)
select * from user 
  <trim prefix="WHERE" prefixOverrides="AND |OR">
    <if test="name != null and name.length()>0"> AND name=#{name}</if>
    <if test="gender != null and gender.length()>0"> AND gender=#{gender}</if>
</trim>

假如说name和gender的值都不为null的话,打印的SQL为:
select * from user where name = ‘xx’ and gender = ‘xx’

where后不存在and,这是因为prefixOverrides="AND |OR"代表去掉第一个and或者是or。

  1. 案例二:(这个代替后缀,类似set)
update user
  <trim prefix="set" suffixOverrides="," suffix=" where id = #{id} ">
    <if test="name != null and name.length()>0"> name=#{name} , </if>
    <if test="gender != null and gender.length()>0"> gender=#{gender} ,  </if>
</trim>

假如说name和gender的值都不为null的话,打印的SQL为:
update user set name=‘xx’ , gender=‘xx’ where id=‘x’

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
trim标签是一个通用标签,可以用于set或where等场景。它有几个属性,包括prefix(前缀关键字)、suffix(后缀关键字)、prefixOverrides(忽略前置字符)和suffixOverrides(忽略后置字符)。prefix属性表示要附加的前缀关键字,suffix属性表示要附加的后缀关键字,prefixOverrides属性表示要忽略前置字符,suffixOverrides属性表示要忽略后置字符。 在SQLTRIM函数是用于移除字符串的指定字符或空白。它有三个参数,分别是位置(LEADING、TRAILING或BOTH)、要移除的字串和待处理的字符串。如果不指定要移除的字串,则默认会移除空白。 trim标签在应用有多种用法。在where语句,可以使用trim标签来动态生成条件语句。在set标签,可以使用trim标签来动态生成更新语句。trim标签还可以与if标签、foreach标签等结合使用,实现更复杂的逻辑。 下面是几个使用trim标签的示例: 1. 用于where语句: <select id="getUserDy01" parameterType="map" resultType="user"> select * from user <trim prefix="where" prefixOverrides="and"> <if test="uname!=null and uname!=''"> and uname like '%${uname}%' </if> <if test="sex!=null and sex!=''"> and sex=#{sex} </if> </trim> </select> 2. 用于set标签: <update id="updateUserById" parameterType="user"> update user <trim prefix="set" suffixOverrides="," suffix="where uid=#{uid}"> <if test="uid!=null"> uid=#{uid}, </if> <if test="uname!=null and uname!=''"> uname=#{uname}, </if> <if test="sex!=null and sex!=''"> sex=#{sex}, </if> <if test="password!=null and password!=''"> password=#{password}, </if> <if test="birthday!=null"> birthday=#{birthday} </if> </trim> </update>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值