6. 动态sql
1.动态sql
场景:查询男性用户,如果输入了姓名,按姓名模糊查询
1.1.if
场景:查询男性用户,如果输入了姓名,则按姓名查询
定义接口:
/** * 查询男性用户,如果输入了姓名,则按姓名查询 * @param name * @return */ List<User> queryUserList(@Param("name") String name);
编写mapper
<select id="queryUserList" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user WHERE sex=1 <if test="name!=null and name.trim()!=''"> and name like '%${name}%' </if> </select>
测试
@Test public void testqueryUserList() { List<User> users = this.userMapper.queryUserList(null); for (User user : users) { System.out.println(user); } }
1.2.choose when otherwise
场景:查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找,否则查找姓名为“鹏程”的用户。
定义接口:
/** * 查询男性用户,如果输入了姓名则按照姓名模糊查找,否则如果输入了年龄则按照年龄查找,否则查找姓名为“鹏程”的用户。 * @param name * @param age * @return */ List<User> queryUserListByNameOrAge(@Param("name") String name,@Param("age") Integer age);
编写mapper配置:
<select id="queryUserListByNameOrAge" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user WHERE sex=1 <!-- 1.一旦有条件成立的when,后续的when则不会执行 2.当所有的when都不执行时,才会执行otherwise --> <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>
测试:
@Test public void queryUserListByNameOrAge() throws Exception { List<User> users = this.userMapper.queryUserListByNameOrAge(null, 16); for (User user : users) { System.out.println(user); } }
1.3.where 和set
场景一:查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询,如果两者都输入,两个条件都要成立。
接口:
/** * 查询所有用户,如果输入了姓名按照姓名进行模糊查询,如果输入年龄,按照年龄进行查询,如果两者都输入,两个条件都要成立 * @param name * @param age * @return */ List<User> queryUserListByNameAndAge(@Param("name") String name,@Param("age") Integer age);
配置:
<select id="queryUserListByNameAndAge" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user <!--如果多出一个and,会自动去除,如果缺少and或者多出多个and则会报错--> <where> <if test="name!=null and name.trim()!=''"> and name like '%${name}%' </if> <if test="age!=null"> and age = #{age} </if> </where> </select>
测试:
@Test public void queryUserListByNameAndAge() throws Exception { List<User> users = this.userMapper.queryUserListByNameAndAge("鹏程", 20); for (User user : users) { System.out.println(user); } }
场景二:修改用户信息,如果参数user中的某个属性为null,则不修改。
接口:
/** * 根据id更新用户信息 * * @param user */ public void updateUser(User user);
配置:
<update id="updateUser" parameterType="com.zpc.mybatis.pojo.User"> UPDATE tb_user <trim prefix="set" suffixOverrides=","> <if test="userName!=null">
user_name = #{userName},
</if> <if test="password!=null">
password = #{password},
</if> <if test="name!=null">
name = #{name},
</if> <if test="age!=null">
age = #{age},
</if> <if test="sex!=null">
sex = #{sex},
</if> <if test="birthday!=null">
birthday = #{birthday},
</if> updated = now(), </trim> WHERE (id = #{id}); </update>
测试:
@Test public void testUpdateUser() { User user = new User(); user.setBirthday(new Date()); user.setName("静静"); user.setPassword("123456"); user.setSex(0); user.setUserName("Jinjin"); user.setId("1"); this.userMapper.updateUser(user); }
1.4.foreach
场景:按照多个id查询用户信息
接口:
/** * 按多个Id查询 * @param ids * @return */ List<User> queryUserListByIds(@Param("ids") String[] ids);
配置:
<select id="queryUserListByIds" resultType="com.zpc.mybatis.pojo.User"> select * from tb_user where id in <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>
测试:
@Test public void queryUserListByIds() throws Exception { List<User> users = this.userMapper.queryUserListByIds(new String[]{"1","2"}); for (User user : users) { System.out.println(user); } }
if:test ognl表达式或者简单java代码
choose when otherwise—>相当于if else if else
when test参考if
where set 都有一定的纠错功能
trim:prefix suffix prefixOverrides suffixOverrides
foreach:collection item saparator open close