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

 

posted @ 2020-04-20 09:58  11014p  阅读(163)  评论(0编辑  收藏  举报