springboot2.0
1、版本依賴(版本號引用父類的依賴,自動配置)
1.若是要進行單獨升級的話,能夠單獨添加版本號version
Http請求配置註解:
@SpringBootApplication(註解中包含好多元註解):聲明該類是springboot項目的啓動類
@Configuration+@EnableAutoConfiguration+@ConmponentScan
@RestController and @RequestMapping是springMVC的註解,不是springboot特有的
@RestController = @Controller+@ResponseBody
Http請求的get請求
Restful風格
@RequestMapping(還須要配置請求方式)
@GetMapping(若是value值中參數是請求類型是「{xxx}/{xxx}」這種形式,則請求的url拼接參數方式是:/xxx/xxx)(若是value值中參數的請求類型爲空,則url拼接參數的方式是:「?參數名=xx&參數名2=xx」) :默認請求方式是get
@RequestParam:接收帶參數名的url請求方式的參數,能夠經過defaultValue指定默認值,name指定參數名required指定參數是否必須。
@RequestBody(須要指定http的頭爲 content-type爲application/json,使用body傳輸數據):接受一個對象
@RequestHeader:獲取對應的請求頭信息,好比在獲取支付功能的令牌信息。
HttpRequest對象:用request.getParameter("xx")獲取參數。html
Http請求的post,put,delete請求
@PostMapping(通常提交保存信息)
@PutMapping(通常是更新某一個用戶信息)
@DeleteMapping(通常是刪除操做)
經常使用的json框架:JavaBean序列化爲Json的性能:Jackson>Fastjson>Gson>Json-lib
jackson框架:1.能夠在實體類裏面加@JsonIgnore註解,使這個成員再返回給前臺是被過濾掉,好比用戶的密碼這個字段,就不能直接返回給前臺顯示
2.@JsonFormat註解,能夠對返回的日期格式進行制定
3.@JsonProperty能夠制定別名
4.@JsonInclude:表示若是字段爲空不會返回
springboot有默認的文件加載順序,默認先從static文件下查找
springboot文件上傳:@RequestMapping
參數接收File類型的參數,而後調用file.transTo()方法進行文件上傳
對上傳的文件進行非空,大小的判斷
java -jar xxx 找不到入口,啓動類(添加maven插件)
若是須要修改直接加到Application
配置實體類:能夠經過@Value屬性注入,須要注意的是啓動類只能掃描同級包和子包。前端
Junit單元測試:
1、單元測試入門
一、在pom文件中導入junt依賴
二、在test包下新建一個class文件,加兩個註解(@RunWith(SpringRunner.class),@SpringBootTest(classes=xxxx(啓動類).class))
三、在該類中新建一個方法,聲明@Test註解(加斷言TestCase.assertEquals(xx,xx))
四、前置註解@Before,後置註解@After
五、要同時測試多個方法,則運行該類
2、MockMVC(一個Http的客戶端)
一、除了單元測試的註解,還須要添加@AutoConfigureMockMVC
3、異常捕獲:
一、全局異常:@RestControllerAdvice註解標記類,該類捕獲到的是全局的異常,捕獲處理異常,返回給前端友好的信息。
記錄日誌:private static final Logger log = LoggerFactory.getLogger(xxxx.class);
log.error("url {},msg {}",request.getRequestURL(),e.getMessage());記錄日誌
二、自定義異常:(1)、自定義異常界面的跳轉
* 在pom中加入thymeleaf模版引擎依賴
* 創建一個自定義異常類,繼承RuntimeException
* 定義異常屬性(如code,message及其get和set方法)
* 方法上加@ExceptionHandler(value=自定義異常類.class):細分什麼異常進什麼方法進行處理
* 準備一個展現出異常的頁面
* 在方法裏經過modelAndView進行頁面跳轉
* 自定義異常也是能夠返回json數據的java
springboot項目打包到tomcat:
jar包方式啓動:1、加maven插件,spring-boot-maven-plugin
war包方式啓動:在pom裏先配置打包方式:<packing>war</packing>,而後在<build>裏面增長<filename>打包的項目名稱</filename>,修改啓動類。繼承SpringBootServiceInitolizer,進行打包,而後將war包部署到tomcat的webapp目錄下,啓動tomcat就能夠了
使用Jmter測試工具測試容器性能。QPS(每秒查詢數),TPS(每秒輸入數),RT(響應時間)
node
springBoot2.x過濾器Filter:
filter是什麼:好比檢票員,過濾掉沒有買票的人,把有票的,也就是符合判斷條件規則的人放過去。
一、springBoot啓動時會加載一些默認過濾器。
characterEncodingFilter
hidedenHttpMethodFilter
httpPutFormContentFilter
requestContextFilter
二、springBoot過濾器的優先級
Ordered.HIGHEST_PRECEDENCE
Ordered.LOWEST_PRECEDENCE
低位值(數字越小)意味着更高的優先級
自定義filter時,要注意避免和默認的filter優先級同樣,否則會衝突
三、自定義Filter
1)使用Servlet3.0的註解進行配置
2)啓動類裏面增長@ServletComponentScan,進行掃描
3)新建一個Filter類,implements Filter,並實現對應的接口
4)控制chain.doFilter的方法的調用,來實現是否經過放行
不放行,web應用resp.sendRedirect("/index.html");
場景:權限控制、用戶登陸(非先後端分離場景)等。
新建一個類,繼承Filter,重寫三個方法:
init:容器加載的時候調用
doFilter:請求被攔截的時候進行調用。能夠在doFilter中經過獲取HttpRequest來得到用戶的信息,從而根據用戶的信息進行判斷,返回不一樣的結果
destroy:容器被銷燬的時候被調用
記得加WebFilter(urlPatterns="/xxx/xxx/*",FilterNmae="xxx")註解,該註解是爲了標記一個類爲Filter
urlPatterns是攔截規則,支持正則。
四、自定義一個原生的Servlet實現小的需求
1)定義一個類,繼承HttpServlet
2)在類上加註解@WebServlet(name="xxx",urlPatterns="/xx/xx")
3)重寫doGet/doPost方法,在方法中進行業務處理。
4)在啓動類上加註解@ServletCompnentScan,配合開啓Servlet
五、SpringBoot的Listener
1)定義一個類,實現ServletRequestListener/ServletContextListener等
2)在類上加@WebListener註解
3)重寫requestDestroyed和requestInitialized方法
4)執行順序:先執行初始化方法,再執行controller方法,最後執行銷燬方法
=========攔截器和過濾器的區別==========
一、使用範圍不一樣:Filter是Servlet規範規定的,只能用於Web程序中,而攔截器既能夠同於Web程序,也能夠用於Application、Swing程序中。
二、規範不一樣:Filter實在Servlet規範中定義的,是Servlet容器支持的,而藍假期是在Spring容器內的,是Spring框架支持的。
三、使用的資源不一樣:同其餘的代碼塊同樣,攔截器也是一個Spring的組件,歸Spring管理,配置在Spring文件中,所以能使用Spring裏的任何資源、對象,例如Service對象、數據源、事務管理等,經過IOC注入到攔截器便可,而Filter則不能。
四、深度不一樣:Filter在只在Servlet先後起做用,。而攔截器可以深刻到方法先後、異常拋出先後等,所以攔截器的使用具備更大的彈性、
過濾器和攔截器的執行順序:
1)Filter pre:進入過濾器,執行chain,doFilter(request,response)以前的邏輯。
2)service:SpringMVC的doService()方法,也即Service的service()方法。
3)dispatcher:SpringMVC的請求分發方法。
4)preHandle:進入攔截器,執行controller以前調用。
5)controller
6)postHandle:執行完controller邏輯,在controller的return ModelAndView以前執行,能夠操控ModelAndView的值。
7)afterCompletion:Controller的return以後,可是在Filter返回給客戶端以前執行。
8)FilterAfter:服務器端邏輯所有執行完成,返回給客戶端以前的邏輯。
SpringBoot2.x攔截器
一、自定義一個攔截器
1)新建一個類,加註解@Configuration,實現WebMvcConfigurer,重寫addInterceptor方法生成攔截器
2)新建一個類(攔截器),繼承HandlerInterceptor(攔截器的業務類),重寫方法
preHandle:進入controller方法以前,通常是用來作權限和登陸校驗的。
postHandle:調用完controller以後,視圖渲染以前。
afterCompletion:整個完成以後,一般用於資源清理。
二、多個攔截器的執行順序「包裹執行」mysql
SpringBoot Starter起步依賴
SpringBoot模版引擎
靜態頁面渲染模版渲染
Freemaker不佔用系統內存,由於他不是用java處理的
Thymeleaf(輕量級的模板引擎,不適合複雜的邏輯業務,由於解析DOM或者XML會佔用多的內存)
web
SpringBoot整合Freemaker:
一、在pom文件中導入相關依賴包(spring-boot-starter-freemaker)
二、Freemaker的基礎配置(參考相關文檔)
三、新建一個包(路徑),來存放模板,後綴是ftl
四、編寫代碼。返回頁面
${setting.name},${value}等方式來取值
* 除此以外,還須要注意classpath的/問題,防止出現找不到返回界面問題redis
SpringBoot整合thymeleaf
一、在pom文件中導入相關依賴包(thymeleaf-spring5,thymeleaf-extras-java8time)
二、配置文件,主要配置路徑和後綴名,將thymeleaf加載到靜態資源文件中。
三、經過配置加載靜態資源,能夠在頁面不經過controller直接訪問頁面。spring
SpringBoot持久化數據到數據庫
1、經常使用的訪問數據庫的方式
一、原始sql
1)註冊驅動/加載驅動
Class.forName("com.mysql.jdbc.Driver");
2)創建鏈接
Connection conn = DriverMannger.getConnection("jdbc:mysql://localhost:3306/dbname","root","root");
3)建立Statement
4)執行SQL語句
5)處理結果集
6)關閉鏈接,釋放資源
二、apache dbutils框架
三、jpa框架
spring-data-jpa
jpa在複雜查詢的時候性能不是很好
四、Hibernate 解釋:ORM:對象關係映射Object Relational Mapping
企業大都喜歡使用hibernate
五、Mybatis框架
互聯網行業一般使用mybatis
不提供對象和關係模型的直接映射,半ORMsql
2、SpringBoot整合Mybatis(註解方式)
一、使用startermybatis-spring-boot-starter
二、加入依賴:
1)引入starter:mybatis-spring-boot-starter
2)MySQL的JDBC驅動包:mysql-connector-java
3)引入第三方數據源:druid
三、配置文件,配置鏈接數據庫的數據信息。
四、啓動類增長Mapper掃描:@MapperScan
五、開發Mapper(推薦使用#{}取值,不要${},由於存在SQL注入的風險)
保存數據,獲取自增id:@Options(useGeneratedKeys=true,keyProperty="id",keyColumn="_id")註解
能夠切換數據源,控制檯打印sql
3、SpringBoot整合mybatis之實操和控制檯打印SQL
一、在配置文件中添加配置:mybatis.configuration.log.impl=org.apache.ibatis.logging.stdout.StdOutImpl
二、映射數據庫字段名稱與實體類成員變量:@Results{
@Result(column="xxx",property="xxx"),
@Result(column="xxx",property="xxx")
}
三、CRUD的實現,參數能夠傳數據,也能夠傳對象,只要sql語句中接受參數名字和參數名對應便可
四、通常對外提供接口的時候,名字改成小寫。
4、事務的隔離級別和傳播
一、分佈式事務:
能夠用消息隊列
1)二次提交
2)最終一致性
二、隔離級別:
Serializable:串行化
Repeatable Read:可重複讀
read committed:不可重複讀
read uncommitted:讀未提交
三、常見的事務的傳播行爲
PROPAGATION_REQUIRED--支持當前事務,若是當前沒有事務,就新建一個事務,最多見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,若是當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支持當前事務,若是沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,若是當前沒有事務,把當前事務掛起,兩個事物之間沒有關係,一個異常,一個提交,不會同時回滾。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,若是當前存在事務,則拋出異常。
5、SpringBoot整合mybatis事務處理實操
一、@Transactional(propagetion=Propagation.REQUIRED,isolation=xxx)
SpringBoot整合Redis
1、分佈式緩存Redis
一、流程請求 -> tomcat -> 緩存服務(redis,nosql,MV,mongodb,hive...)
-> mysql
2、SpringBoot整合Redis實戰講解:
一、導入pom文件依賴:spring-boot-starter-date-redis
二、配置相關的配置文件(參考文件),主要包含了spring.redis.database,spring.redis.host,spring.redis.port,spring.redis.timeout,spring.redis.pool.min-idle,spring.redis.pool.max-active,spring.redis.pool.max-wait等
三、創建一個controller,注入StringredisTemplate,來對redis中的數據進行操做。
四、redisTemplate的opsForValue是最經常使用的
五、經過redisTemplate能夠對多種數據類型進行操做,opsForValue的get方法能夠從redis中獲取到以前存在redis中對應的數據。
3、操做redis的工具,redis可視化工具。(redis默認有16個庫,能夠在配置文件中配置操做的是哪個庫)
一、能夠本身封裝工具類,實現你想要的方法
SpringBoot整合定時任務和異步任務處理
1、定時任務的實現方式:
一、常見的定時任務 Java自帶的java.util.Timer類
timer:配置比較麻煩,時間延後問題
timertask:不推薦
二、Quartz框架
配置更簡單
xml或者註解
三、springBoot使用註解方式開啓定時任務
@EnableScheduling開始定時任務,自動掃描
@Component被容器掃描
定時執行的方法加上註解@Scheduled(cron表達式)
2、經常使用定時任務配置實戰
一、cron 定時任務表達式(* * * * * ?)
二、fixedRate:定時多久執行一次(上一次開始執行時間點後xx秒再次執行)
三、fixedDelay:上一次執行結束時間點後xx秒再次執行
四、fixedDelayString:字符串形式,能夠經過配置文件指定。
五、fixedRateString:字符串形式,能夠經過配置文件指定。
3、異步任務實戰
一、什麼是異步任務和使用場景:適用於處理log、發送郵件、短信等等
下單接口->查庫存 100
餘額校驗 150
風控用戶 100
。。。
二、啓動類裏面使用@EnableAsync註解開啓功能,自動掃描。
三、定義異步任務類並使用@Component標記組件被容器掃描,異步方法加上@Async
注意點:
1)要把異步任務封裝到類裏面,不能直接寫到controller
2)增長Future<String>返回結果AsyncResult<String>("task執行完成")
3)若是須要拿到結果,須要判斷所有的task.isDone()
四、經過注入方式,注入到controller裏面,若是測試先後區別則改成同步測試把Async註釋掉
Logback日誌框架介紹和SpringBoot整合
1、新日誌框架LogBack
一、經常使用來處理java的日誌組件 slf4j,log4g,logback,common-logging等。
二、logback:基於Log4j基礎上大量改良,不能單獨使用,推薦配合日誌框架SLF4J來使用。
logback當前分爲三個模塊:logback-core,logback-classic和logback-access
logback-core是其餘兩個模塊的基礎模塊。
三、logback的核心對象:
Logger:日誌記錄器
Appender:指定日誌輸出的目的地,目的地能夠是控制檯,文件
Layout:日誌佈局 格式化日誌信息的輸出
四、日誌級別:DEBUG < INFO < WARN < ERROR
2、springBoot整合logback
一、建立日誌文件logback-spring.xml。官方推薦 -spring.xml結尾
默認加載配置順序 logback-spring.xml,logback-spring.groovy,logback.xml,or logback.grovy
註釋:
<configuration> 子節點
<appender></appender> 輸出目的
<logger></logger>
<root></root> 要加在最後
(具體配置參考文檔)
SpringBoot整合ElasticSearch
1、搜索引擎知識和框架基本介紹:
一、elasticSearch的主要特色:
1)特色:全文檢索、結構化檢索,數據統計、分析,接近實時處理,分佈式搜索(可部署數百臺服務器),處理PB級別的數據,搜索糾錯,自動完成自動提示。
2)使用場景:日誌搜索,數據聚合,數據監控,爆表統計分析
3)國內外使用者:維基百科,Stack Overflow,GitHub
二、一個索引庫中只能存在一個type,再也不能在一個索引庫中同時存在多個type。
ES是純java開發的,springboot的使用5.6
三、配置ES出現問題處理
1)Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000c5330000,986513408,0) failed;error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
# Anerror report file with more information is saved as:
# /usr/local/so.....
解決:改參數(jvm.option中的-Xms改成128M)或者內存不夠,購買阿里雲的機器能夠動態增長內存
2) [root@Zwz95j86y235aroi85ht0Z bin]...
解決:用非root用戶
添加用戶:useradd -m 用戶名 而後設置密碼 passwd 用戶名
3)./elasticsearch
Exception in thread "main" java.nio.file.Acc.......
解決:權限不夠 chomd 777 - R 當前es目錄
2、ES準備數據
一、利用postMan工具
1)查看集羣狀態:localhost:9200/_cat/health?v
2)查看節點次數:localhost:9200/_cat/nodes?v
3)查看索引:localhost:9200/_cat/indices?v
4)建立一個索引:PUT /customer?pretty
5)往索引中添加數據:PUT customer/external/1?pretty
{
"name":"John Doe"
}
3、Springboot整合ElasticSearch
一、添加maven依賴:spring-boot-starter-data-elasticsearch(客戶端版本要和服務端版本對應)
二、接口繼承ElasticSearchRepository,裏面有不少默認實現
注意點:索引名稱記得小寫,類屬性名稱也要小寫
1)新建實體對象article,加上註解@Document(indexName = "blog",type = "article")
2)新建一個接口,繼承類ElasticSearchRepository,家註解@Component或者@Repository
3)配置文件:參考相關文檔
ES集羣的名稱
節點數(IP+端口號)
數據倉庫是否開啓,true表示開啓
4) 新建一個controller,進行數據處理。
SpringBoot整合消息隊列和JMS
1、消息隊列介紹
一、JMS介紹和使用場景及基礎編程模型
1)什麼是JMS:Java消息服務(Java Message Service),Java是、平臺中關於面向消息中間件的接口
2)JMS是一種與廠商無關的API,用來訪問消息收發系統消息,它相似於JDBC,這裏,JDBC是能夠用來訪問許多不一樣關係數據庫的API。
3)使用場景:
跨平臺
多語言
多項目
解耦
分佈式事務
流量控制
最終一致性
RPC調用
上下游對接,數據源變更->通知下載
4)概念
JMS提供者:Apache ActiveMQ、RabbitMQ、Kafka、Notify、MetaQ、RocketMQ
JMS生產者(Message Producer)
JMS消費者(Message Consumer)
JMS消息
JMS隊列
JMS主題
JMS消息一般有兩種類型:點對點模式、發佈訂閱這模式
5)編程模型:
MQ中須要用的一些類
ConnectionFactory:鏈接工廠,JMS用它建立鏈接
Connection :JMS 客戶端到JMS Provider的鏈接
Session:一個發送或接受消息的線程
Destination:消息的目的地,消息發送給誰
MessageConsumer/MessageProducer:消息接受者,消費者
2、ActiveMQ消息隊列基礎介紹和安裝
簡介:
特色:
1)支持來自Java,C,C++,C#,Ruby,Perl,Python,PHP的各類跨語言客戶端和協議
2)支持許多高級功能,如消息組,虛擬目標,通配符和符合目標。
3)徹底支持JMS1.1和J2EE1.4,支持瞬態,持久,事務和XA消息
4)Spring支持,ActiveMQ能夠輕鬆嵌入到Spring應用程序中,並使用Spring的XML配置機制進行配置
5)支持在流行的J2EE服務器(如TomEE,Geronimo,JBoss,GlassFish和WebLogic)中進行測試
6)使用JDBC和高性能日誌支持很是快速的持久化
使用:
1)下載
2)解壓
3)安裝在Linux系統上,在bin目錄裏面啓動,選擇對應的系統版本和位數,activeMQ start 啓動
4)啓動後訪問路徑http://127.0.0.1:8161/
5)用戶名和密碼默認都是admin
3、SpringBoot整合ActiveMQ的點對點
一、在pom文件中引入依賴spring-boot-starter-activemq,activemq-pool
二、application.properties配置文件配置(參考相關文檔)
1)配置activeMQ的地址(防火牆問題,關閉或者開放對應端口號)
2)adtiveMQ集羣的配置
3)登陸的帳號名和密碼
4)開啓一個鏈接池,最大鏈接數
三、啓動類添加註解@EnableJms
四、在啓動類中寫一個返回隊列的方法(return new ActiveMQQueue),並添加註解@Bean,交給spring進行管理,方便後續進行注入。
五、寫一個發送消息的服務,注入JmsMessagingTemplate和Queue,調用它的converAndSend(this.queue,message)方法,進行發送消息
六、寫一個發送消息的controller,注入發送消息的service,在方法中定義一個隊列名稱,而後調用service的發送消息的方法
七、消費者:定義一個監聽類,加註解@Component,定義監聽方法,加註解@JmsListener(destination="xxx"),實時監聽對應的隊列
4、SpringBoot整合ActiveMQ的發佈訂閱模式
一、在pom中導入對應的依賴包,如上
二、配置配置文件,如上。底部新增配置:spring.jms.pub-sub-domain=true,支持發佈訂閱模型,不然默認只支持點對點模型
三、啓動類添加註解@EnableJms
四、在啓動類中添加一個topic(return new ActiveMQTopic),添加@Bean註解
五、定義一個發送消息的服務,注入JmsMessagingTemplate和Topic,調用它的converAndSend(this.topic,message)方法,進行發送消息
六、寫一個發送消息的controller,注入發送消息的service,
七、定義一個消費者,定義一個監聽類,加註解@Component,定義監聽方法,加註解@JmsListener(destination="xxx"),實時監聽對應的隊列
注意點:
1)默認消費者並不會消費訂閱發佈類型的消息,這是因爲springboot默認採用的是p2p模式進行消息的監聽
修改配置:spring.jms.pub-sub-domain=true
2)@JmsListener若是不指定獨立的containerFactory的話是隻能消費queue消息
修改訂閱者的container:containerFactory=「jmsListenerContainerTopic」
註釋掉配置文件中的spring.jms.pub-sub-domain=true
//須要給topic定義獨立的JmsListenerContainer
@Bean
public JmsListenerCOntainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory){
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
將這個方法放入啓動類
5、RocketMQ4.X消息隊列
一、簡介RocketMQ
(1)Apache RocketMQ做爲阿里開源的一款高性能、高吞吐量的分佈式消息中間件
(2)特色
1)在高壓下1毫秒內響應延遲超過99.6%
2)適合金融類業務,高可用性跟蹤和審計功能
3)支持發佈訂閱模型和點對點模型
4)支持拉pull和推push兩種消息模式
5)單一隊列百萬消息
6)支持單master節點,多master節點,多master多slave節點
(3)概念
Producer:消息生產者
Producer Grop:消息生產組,發送同類消息的一個消息生產組
Consumer:消費者
Consumer Group:消費同個消息的多個實例
Tag:標籤,子主題(二級分類),用於區分同一個主題下的不一樣業務的消息
Topic:主題
Message:消息
Broker:MQ程序,接收生產的消息,提供給消費者消費的程序
Name Server:給生產和消費者提供路由信息,提供輕量級的服務發現和路由
SpringBoot多環境配置
1、不一樣環境使用不一樣的配置
例如表數據庫配置,在開發的時候,咱們通常開發數據庫,而在生產環境的時候,咱們是用正式的數據
公司中的環境通常分爲:開發環境DEV、測試環境TEST、預發佈環境PRE、生產環境PRO
2、配置文件存放路徑
一、classpath根目錄的"/config"包下
classpath的根目錄下
3、spring boot容許經過命名約定按照必定的格式(application-(profile).properties)來定義多個配置文件
SpringBoot響應式編程
1、SpringBoot響應式編程簡介
一、基礎理解。快速處理請求或者操做
依賴於事件驅動(Event-driven)
一系列事件稱爲「流」
異步
非阻塞
觀察者模式
網上一個例子:
int a = b+c // 命令式編程後續b和c變化,都不影響a
int a = b+c // 響應式編程中,a的變化,會和b、c的變化而變化(事件驅動)
2、
mongodb
spring data JPA
1、Spring data JPA是什麼:
JPA(Java Persistence API)是官方提出的Java持久化規範。
注意:JPA是一套規範,而不是一套產品。好比Hibernate,TopLink這些產品實現了JPA規範,那麼咱們就能夠叫他們爲JPA的實現產品。
2、spring data jpa的基本查詢
基本查詢也分兩種,一種是spring data默認已經實現,一種是根據查詢的方法來自動解析成SQL。
一、預先生成方法(spring data jpa默認預先生成了一些基本的CRUD的方法,例如:增、刪、改等等)
1)繼承JpaRespository
public interface UserRepository extends JpaRepository<User,Long>{
}
2)使用默認方法
@Test
public void testBaseQuery() throws Exception{
User user = new User();
userRepository.findAll();
userRepository.findOne(1l);
userRepository.save(user);
userRepository.delete(user);
userRepository.count();
userRepository.exists(1l);
//...
}
根據方法名就可知道該方法的實現功能
二、自定義簡單查詢(自定義簡單查詢就是根據方法名來自動生成SQL,主要的語法是findXXBy,readXXBy,queryXXBy,countXXBy,getXXBy後面跟屬性名稱)
如User findByUserName(String userName);
1)也使用一些加一些關鍵字(And、Or)
User findByUserNameOrEmail(String userName,String email);
2)修改、刪除、統計也是相似語法
Long deleteById(Long id);
Long countByUserName(String userName)
3)基本上SQL體系中的關鍵詞均可以使用,例如:LIKE、IgnoreCase、OrderBy。
List<User> findByEmailLike(String email);
User findByUserNameIgnoreCase(String userName);
List<User> findByUserNameOrderByEmailDesc(String email);
4)具體的關鍵字可查詢相關文檔
三、複雜查詢
分頁查詢
在查詢的方法中,須要傳入參數Pageable,當查詢中有多個參數的時候,Pageable建議做爲最後一個參數傳入
Page<User> findAll(Pageable pageable);
PaGE<uSER> findByUserName(String userName,Pageable pageable);
Pageable是搜ring封裝的分頁實現類,使用的時候須要傳入頁數、每頁條數和排序規則
@Test
public void testPageQuery() throws Exception{
int page = 1,size = 10;
Sort sort = new Sort(Direction.DESC,"id");
Pageable pageable = new PageRequest(page,size,sort);
userRepository.findAll(pageable);
userRepository.findByUserName("testName",pageable);
}
限制查詢
有時候咱們只須要查詢前N個元素,或者支取前一個實體。
User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(Stirng lastname,Pageable pageable);
List<User> findFirst10ByLastname(Stirng lastname,Sort sort);
List<User> findTop10ByLastname(String lastname,Pageable pageable);
自定義SQL查詢
其實Spring data 絕大部分的SQL均可以根據方法名定義的方式來實現,可是因爲某些緣由咱們想要使用自定義的SQL來查詢,spring data也是完美支持的;在SQL的查詢方法上面使用@query註解,如涉及到刪除和修改在須要加上@Modifying。也能夠根據須要添加@Transactional對事物的支持,查詢超時的設置等。
@Modifying
@Query("update User u set u.userName = ?1 where c.id = ?2")
int modifyByIdAndUserId(String userName,Long id);
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddresss = ?1")
User findByEmailAddress(String emailAddress);
多表查詢
多表查詢在spring dta jpa中有兩種實現方式,第一種是利用hibernate的級聯查詢來實現,第二種是建立一個結果集的接口來接受連表查詢後的結果,這裏主要第二種方式。
1)首先須要定義一個結果集的接口類。
public interface HotelSummary {
City getCity();
String getName();
Double getAverageRating();
default Integer getAverageRatingRounded() {
return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
}
}
2)查詢的方法返回類型設置爲新建立的接口
@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
- "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
Page<HotelSummary> findByCity(City city, Pageable pageable);
@Query("select h.name as name, avg(r.rating) as averageRating " - "from Hotel h left outer join h.reviews r group by h") Page<HotelSummary> findByCity(Pageable pageable); 3)使用 Page<HotelSummary> hotels = this.hotelRepository.findByCity(new PageRequest(0, 10, Direction.ASC, "name")); for(HotelSummary summay:hotels){ System.out.println("Name" +summay.getName()); }