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);
}
}