脚本SQL

  xml配置方式见mybatis讲解,下面是用<script>的方式把它照搬过来,用注解来实现。适于xml配置转换到注解配置

    @Select("<script>select * from cat <if test=\"id != null \"> where id = #{id} </if></script>")
List<Cat> fintCatById(Cat param);

很明显,在java中写xml可读性和维护性太差,尤其 当sql很长时,这样写是很痛苦的。

在方法中构建SQL

  dao接口中是不能写实现的,所以这里借用内部类来生成动态sql。增删改也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider

    //使用CatDaoProvider类中的findCatById方法 来生成sql
@SelectProvider(type=CatDaoProvider.class,method = "findCatById")
List<Cat> findCatById(Cat cat); class CatDaoProvider{
public String findCatById(Cat cat){
String sql = "select * from Cat";
if(cat.getId() != null){
sql += " where id = #{id} ";
}
return sql;
}
}

这种方法比<script>更加清晰,适用于查询语句不是很长、条件不多的场景,sql很直观。但是在写很长的sql时,这样拼接sql同样很痛苦。

结构化SQL

    class CatDaoProvider{
public String findUserById(Cat cat) {
return new SQL(){{
SELECT("id,cat_name,cat_age");
FROM("cat");
if(cat.getId() != null){
WHERE("id = #{id}");
}
if(cat.getCatName() != null){
WHERE("cat_name != #{catName}");
}
}}.toString();//内部使用高效的StringBuilder实现sql拼接
}
}

把前面的内部类改造一下

  SELECT:表示 要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT 会只能的进行合并而不会重复。

  FROM和WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错

这样的语句很适合写很长的sql,能够保证代码结构清楚,便于维护,可读性高。但是这种自动生成的sql和hibernate一样,在实现一些复杂语句的sql时会束手无策。

List传值错误

  动态sql中,有时要对批量数据进行处理,难免会使用list作为参数

    @SelectProvider(type=CatDaoProvider.class,method = "find")
List<Map> find(List list);

传递list参数时,在运行时会报传参错误,这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是Key/value结构的list时,mybatis会自动把它转换成key、value结构,key就是他的名字"list" ,value就是他的值 list,要正确传参需要使用key/value结构的map:

    @SelectProvider(type=CatDaoProvider.class,method = "find")
List<Map> find(List list); class CatDaoProvider{
public String find(Map map) {
List list = (List) map.get("list");

Spring Boot (10) mybatis三种动态sql的更多相关文章

  1. spring boot(8)-mybatis三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  2. Spring boot 配置 mybatis xml和动态SQL 分页配置

    更新时间 2018年4月30日23:27:07 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  3. spring boot-mybatis三种动态sql(5)

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  4. Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...

  5. spring boot 配置mybatis plus 控制台打印sql

    spring boot 版本2.1.5 mybatis plus 版本3.1.1 aplication.properties中添加 logging.level.com.demo.system.mapp ...

  6. Spring boot配置Dubbo三种方式

    方式一 使用注解的方式 导入dubbo-starter 在application.properties配置属性 使用@Service暴露服务 使用@Reference引用服务 使用@EnableDub ...

  7. Spring Boot 实战 —— MyBatis(注解版)使用方法

    原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...

  8. Spring Boot将Mybatis返回结果转为驼峰的三种实现方式

    本文不再更新,可能存在内容过时的情况,实时更新请访问原地址:Spring Boot将Mybatis返回结果转为驼峰的三种实现方式: 我们通常获取Mybatis返回的数据结果时想要将字段以驼峰的形式返回 ...

  9. spring与mybatis三种整合方法

    spring与mybatis三种整合方法 本文主要介绍Spring与Mybatis三种常用整合方法,需要的整合架包是mybatis-spring.jar,可通过链接 http://code.googl ...

随机推荐

  1. vue刷新本页面

    顶层app.vue页面 <template> <div id="app"> <router-view v-if="isRouterAlive ...

  2. ceph对接openstack环境

    环境准备: 保证openstack节点的hosts文件里有ceph集群的各个主机名,也要保证ceph集群节点有openstack节点的各个主机名 一.使用rbd方式提供存储如下数据: (1)image ...

  3. 使用脚手架创建vue项目之后会有很多警告,如何关闭它!

    依次打开build→webpack.base.conf.js文件,然后找到createLintingRule,把里面的内容选择性的删除即可,就是这么easy;

  4. 阅读《JavaScript设计模式》第三章心得

    简单工厂模式 1.通过类实例化对象创建 传统的用面向对象方法去创建很多类去实现某些功能不妥当,这样不仅占用的很多类名称,而且别人使用这些方法的同时要记住每个类的名字,所以这样不适合团队开发,所以我们可 ...

  5. copy contents of file with variable number in Matlab

    input : transient.case output: transient_1.case, transient_2.case, transient_3.case ... ************ ...

  6. UVALIVE 6958 Indoorienteering

    题目大意:有不超过14个点组成的完全图,给出邻接矩阵,问是否存在长度为W的欧拉回路? 数据范围:n<=14, w<=1e15: standard input/output 7 s, 256 ...

  7. FOJ2250 不可能弹幕结界

    Problem 2250 不可能弹幕结界 Time Limit: 1000 mSec    Memory Limit : 65536 KB Problem Description 咲夜需要穿过一片弹幕 ...

  8. 关于OpenCV图像操作的默认参数问题

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51559490 在使用OpenCV以及其 ...

  9. Master Nginx(7) - Nginx for the Developer

    Caching integration No application caching Caching in the database Caching in the filesystem Changin ...

  10. 清北学堂模拟赛d1t5 拍照(photo)

    题目描述 假设这是一个二次元.LYK召集了n个小伙伴一起来拍照.他们分别有自己的身高Hi和宽度Wi.为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi}的相框. ...