Mybatis框架——动态sql语句

Mybatis框架——动态sql语句


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

1.if
场景:查询男性用户,如果输入姓名,按照姓名查询
(方法的形式参数没有封装到对象中如何解决):
①如果参数没有封装到POJO中,例如:selectUserListBySexAndName(String sex,String username);,在mybatis中,可以使用#{param1} #{param2}去使用该传递的参数,但是建议使用对象封装值传递到mybatis中。

//mapper.java文件中
List<UserVO> selectUserListBySexAndName(String sex,String username);
//mapper.xml文件中
<select id="selectUserListBySexAndName" resultType="org.mybatis.vo.UserVO" parameterType="string">
	select id,username,password,age,sex from user where sex=#{param1} and username like "%"#{param2}"%"
</select>

②可以在方法上添加param注解

//mapper.java文件中
List<UserVO> selectUserListBySexAndName(@param("sex") String sex,@param("username") String username);
//mapper.xml文件中
<select id="selectUserListBySexAndName" resultType="org.mybatis.vo.UserVO" parameterType="string">
	select id,username,password,age,sex from user where sex=#{sex} and username like "%"#{username}"%"
</select>

实现按照输入姓名模糊查询案例
1、定义接口:
List queryUserList(@param(“name”) String name);
2、编写mapper

<select id="queryUserList" resultType="com.mybatis.pojo.User" >
	select * from user where sex=1 
	<if test="name!=null and name.trim()!='' ">
	and name like '%${name}'
	</if>
</select>

3、测试

@Test
public void testqueryUserList(){
	List<User> user = this.userMapper.queryUserList(null);
	for(User user:users){
		System.out.println(user);
	}
}

2.choose,when,otherwise
场景:查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找,否则查找姓名为"张三"的用户。
1、定义接口

List<User> queryUserListByNameOrAge(@Param("name") String name,@Param("age") Integer age);

2、编写mapper
一旦有条件成立的when,后续的when则不会执行
当所有的when都不执行时,才会执行otherwise

<select id="queryUserListByNameOrAge" resultType="com.mybatis.pojo.User"
	select * from tb_user where sex=1
	<choose>
		<when test="name!=null and name.trim()!='' ">
			and name like '%${name}%'
		</when>
		<when test="age!=null">
			and age = #{age}
		</when>
		<otherwise>
			and name="张三"
		</otherwise>
	</choose>
<select>

3、测试

@Test
public void queryUserListByNameOrAge() throws Exception{
	List<User> users = this.userMapper.queryUserListByNameOrAge(null,16);
	for(User user:users){
		System.out.println(user);
	}
}

3.where,set
①where
场景:查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询,如果两者都输入,两个条件都要成立。
1、定义接口

List<User> queryUserListByNameAndAge(@Param("name") String name,@Param("age") Integer age);

2、编写mapper
拼接时如果多出一个and会自动去除,如果缺少and或者多出多个and则会报错

<select id="queryUserListByNameAndAge" resultType="com.mybatis.pojo.User"
	select * from tb_user
	<where>
		<if test="name!=null and name.trim()!='' "> 
			and name like '%${name}%'
		</if>
		<if test="age!=null">
			and age = #{age}
		</if>
	</where>
<select>

3、测试

@Test
public void queryUserListByNameAndAge() throws Exception{
	List<User> users = this.userMapper.queryUserListByNameAndAge("张三",16);
	for(User user:users){
		System.out.println(user);
	}
}

②trim
1、定义接口

public void updateUser(User user);

2、编写mapper

<update id="updateUser" parameterType="com.mybatis.pojo.User">
	Update tb_user
	<trim prefix="set" suffixOverrides=",">
		<if test="userName!=null">user_name=#{user_name},</if>
		<if test="password!=null">password=#{password},</if>
		<if test="age!=null">age=#{age},</if>
		<if test="sex!=null">sex=#{sex},</if>		
		updated = now(),		      
	</trim>
	where (id=#{id});
</update>

trim裁剪字符串 prefix 前缀填充 suffixOverrides 后缀尾部覆盖 prefixOverrides 头部覆盖
3、测试

@Test
public void testUpdateUser(){
	User user = new User();
	user.setUserName("JiuEr");
	user.setPassword("JiuEr123");
	user.setAge(18);
	user.setSex(0);
	user.setId("1");
	this.userMapper.updateUser(user);
}

③set

<update id="updateUserBySet">
	Update tb_user
	<set>
		<if test="userName!=null">user_name=#{user_name},</if>
		<if test="password!=null">password=#{password},</if>
		<if test="age!=null">age=#{age},</if>
		<if test="sex!=null">sex=#{sex},</if>		
		updated = now(),		      
	</set>
	where (id=#{id});
</update>

最后一行的这个逗号,在程序执行时自动去除了,当然了编写程序时也可以直接不写这个逗号。但是前面的逗号不可以不写
在这里插入图片描述
4. foreach
场景:按照多个id查询用户信息
1、定义接口

List<User>  queryUserListByIds(@Param("Ids") String[] ids);

2、编写mapper

<select id="queryUserListByIds" resultType="com.mybatis.pojo.User">
	select * from tb_user where id in
	<foreach collection="ids" item="id" open="(" close=")" separator=",">
		#{id}
	</foreach>
</select>

3、测试

@Test
public void queryUserListByIds() throws Exception{
	List<User> users = this.userMapper.queryUserListByIds(news String[]{"1","2"});
	for(User user:users){
		System.out.println(user);
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九儿姑娘`

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值