【本篇博客,有配套视频,视频地址:《Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二@Provider》,公众号中点击下面的阅读原文,视频中讲解的更详细】
需求缘起:
网友1:这样如果是不定条件查询怎么解决呢?也就是xml中可以用if标签,注解怎么搞呢?
网友2:这动态sql用注解的方式不太方便吧!博主有好方法,请推出参照一下,一直没用注解的原因,就是动态sql没有好的方式,包括when foreach!针对简单的查询还是可以的!
在上一篇博客中,我们使用了<script>方法使用if test标签,但是怎么看代码怎么都不舒服,本篇博客使用另外一种方式解决这个问题。
本章大纲:
(2)@Provider使用思路
(3)@SelectProvider小试牛刀
(4)@SelectProvider初露锋芒
(5)@SelectProvider过关斩将
(6)@InsertProvider小弟不敢当
(7)@UpdateProvider你加我来改
(8)@DeleteProvider不高兴就删
接下来看下具体的内容:
(1)动态语言注解
对于创建动态的查的语言。MyBatis提供了多个注解如:@InsertProvider,@UpdateProvider,@DeleteProvider和@SelectProvider,这些都是建立动态语言和让MyBatis执行这些语言。
(2)@Provider使用思路
对于MyBatis提供的几个@Provider,里面最主要的参数是type,也就是sql类的Calss对象,另外就是对应的方法名,我们看SelectProvider的源代码:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface SelectProvider { Class<?> type(); String method(); }
所以要实现动态的SQL查询,那么大体的思路就是,编写一个SqlProvider,比如:DemoSqlProvider,在此方法中返回一条SQL语句即可。然后在Mapper类中使用@SelectProvider注解,指定provider类和对应的SQL方法。
接下来我们来解决上一篇博客的问题:
问题:有一个表中有id,name,email等字段,有这么一个查询要求:我们希望的是如果name不为null的话,那么就当做条件,否则就不要当做条件;如果email不为null,那么就当做条件,否则不当做条件。
接下里看看怎么使用@SelectProvider破。
(3)@SelectProvider小试牛刀
我们先编写一个DemoSqlProvider,代码如下:
package com.kfit.demo.mapper; import com.kfit.demo.bean.Demo; public class DemoSqlProvider { /** * 查询语句. * @param demo * @return */ public String select5(Demo demo){ StringBuffer sql = new StringBuffer("select *from demo where 1=1 "); if(demo.getName() != null){ sql.append(" and name=#{name}"); } if(demo.getEmail() != null){ sql.append(" and email=#{email}"); } return sql.toString(); } }
在DemoMapper中加入查询方法:
@SelectProvider(type=DemoSqlProvider.class,method="select5") public List<Demo> select5(Demo demo);
这里使用@SelectProvider,不是@Select了。
访问1:http://127.0.0.1:8080/select4会返回全部数据,动态SQL是:
SELECT * from Demo WHERE 1=1
访问2:http://127.0.0.1:8080/select4?name=王五 会返回name=王五的数据,动态SQL是:
SELECT * from Demo WHERE 1=1 and name=?
访问3:http://127.0.0.1:8080/select4?name=王五&email=aa@qq.com会返回name=王五并且email=aa@qq.com的数据,动态SQL是:
SELECT * from Demo WHERE 1=1 and name=? and email=?
(4)@SelectProvider初露锋芒
上面的代码直接纯SQL编写了,可读性还是相对差了点,MyBatis提供了SQL类(org.apache.ibatis.jdbc.SQL),可以让代码看起来更有意义。
在DemoSqlProvider中加入方法:
/** * 查询语句.使用SQL * @param demo * @return */ public String select6(final Demo demo){ return new SQL(){{ SELECT("id,name,email"); FROM("demo"); if(demo.getName() != null){ WHERE("name=#{name}"); } if(demo.getEmail() != null){ WHERE("email=#{email}"); } }}.toString(); }
在DempMapper中加入代码:
@SelectProvider(type=DemoSqlProvider.class,method="select6") public List<Demo> select6(Demo demo);
(5)@SelectProvider过关斩将
原以为万事大吉了,开心的不行,于是乎,信手拈来句代码,在查询代码加入:
PageHelper.startPage(1, 2); 整个代码如下:
@RequestMapping("/select6") public List<Demo> select6(Demo demo){ PageHelper.startPage(1, 2); return demoService.select6(demo); }
运行,访问:http://127.0.0.1:8080/select6 完了,这是什么鬼:
nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'providerTakesParameterObject' in 'class org.apache.ibatis.builder.annotation.ProviderSqlSource'
出现以上问题,是由于我们使用的PageHelper版本导致的,升级版本即可。
原先的版本为:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.1.0</version> </dependency>
升级为:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>4.2.1</version> </dependency>
貌似:4.1.5就支持@SelectProvider分页查询了(未进行验证)。
(6)@InsertProvider小弟不敢当
最麻烦的查询搞定了之后,这个就简单了,
在DemoSqlProvider中加入如下代码:
/** * 查询语句.使用SQL * @param demo * @return */ public String save3(final Demo demo){ return new SQL(){{ INSERT_INTO("demo"); //多个写法. INTO_COLUMNS("name","email"); INTO_VALUES("#{name}","#{email}"); //条件写法. // if(demo.getName() != null){ // VALUES("name","#{name}"); // } // if(demo.getEmail() != null){ // VALUES("email","#{email}"); // } }}.toString(); }
在DemoMapper中加入如下代码:
@InsertProvider(type=DemoSqlProvider.class,method="save3") @Options(keyProperty="id",keyColumn="id",useGeneratedKeys=true) public void save3(Demo demo);
到此搞定。
(7)@UpdateProvider你加我来改
DemoSqlProvider中的代码如下:
/** * @param demo * @return */ public String update2(final Demo demo){ return new SQL(){{ UPDATE("demo"); //条件写法. if(demo.getName() != null){ SET("name=#{name}"); } if(demo.getEmail() != null){ SET("email=#{email}"); } WHERE("id=#{id}"); }}.toString(); }
在DemoMapper中的代码:
@UpdateProvider(type=DemoSqlProvider.class,method="update2") public int update2(Demo demo);
(8)@DeleteProvider不高兴就删
DemoSqlProvider代码:
/** * @param demo * @return */ public String delete2(){ return new SQL(){{ DELETE_FROM("demo"); WHERE("id=#{id}"); }}.toString(); }
在DemoMapper中的代码:
@UpdateProvider(type=DemoSqlProvider.class,method="delete2") public int delete2(int id);
好了这篇文章介绍的太多了,休息下。
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
mybatis-spring-boot-starter-2.1.4.jarmybatis-spring-boot-starter-2.1.4.jar
赠送jar包:mybatis-spring-boot-autoconfigure-1.3.2.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-1.3.2-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-1.3.2-sources.jar; 赠送...
赠送jar包:mybatis-spring-boot-autoconfigure-2.1.1.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-2.1.1-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-2.1.1-sources.jar; 赠送...
赠送jar包:mybatis-spring-boot-autoconfigure-1.3.2.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-1.3.2-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-1.3.2-sources.jar; 赠送...
赠送jar包:mybatis-spring-boot-autoconfigure-2.1.1.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-2.1.1-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-2.1.1-sources.jar; 赠送...
mybatis-spring-boot-starter-2.1.3.jarmybatis-spring-boot-starter-2.1.3.jarmybatis-spring-boot-starter-2.1.3.jar
赠送jar包:mybatis-spring-boot-autoconfigure-2.1.3.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-2.1.3-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-2.1.3-sources.jar; 赠送...
MyBatis Spring Boot Starter.jar 各个版本,免费下载。 MyBatis Spring Boot Starter.jar 起步依赖和自动配置。
mybatis mybatis-spring-boot-starter-2.0.0.jar下载
MyBatis是一个流行的Java持久层框架,它简化了数据库操作,通过XML或注解的方式将SQL与Java代码绑定,提供了一种直接操作结果集的方法。在MyBatis中,`mybatis-3-config.dtd` 和 `mybatis-3-mapper.dtd` 是两个至关...
赠送jar包:mybatis-spring-boot-autoconfigure-2.1.3.jar 赠送原API文档:mybatis-spring-boot-autoconfigure-2.1.3-javadoc.jar 赠送源代码:mybatis-spring-boot-autoconfigure-2.1.3-sources.jar 包含翻译后...
mybatis-spring-boot-autoconfigure-2.1.3mybatis-spring-boot-autoconfigure-2.1.3
mybatis-plus-boot-starter.jar 各个版本下载, SpringBoot 集成 MybatisPlus jar 包下载, Mybatis-Plus(简称MP)是一个基于MyBatis的增强工具库,它简化了与数据库的交互操作并提供了一系列增强功能,使开发者...
本篇文章将围绕"mybatis-spring-1.3.0.jar"这一组件展开,详细讲解其在实际项目中的作用、功能以及如何进行有效集成。 MyBatis-Spring是MyBatis和Spring框架的桥梁,它提供了无缝连接,使得开发者能够充分利用两者...
mybatisplus,MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。... <artifactId>mybatis-plus-spring-boot3-starter <version>3.5.9 </dependency>
赠送jar包:mybatis-spring-boot-autoconfigure-2.2.0.jar; 赠送原API文档:mybatis-spring-boot-autoconfigure-2.2.0-javadoc.jar; 赠送源代码:mybatis-spring-boot-autoconfigure-2.2.0-sources.jar; 赠送...
总之,"spring-boot-starter-mybatis-spring-boot-1.0.2.zip"压缩包提供了一个方便的Spring Boot与MyBatis集成方案,通过简单的步骤,我们可以在Spring Boot应用中便捷地使用MyBatis进行数据库操作。这个版本适用于...
MyBatis-Spring 1.3.1 是一个重要的Java库,它为MyBatis持久层框架和Spring框架提供了一座桥梁,使得两个强大的库能够无缝集成。这个版本的jar文件是开发者在使用MyBatis与Spring进行项目开发时必不可少的组件。下面...
java运行依赖jar包
mybatis-plus-boot-starter.jar 各个版本下载, SpringBoot 集成 MybatisPlus jar 包下载, Mybatis-Plus(简称MP)是一个基于MyBatis的增强工具库,它简化了与数据库的交互操作并提供了一系列增强功能,使开发者...