zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    STL函数对象和Lambda表达式
    STL算法之排序算法
    STL 算法
    STL源码剖析---根据最新版本的g++4.9.0(支持C++11)的修订(1)空间配置器
    STL Iterator的里里外外(一)?
    STL对比解说——关联容器
    Select单进程非阻塞TCP echo服务器
    TCP建立(3次握手)与终止(4次挥手)
    TIME_WAIT状态
    C标准I/O库
  • 原文地址:https://www.cnblogs.com/jvStarBlog/p/12736086.html
Copyright © 2011-2022 走看看