spring boot-mybatis(2)三种动态sql

转载 2018年04月16日 15:12:15

脚本sql

XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置
[java] view plain copy
  1. @Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>")    
  2. public List<User> findUserById(User user);    
很明显,在java中写xml可读性和维护性太差,尤其当SQL很长时,这样写是很痛苦的。

在方法中构建sql

dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider
[java] view plain copy
  1. @Mapper  
  2. public interface MybatisDao {  
  3.     //使用UserDaoProvider类的findUserById方法来生成sql  
  4.     @SelectProvider(type = UserDaoProvider.class, method = "findUserById")  
  5.     public List<User> findUserById(User user);  
  6.       
  7.     class UserDaoProvider {  
  8.         public String findUserById(User user) {  
  9.             String sql = "SELECT * FROM user";  
  10.             if(user.getId()!=null){  
  11.                 sql += " where id = #{id}";  
  12.             }  
  13.             return sql;  
  14.         }  
  15.     }  
这比<script>更加清晰,适用于查询语句不是很长、条件不多的场景,SQL很直观。但是在写很长的SQL时,这样拼接SQL同样会很痛苦

结构化SQL

[java] view plain copy
  1. public String findUserById(User user) {      
  2.             return new SQL(){{      
  3.                 SELECT("id,name");      
  4.                 SELECT("other");      
  5.                 FROM("user");      
  6.                 if(user.getId()!=null){      
  7.                     WHERE("id = #{id}");      
  8.                 }      
  9.                 if(user.getName()!=null){      
  10.                     WHERE("name = #{name}");      
  11.                 }      
  12.             //从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接      
  13.             }}.toString();      
  14.         }      
这是把前面的内部类改造一下
SELECT:表示要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT会智能的进行合并而不会重复
FROM和WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错
这样语句适用于写很长的SQL时,能够保证SQL结构清楚。便于维护,可读性高。但是这种自动生成的SQL和HIBERNATE一样,在实现一些复杂语句的SQL时会束手无策。所以需要根据现实场景,来考虑使用哪一种动态SQL
上面的例子只是最基本的用法:更多详细用法,可以参考mybatis中文网的专门介绍
http://www.mybatis.org/mybatis-3/zh/statement-builders.html

List传值错误

动态SQL中,有时要对批量数据进行处理,难免会使用list做为参数
[java] view plain copy
  1. @SelectProvider(type = UserDaoProvider.class, method = "find")  
  2.     public List<Map> find(List list);      
  3.       
  4.     class UserDaoProvider {  
  5.         public String find(List list) {  
这是一个最简单的list传参,但是在运行时会报传参错误。这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字"list",value就是他的值List,要正确传参需要使用key/value结构的map,如下
[java] view plain copy
  1. @SelectProvider(type = UserDaoProvider.class, method = "find")  
  2.     public List<Map> find(List list);      
  3.       
  4.     class UserDaoProvider {  
  5.         public String find(Map map) {  
  6.             List list = (List) map.get("list");  

spring boot-mybatis整合

  • 2016年04月01日 12:01
  • 23KB
  • 下载

Spring boot 和 mybatis 学习笔记3--动态sql

今天抽时间将mybatis 的动态sql 学习了一下,参照http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html的文档,动态sql包括   ifch...
  • tianhongqiang
  • tianhongqiang
  • 2017-03-14 09:31:10
  • 935

Spring JdbcTemplate实现通用的泛型dao三:构建动态sql

构建动态sql,其实说白了就是拼装sql语句,在这里我把传入的实体参数,属性有值的拼装进sql,为null的则忽略,要实现这个不用说,肯定要利用Java的反射功能,来看一个具有代表性的insert语句...
  • johnjobs
  • johnjobs
  • 2014-07-16 16:13:39
  • 1895

动态SQL-Spring Data Jpa

官方文档很有用一.注意事项  根据关键词,jpa可以构造许多SQL,满足基本需要。但是一些诸如更新的SQL,仍需要使用@Query动态构造。动态构造SQL时有几个对于新手来说很坑的地方需要注意下,也算...
  • beirdu
  • beirdu
  • 2017-10-31 21:42:26
  • 546

springboot_mybatis_整合(静态mapper和动态sql)

  • 2017年03月15日 22:04
  • 34KB
  • 下载

Spring Boot Jpa之构建动态SQL查询语句

Spring Boot Jpa构建动态SQL查询语句引入依赖包: org.springframework.boot spring-boot-starter-data-jpa DAO接口...
  • u011726984
  • u011726984
  • 2017-05-22 16:44:19
  • 8782

spring Data jpa 动态写sql

new Specification() { public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder c...
  • zhangweibin123
  • zhangweibin123
  • 2016-06-29 13:59:47
  • 4292

mapper里的动态sql

ifchoose (when, otherwise)trim (where, set)foreach (1)if id="findActiveBlogWithTitleLi...
  • wgf18247442000
  • wgf18247442000
  • 2016-04-13 17:10:13
  • 680

SpringBoot使用Mybatis注解开发教程-分页-动态sql

代码示例可以参考个人GitHub项目kingboy-springboot-data 一、环境配置 1.引入mybatis依赖 compile( //Sprin...
  • KingBoyWorld
  • KingBoyWorld
  • 2018-01-02 00:02:47
  • 815
收藏助手
不良信息举报
您举报文章:spring boot-mybatis(2)三种动态sql
举报原因:
原因补充:

(最多只允许输入30个字)