文档章节

微服务开发的入门级框架Spring Boot详解(五)

二十岁以后
 二十岁以后
发布于 2017/08/15 17:34
字数 1703
阅读 1874
收藏 91
点赞 4
评论 18

        通过第四章的介绍,大家可能更能理解使用SpringBoot开发是多么爽并且快捷的了。

        比如使用SSM框架开发写一个HelloWord,会经过以下几个步骤:

  •         写POM文件,下载依赖包。
  •         配置Spring MVC,视图解析器等
  •         配置Spring,开启注解扫描器等(发现配置了一大堆,还没开始写真正的业务逻辑
  •         写Controller,实现HellWord
  •         配置容器
  •         应用打WAR包
  •         放到容器里跑

        以上步骤甚是繁琐,而使用Spring Boot呢?你只需以下几步就可以实现:

  •          写POM文件,下载依赖包。
  •         写Controller,实现HellWord
  •         启动程序

     对比后,我来说今天真正的主题,如何使用注解写动态SQL

1、动态SQL注解详解

       写动态SQL使用的注解不再是:

    而是对应 以下四个注解:

  • @SelectProvider
  • @UpdateProvider
  • @DeleteProvider
  • @InsertProvider

    注解没有太多可解释的,说一下里面都写的啥吧!代码例子如下 :

@SelectProvider(type=Userdao.class,method="findUserByInput")
public List<UserList> selectAllUser(String Department,String RealName,Integer StartNo);

    type:声明类。method:声明方法。

    那么声明的是什么类?什么方法呢?往下看!

2、动态SQL实现

        其实使用注解实现动态SQL有三种方法,我只写两种个人比较喜欢的方式。(第三种也确实不太好)

        2.1、第一种方式(个人感觉就是拼接字符串,条件判断,然后返回拼接好的字符串)

        在DAO层的接口中定义一个内部类,代码如下:

package cn.yy.dao;

@Mapper
public interface UserDao {

 class Userdao{			 
		 public String findUserNumByInput(String Department,String RealName) {      
				     
			 String sql="SELECT COUNT(*) from users"+"" ;

			 if(Department != null && RealName != null){
			    sql += " where Department='"+Department+"' and  RealName like '%"+RealName+"%';"; 
			    return sql;
				}else if( Department != null ){
					 sql += " where Department = '"+Department;
						 return sql;
				 } else if( RealName != null){
					sql += " where RealName like '%"+RealName+"%'";
						 return sql;
				 }
				 return sql;
		}			  
	  

}



      以上这个叫Userdao的内部类的类名就是上一节Type对应的值,上节method中的方法就是次内部类中要调用的方法

    解释一下方法中参数和代码的含义:

            方法中传入的参数就是从Service层传来的参数(可以理解为你要查询的全部条件)。

            定义的String对象写的字符串内容是你SQL公用的部分(其实就是拼接SQL语句的字符串)。

            if判断你的哪些条件为空,然后拼接成你想要的语句。

            最后把拼接好的字符串return回去 。

        这就是第一种实现方式,贴一个完整代码:

package cn.yy.dao;

@Mapper
public interface UserDao {

      @SelectProvider(type=Userdao.class,method="findUserNumByInput")
      public Integer selectUserNum(String Department,String RealName);
	  
 class Userdao{			 
		public String findUserNumByInput(String Department,String RealName) {      
				     
		String sql="SELECT COUNT(*) from users"+"" ;
		if(Department != null && RealName != null){

			sql += " where Department='"+Department+"' and  RealName like '%"+RealName+"%';"; 
		    return sql;
		 }else if( Department != null ){
			    sql += " where Department = '"+Department;
				return sql;
			 } else if( RealName != null){
				sql += " where RealName like '%"+RealName+"%'";
				return sql;
			 }
				return sql;
 }			  
	  

}


         注意:@SelectProvide中type参数指定的Class类,必须要能够通过无参的构造函数来初始化。

                @SelectProvide中method参数指定的方法,必须是public的,返回值必须为String,可以为static。

        2.2、 第二种方式(推荐)

        MyBatis 3提供了方便的工具类。使用SQL类创建一个实例来调用方法生成SQL语句。比起第一种方式来说减少了重复的SQL字符串的拼接。完整代码如下:        

package cn.yy.dao;

public class UserDao {

 @SelectProvider(type=Userdao .class,method="selectPersonLike")
 public List<Person> selectPerson(String id,String firstName,String lastName);

clas Userdao{
public String selectPersonLike(final String id, final String firstName, final String lastName) {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
    FROM("PERSON P");
    if (id != null) {
      WHERE("P.ID like #{id}");
    }
    if (firstName != null) {
      WHERE("P.FIRST_NAME like #{firstName}");
    }
    if (lastName != null) {
      WHERE("P.LAST_NAME like #{lastName}");
    }
    ORDER_BY("P.LAST_NAME");
  }}.toString();
}
}

}

         注意:方法的返回值也必须为String

                 selectPersonLike方法中的“SELECT”“FROM”“WHERE”等,均为方法!!!具体解释如下:       

方法 描述
  • SELECT(String)
  • SELECT(String...)
开始或插入到 SELECT子句。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。
  • SELECT_DISTINCT(String)
  • SELECT_DISTINCT(String...)
开始或插入到 SELECT子句, 也可以插入 DISTINCT关键字到生成的查询语句中。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。
  • FROM(String)
  • FROM(String...)
开始或插入到 FROM子句。 可以被多次调用,参数也会添加到 FROM子句。 参数通常是表名或别名,也可以是数据库驱动程序接受的任意类型。
  • JOIN(String)
  • JOIN(String...)
  • INNER_JOIN(String)
  • INNER_JOIN(String...)
  • LEFT_OUTER_JOIN(String)
  • LEFT_OUTER_JOIN(String...)
  • RIGHT_OUTER_JOIN(String)
  • RIGHT_OUTER_JOIN(String...)
基于调用的方法,添加新的合适类型的 JOIN子句。 参数可以包含由列命和join on条件组合成标准的join。
  • WHERE(String)
  • WHERE(String...)
插入新的 WHERE子句条件, 由AND链接。可以多次被调用,每次都由AND来链接新条件。使用 OR() 来分隔OR。
  • OR()
使用OR来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。
  • AND()
使用AND来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。因为 WHERE 和 HAVING 二者都会自动链接 AND, 这是非常罕见的方法,只是为了完整性才被使用。
  • GROUP_BY(String)
  • GROUP_BY(String...)
插入新的 GROUP BY子句元素,由逗号连接。 可以被多次调用,每次都由逗号连接新的条件。
  • HAVING(String)
  • HAVING(String...)
插入新的 HAVING子句条件。 由AND连接。可以被多次调用,每次都由AND来连接新的条件。使用 OR() 来分隔OR.
  • ORDER_BY(String)
  • ORDER_BY(String...)
插入新的 ORDER BY子句元素, 由逗号连接。可以多次被调用,每次由逗号连接新的条件。
  • DELETE_FROM(String)
开始一个delete语句并指定需要从哪个表删除的表名。通常它后面都会跟着WHERE语句!
  • INSERT_INTO(String)
开始一个insert语句并指定需要插入数据的表名。后面都会跟着一个或者多个VALUES() or INTO_COLUMNS() and INTO_VALUES()。
  • SET(String)
  • SET(String...)
针对update语句,插入到"set"列表中
  • UPDATE(String)
开始一个update语句并指定需要更新的表明。后面都会跟着一个或者多个SET(),通常也会有一个WHERE()。
  • VALUES(String, String)
插入到insert语句中。第一个参数是要插入的列名,第二个参数则是该列的值。

        这篇文章个人感觉写的不是特别清楚,但我已经将全部代码贴出,只要照猫画虎就可以,如果有什么不懂的或者文章有什么错误,都欢迎在评论指出!!

© 著作权归作者所有

共有 人打赏支持
二十岁以后
粉丝 227
博文 25
码字总数 23016
作品 0
海淀
架构师
加载中

评论(18)

奥特曼大人

引用来自“one_piecet”的评论

为什么我的第二种报错,说接口不能有方法体..
作者里面的看起来是个内部类
二十岁以后
二十岁以后

引用来自“one_piecet”的评论

为什么我的第二种报错,说接口不能有方法体..
方法的实现。上一句话有瑕疵
二十岁以后
二十岁以后

引用来自“one_piecet”的评论

为什么我的第二种报错,说接口不能有方法体..
接口中肯定不能写方法呀,你得写个内部类,在内部类中写方法。:smile:
one_piecet
one_piecet
为什么我的第二种报错,说接口不能有方法体..
sifu973
sifu973
期待spring cloud的教程:blush:
slolos
slolos
前边的都看完了,写的很好,不过觉着这么用mybatis不好维护,打包后都编译在class里要修改就得重新打包,不如写进xml中
sifu973
sifu973
这spring boot系列教程不错哦,收藏啦
吕兵阳
吕兵阳

引用来自“吕兵阳”的评论

boot不是建议用jpa吗。

能否简单列举下。
二十岁以后
二十岁以后

引用来自“半夏丶暖阳”的评论

这和Spring Boot无关吧,而且MyBatis这种用法很早就有了吧。
只是文章这一系列中的一点。感谢阅读
半夏丶暖阳
这和Spring Boot无关吧,而且MyBatis这种用法很早就有了吧。
学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow
05/28
0
0
10分钟入门SpringBoot

SpringBoot是基于spring框架衍生的一种新的微服务框架,如果对Spring有一定了解的同学肯定知道在Spring中需要配置各种xml文件完成bean的注册操作,随着服务越来越多,配置就变得越来越复杂,...

jwfy
06/14
0
0
用IDEA搭建springboot+thymleaf+mybatis(附分页方法)

参考thymleaf官方网址: 现在主流的微服务springboot配合H5开发效率极快。也符合现在前后端分离的开发方式。 thymleaf作为页面模板框架,可以更好的处理Controller和html的关系。 具体搭建过程...

HaleyLiu
05/17
0
0
SpringBoot笔记(五)模板引擎thymeleaf和freemarker

SpringBoot本来不应该关注这块,但是既然都学了,就看看吧 SpringBoot属于前后端分离的微服务框架,默认的模板引擎是thymeleaf,虽然也能支持JSP,但是比较麻烦,另外freemarker也是SpringB...

世外大帝
04/25
0
0
springcloud微服务理解

大家好这是我的一个简单理解,学习过程中有许多不明白的地方特此请教大家 我的项目大概情况: 生产者是一个springboot项目,有controller、service、entity、dao等完整的项目,添加注解后 @E...

樱木花道VS康
06/06
0
0
SpringBoot学习之基础篇

在前面的博文中,已经演示过springboot与Mybatis集成的实例,本篇再来探讨一下SpringBoot的基础。 一。关于SpringBoot   SpringBoot可以基于Spring轻松创建可以“运行”的、独立的、生产级...

java~nick
2017/10/31
0
0
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
0
0
springboot 开发入门,及问题汇总

1 . springboot简单介绍(http://projects.spring.io/spring-boot/) 现在的web项目几乎都会用到spring框架,而要使用spring难免需要配置大量的xml配置文件,而springboot的出现解 决了这一问...

崔江昆
2015/03/18
0
30
微服务构建: Spring Boot

在展开 Spring Cloud 的微服务架构部署之前, 我们先了解一下用于构建微服务的基础框架-Spring Boot。 由于 Spring Cloud 的构建基于 Spring Boot 实现, 在后续的示例中我 们将大量使用 Sp...

wenhy
06/20
0
0
用IDEA搭建springboot+thymleaf+mybatis+pageHelper搭建框架

参考thymleaf官方网址: 现在主流的微服务springboot配合H5开发效率极快。也符合现在前后端分离的开发方式。 thymleaf作为页面模板框架,可以更好的处理Controller和html的关系。 具体搭建过程...

HaleyLiu
05/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

命令

sudo nginx -s reload 重启nginx sudo lsof -i -P | grep -i "listen" 查看端口占用

那个猴子
6分钟前
0
0
用scrapy-redis爬去新浪-以及把数据存储到

需求:爬取新浪网导航页(http://news.sina.com.cn/guide/)所有下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。 准备工作: a.安装redis(windows或者linux) b.安装Redis Des...

丁典
6分钟前
0
0
PHP常用函数篇

1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复代码,只需调用...

天地有涯风有信_大海无量不见人
7分钟前
0
0
对List分组

在日常工作中会遇到这样的情景,我们需要对List按照List中对象的一个值进行分组。比如一个Human的List,我们要根据性别分组,传统的方法是做双层循环,逐个对比,今天我要介绍一种详单简单的...

珂jack
9分钟前
0
0
分析jquery ajax jsonpCallback回调函数名包含点号报错问题

现象 项目中涉及到跨域请求,采用jquery ajax jsonp来实现,但是遇到一个奇怪问题,在设置回调函数名称时,若包含点号,如“Callback.Success”,那么执行完成后,其error回调函数始终会被触...

iwaller
12分钟前
0
0
【Graphql实践】使用 Apollo(iOS) 访问 Github 的 Graphql API

最近在协助调研 Apollo 生成的代码是否有可能跨 Query 共享模型的问题,虽然初步结论是不能,并不是预期的结果,但是在调研过程中积累的一些经验,有必要记录下。如果你也对 Graphql 感兴趣,...

ios122
12分钟前
1
0
聊聊spring cloud的AsyncLoadBalancerAutoConfiguration

序 本文主要研究一下AsyncLoadBalancerAutoConfiguration AsyncLoadBalancerAutoConfiguration spring-cloud-commons-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/client/loadba......

go4it
21分钟前
0
0
10.19 iptables规则备份和恢复 ,firewalld的9个zone,service的操作

保存和备份iptables规则 内容: 保存iptables规则 service iptables save 把iptables规则备份到my.ipt文件中: iptables-save > my.ipt 恢复刚才备份的规则: iptables-restore < my.ipt 1.......

Linux_老吴
24分钟前
0
0
Vue 自动化表单相关资料

1.使用vue自动化表单 2.Vue可视化,Vue代码生成,Vue动态表单 3.前端表单进阶之路:通过 Vue.js 实现表单可配置化 4.使用Vue动态生成form表单 5.autoform-devtool 6.Vue.js实践:实现多条件筛...

IT追寻者
25分钟前
0
0
动态SQL

一、动态SQL 1、if <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title l......

一个yuanbeth
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部