MyBatis的-一个强大的特性之-通常是它的动态SQL能力。提供了OGNL表达式动态生成SQL的功能。动态SQL有:
- if
- choose, when, otherwise
- where, set
- foreach
下面都以示例来进行说明动态SQL的用法!
if:进行判断
需求1:查询男性用户,如果输入了姓名,进行模糊查找,如果不输入就按男性用户来查询。
- 定义接口
/**
*查询男性用户,如果输入了姓名,进行模糊查找。
* @param name
* @return
* /
public List<User> queryUserLikeName (@Param( "name[" )String name);
- 编写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);|
}
}
- 使用${}的方式进行取出数据,要求在sql语句中
'%${}%'
- 使用#{} 去取出数据,要求在传递参数的时候,就把% 进行拼接到参数上。
%张%
choose,when,otherwise:相当于java中的 if, else if的逻辑
需求二:查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找。
- 定义接口
/**
*查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找。
*@param name
* @param age
* @return
* /
public List<User> queryUserLikeNameOrAge(@Param(" name”)String name , @Param("age" )Integer age);
- 编写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>
- 测试
@Test
public void testqueryUserL ikeNameorage(){
List<User> user = userMapper . queryUserLikeNameorage("yanqi", nu11);
System. out.println(user);
}
where:完成WHERE关键字,并且处理SQL语句的中语法错误
需求三:查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询。
- 定义接口
/**
*查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询。
*如果两个都输入,则都是条件
* @return
* /
pub1ic List<User> queryUserL ikeNameAndAgek(@Param( " name" )String name , @Param(" age")Integer age) ;
- 编写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>
- 测试
@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
- 定义接口
/**
*修改用户信息
*如果名字信息不是null,则修改名字,如果age信息不是nu1l同时也修改age
*@param user
* @return
*/
public Integer updateUser(@Param( "name" )String name ,@Param(“age" )Integer age ,@Param("id")Long id) ;
- 配置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>
- 测试
@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)
- 定义接口
/**
*方法描述:按照多个id查询用户信息
* @author:yangi
*/
public List<User> QueryIds (@Param("ids") int[] ids);
- 配置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>
- 测试
@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
- 案例一:(这个代替前缀,类似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。
- 案例二:(这个代替后缀,类似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’