MyBatis的动态Sql查询(七)中

简介: MyBatis的动态Sql查询(七)

四. trim() 去除前后缀


<select id="findAllF3" parameterType="user" resultMap="userResultMap">
    select * from user t  <!-- 去掉第一个and -->
    <trim prefix="where" prefixOverrides="and">
      <if test="name!=null and name!=''">
        and t.name like concat('%',#{name},'%')
      </if>
      <if test="age!=null">
        and t.age>#{age}
      </if>
    </trim>
  </select>


前缀 prefix 是 where , 去除前缀注解 prefixOverrides 的and , 即去除where 后的第一个and 关键字, 这样就可以在每一个 语句后面跟上 and 而不出错了。


除了前缀之外,还有后缀 suffix 和对应的suffixOverrides 。


常见的是前缀, 去除的是 and 或者是 or.


五. choose (when,otherwise) 多分支选择


在前面的两个参数 name,age 时 查询,是多条件查询, name 和sex 是没有先后顺序的。 而在业务当中,常常是有先后顺序的。 如 name 有值,则查询name, name 无值 则去查询age, 如果age 仍然没有值,则保证 description 描述不能为空, 查询的条件之间是有明显的先后顺序的。 这个时候,就需要用 choose 了。


接口:


//有顺序的查询
  List<User> findAllF4(User user);


sql 语句: (先用以前的 1=1 模式)


<select id="findAllF4" parameterType="user" resultMap="userResultMap">
    select * from user t where 1=1
    <!--总的选择开头-->
    <choose>
      <!--对每一种情况进行判断-->
      <when test="name!=null and name!=''">
        and t.name like concat('%',#{name},'%')
      </when>
      <when test="age!=null">
        and t.age>#{age}
      </when>
      <!--所有条件都不符合,执行 otherwise -->
      <otherwise>
        and t.description is not null
      </otherwise>
    </choose>
  </select>


测试方法:


@Test
  public void findAllF4Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    //user.setName("蝴蝶飞");  //填写时, 不填写时不又其作为查询条件。
    //两个条件时  有一定的先后顺序。
    user.setName("蝴蝶飞");
    user.setAge(24);
    List<User> allList=userMapper.findAllF4(user);
    allList.forEach(n ->System.out.println(n));
  }


如果name 有值的话:


20190704193147830.png


如果 name 无值, age 有值的话:


20190704193222202.png


如果 name 和age 均没有值的话:


20190704193256798.png


这样,就达到了 有先后顺序的查询了。


转换成 where 语句为:


<select id="findAllF4" parameterType="user" resultMap="userResultMap">
    select * from user t
    <where>
      <choose>
        <when test="name!=null and name!=''">
          and t.name like concat('%',#{name},'%')
        </when>
        <when test="age!=null">
          and t.age>#{age}
        </when>
        <otherwise>
          and t.description is not null
        </otherwise>
      </choose>
    </where>
  </select>


六. set 更新部分字段


关于update 语句的用法,可以看第三章, 那个时候,更新都是更新全部的字段,无法进行部分字段的更新。 而以前所讲的Hibernate 只能进行全部字段的更新,这也是Hibernate 效率低的原因之一。


<update id="updateUser" parameterType="user">
    update user set name=#{name},sex=#{sex},age=#{age},description=#{description}
    where id=#{id}
  </update>


而MyBatis 通过 set 语句,很好的解决了这一点。


接口:


int updateF5(User user);


sql 语句:


<update id="updateF5" parameterType="user">
    update user 
    <set>
      <if test="name!=null and name!=''">
        name=#{name},
      </if>
      <if test="age!=null">
        age=#{age},
      </if>
      <if test="description !=null">
        description=#{description}
      </if>
    </set>
    where id=#{id}
  </update>


六.一 查询数据库更新


@Test
  public void findAllF51Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=userMapper.getById(1);
    user.setName("部分更新字段123");
    user.setDescription("只修改部分字段");
    userMapper.updateF5(user);
    sqlSession.commit();
  }


20190704193800715.png


会将数据库中查询出来的值进行判断,如果有值,那么就进行更新,没有值,就不更新。 如果将此时的 age字段在数据库中设置为null 的话.


20190704194009750.png


再次运行的话:


20190704194039680.png


发现,这个时候 就不会更新 age 字段了。


六.二 设置对象bean 更新


@Test
  public void findAllF52Test(){
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    User user=new User();
    user.setId(1);
    user.setName("部分更新字段");
    user.setDescription("只修改部分字段");
    userMapper.updateF5(user);
    sqlSession.commit();
  }


这个时候,运行的话,是不会更新其他的字段的。


2019070419423173.png

相关文章
|
7天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
12天前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
11 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
9天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
47 10
|
3天前
|
SQL 关系型数据库 MySQL
|
17天前
|
SQL 数据库 开发者
功能发布-自定义SQL查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
|
18天前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
20 1
|
30天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
24天前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
1月前
|
SQL Java 数据库连接
如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
【10月更文挑战第6天】在代码与逻辑交织的世界中,我从一名数据库新手出发,通过不断探索与实践,最终成为熟练掌握JDBC的开发者。这段旅程充满挑战与惊喜,从建立数据库连接到执行SQL语句,再到理解事务管理和批处理等高级功能,每一步都让我对JDBC有了更深的认识。示例代码展示了如何使用`DriverManager.getConnection()`连接数据库,并利用`PreparedStatement`执行参数化查询,有效防止SQL注入。
76 5
|
1月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言

热门文章

最新文章

下一篇
无影云桌面