微服務開發的入門級框架Spring Boot詳解(四)
前幾章把Spring Boot大概都介紹了個遍,如果各位朋友有什麼疑問和指教歡迎在評論指出。下面我將介紹如何使用Spring Boot進行企業級開發。大概會從以下幾點開始介紹。
- 如何使用Spring Boot進行企業開發
- Spring Boot與Spring Cloud(Spring Cloud會單獨寫一系列,包括PaaS雲環境如何使用)
- Spring Boot整合Mybatis(這裡會重點說,包括事物,用註解寫SQL及動態SQL等等)
1、使用Spring Boot進行企業開發
剛開始接觸微服務的開發我基本是一臉懵逼的狀態,因為以前是做傳統電商專案的開發,還好我的經理是個大牛(Pivotal原廠出來的),他對於微服務的開發以及PaaS雲可以說是理解到骨子裡了,感謝我的經理給了我很多的建議和思路。首先微服務的開發最先思考的應該是模型的設計,從資料庫模型開始,因為微服務架構就是要高內聚低耦合,一個功能掛了,我應用其他模組照樣跑。資料庫模型很重要(SSM官網:www.fhadmin.org),可以說一個數據庫的設計表結構就代表了你要實現的功能部分。寫微服務就像是在搭積木,你的積木顏色可能不同,但最終卻能完美的搭在一起,即使抽掉幾塊也不會倒。
當資料庫建立好後,我又在思考,傳統架構一般都是Controller接收資料,返回檢視,Service把Controller接收的資料按業務需求做處理,然後DAO做資料的持久化。那麼微服務也是這麼來寫嗎?
其實流程差不太多。DAO不需要在寫impl類實現介面了,而是直接在介面上使用註解,Service直接使用介面內的方法。(歡迎補充,相互學習!因為我做的第一個微服務專案從前端到後臺到資料庫設計都由我一人完成的,這個問題我也問過我經理,我的經理說微服務開發的流程就是沒有流程!(SSM官網:www.fhadmin.org)我覺得意思就是全靠自己想吧........)
2、Spring Boot與Spring Cloud
這裡不得不提一嘴Spring Cloud,關於這個框架後面也會專門來說。
如果說Spring Boot是員工。那麼Spring Cloud就是老闆。所有功能寫好之後,Spring Cloud就像是個管理者,每個員工(服務)會的技能都必須向老闆彙報,當一個員工想向另一個員工求助時,也得向老闆彙報,老闆給你排程。當然,Spring Cloud的功能不僅僅於此,關於這塊的東西,我會單獨寫一系列的部落格,包括微服務應用在雲上環境去跑時如何去使用。
3、Spring Boot整合Mybatis
接下來進入正題,Spring Boot是不推薦再去使用XML去做框架配置(化繁為簡),剛開始的時候我算是愁壞了,因為之前做專案,都是從XML中配置檢視解析器啊,AOP,事物管理,包括各種動態SQL。那麼如何使用註解進行這些配置呢?下面進行詳解。
3.1、 引入Spring Boot與Mybatis依賴包
因為Spring Boot畢竟出身名門,所以很多廠商都提供了與Spring Boot整合的包。Mybatis同樣也提供了mybatis-spring-boot-starter 目前 1.3.x 是最新版本。如果你的業務不需要十分繁瑣的SQL語句,那麼我推薦使用JPA的方式來操作資料庫會更加敏捷。
Maven方式引入:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1-SNAPSHOT</version>
</dependency>
Gradle方式引入:
dependencies {
compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1-SNAPSHOT")
}
3.2、 從屬性檔案中配置資料來源
配置資料來源我使用的是properties配置(SSM官網:www.fhadmin.org),程式碼如下:前四個是必配的,含義應該就不用解釋了吧,大家都懂。之後的可選配置不全,如果需要全的可以去看官方文件。
spring.datasource.url = jdbc:mysql://localhost:3306/spring-boot?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
#可選配置
# 初始化大小,最小,最大
spring.datasource.initialSize=10
spring.datasource.minIdle=10
spring.datasource.maxActive=20
# 配置獲取連線等待超時的時間
spring.datasource.maxWait=80000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=80000
# 配置一個連線在池中最小生存的時間,單位是毫秒
spring.datasource.minEvictableIdleTimeMillis=500000
# 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合併多個DruidDataSource的監控資料
spring.datasource.useGlobalDataSourceStat=true
#指定連線的事務的預設隔離級別.
spring.datasource.default-transaction-isolation
#指定driver的類名,預設從jdbc url中自動探測.
spring.datasource.driver-class-name
#是否採用FIFO返回連線.
spring.datasource.fair-queue
#使用Hikari connection pool時,在心跳檢查時傳遞的屬性
spring.datasource.health-check-properties.[key]
#指定連線多久沒被使用時,被設定為空閒,預設為10ms
spring.datasource.idle-timeout
#當初始化連線池時,是否忽略異常.
spring.datasource.ignore-exception-on-pre-load
3.3、 使用註解方式寫SQL語句
以上步驟做完,就可以寫SQL語句了。
最簡單的四個註解。分別對應查詢,更新,刪除,插入的SQL語句。
例子:
@Select("select * from admin")
@Update("update admin a set a.userName='二十歲以後'")
@Delete("delete from admin where userName='二十歲以後'")
@Insert("insert into admin (UserName,PassWord) values('二十歲以後','123')")
例子: 將註解括號內的引數進行引用 ,SQL語句中使用#{} 或 ${} 的方式都可以 ,使用#時變數是佔位符,可以防止sql注入。而$使用時,變數就是直接追加在sql中,一般會有sql注入問題。 還有就是通過#方式獲取變數時,可能會出現與資料庫的欄位的型別不匹配錯誤 ,比如時間型別可以使用$。
@Select("select * from admin where User_Name=#{UserName} ")
public Admin selectUser(@param("UserName") String UM);
不使用@Param註解的情況,那麼引數只能有一個,並且是Javabean。在SQL語句裡可以引用JavaBean的屬性,而且只能引用JavaBean的屬性。 例子如下:
// 這裡id是Admin的屬性
@Select("SELECT * from admin where id = ${id}")
public Admin selectAdminById(Admin admin);
結果對映列表: @Results、 @Result
例子: @Results是結果對映列表,@Result中property是Admin類的屬性名,colomn是資料庫表的欄位名 。將資料庫結果集和我JAVA中POJO類的欄位做繫結。(我記得Mybatis好像是有個功能,比如資料庫欄位名為User_Name,POJO的欄位名為UserName。符合這種規則的會自動繫結,無需手動。可以用mybatis-generator工具來生成POJO類)
@Results({
@Result(property="Id",column="UserId"),
@Result(property="UserName",column="UserName")
})
@Select("select UserId, UserName from admin where a.RealName=#{RM}")
public Admin selectAdminByRM(@Param("RM") String RM);
宣告Mapper介面 : @Mapper
例子: @Mapper將UserDao宣告為一個Mapper介面。
package cn.yy.dao;
@Mapper
public interface UserDao {
@Results({
@Result(property="Id",column="UserId"),
@Result(property="UserName",column="UserName")
})
@Select("select UserId, UserName from admin where a.RealName=#{RM}")
public Admin selectAdminByRM(@Param("RM") String RM);
}
到此SpringBoot整合Mybatis的初級介紹就到此為止,下一章我將介紹如何使用註解寫動態SQL。謝謝大家的閱讀。