文档章节

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

二十岁以后
 二十岁以后
发布于 2017/08/15 17:34
字数 1703
阅读 1930
收藏 89

        通过第四章的介绍,大家可能更能理解使用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语句中。第一个参数是要插入的列名,第二个参数则是该列的值。

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

© 著作权归作者所有

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

评论(18)

奥特曼大人

引用来自“one_piecet”的评论

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

引用来自“one_piecet”的评论

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

引用来自“one_piecet”的评论

为什么我的第二种报错,说接口不能有方法体..
接口中肯定不能写方法呀,你得写个内部类,在内部类中写方法。😄
one_piecet
one_piecet
为什么我的第二种报错,说接口不能有方法体..
sifu973
sifu973
期待spring cloud的教程😊
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
OSC 第 118 期高手问答 -- SpringBoot 快速构建微服务体系

OSCHINA 本期高手问答(6月8日- 6月15日) 我们请来了 @afoo (王福强) 为大家解答关于 SpringBoot 快速构建微服务体系方面的问题。 @afoo (王福强) ,资深Java技术专家和架构师,具有多年一线开...

开源中国股侠
2016/06/07
9.2K
79
spring、springMvc、springBoot和springCloud的联系与区别

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/80656687 spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,...

尘光掠影
06/11
0
0
微服务资源springboot、springcloud、docker、dubbo项目实战等倾心分享

精彩内容 java实战练习项目教程 全网最全电子图书分享 你所需要的大数据视频教程 java学习视频教程及源码 今天又是周末,还是想给大家送一些福利,因为最近一直有小伙伴问我要springboot等微...

公众号_好好学java
08/06
0
0
简述Spring Boot与Spring Cloud的关系

如下文章字数大约600字,阅读时间需要5分钟左右。 随着微服务架构的持续火热,以及对开发部署迭代需求越来越快速,现今,spring boot逐渐火热,越来越流行。 随着spring boot 流行的还有另外...

Java大蜗牛
08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS docker开发环境

使用eos docker镜像是部署本地EOS开发环境的最轻松愉快的方法。使用官方提供的eos docker镜像,你可以快速建立一个eos开发环境,可以迅速启动开发节点和钱包服务器、创建账户、编写智能合约....

汇智网教程
今天
14
0
《唐史原来超有趣》的读后感优秀范文3700字

《唐史原来超有趣》的读后感优秀范文3700字: 作者:花若离。我今天分享的内容《唐史原来超有趣》这本书的读后感,我将这本书看了一遍之后就束之高阁了,不过里面的内容一直在在脑海中回放,...

原创小博客
今天
19
0
IC-CAD Methodology知识图谱

CAD (Computer Aided Design),计算机辅助设计,指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义同样可以用来近似描述IC公司CAD工程师这个岗位的工作。 早期IC公司的CAD岗位最初...

李艳青1987
今天
19
0
CompletableFuture get方法一直阻塞或抛出TimeoutException

问题描述 最近刚刚上线的服务突然抛出大量的TimeoutException,查询后发现是使用了CompletableFuture,并且在执行future.get(5, TimeUnit.SECONDS);时抛出了TimeoutException异常,导致接口响...

xiaolyuh
今天
10
0
dubbo 搭建与使用

官网:http://dubbo.apache.org/en-us/ 一,安装监控中心(可以不安装) admin管理控制台,monitor监控中心 下载 bubbo ops 这个是新版的,需要node.js环境,我没有就用老版的了...

小兵胖胖
今天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部