前面兩篇文章咱們介紹瞭如何快速建立一個 Spring Boot 工程 《Spring Boot(一):快速開始》和在 Spring Boot 中如何使用模版引擎 Thymeleaf 渲染一個Web頁面 《Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 頁面》,本篇文章咱們繼續介紹在 Spring Boot 中如何使用數據庫。
數據庫方面咱們選用 Mysql , Spring Boot 提供了直接使用 JDBC 的方式鏈接數據庫,畢竟使用 JDBC 並非很方便,須要咱們本身寫更多的代碼才能使用,通常而言在 Spring Boot 中咱們經常使用的 ORM 框架有 JPA 和 Mybaties ,本篇文章咱們要介紹的就是 JPA 的使用姿式。html
說道使用 ORM 框架,就不得不順便聊一下鏈接池,市面上不少成熟的數據庫鏈接池,如 C3P0 、 Tomcat 鏈接池、 BoneCP 等等不少產品,可是咱們爲何要介紹 Hikari ?這個要從 BoneCP 提及。java
由於,傳說中 BoneCP 在快速這個特色上作到了極致,官方數據是C3P0等的25倍左右。不相信?其實我也不怎麼信。但是,有圖有真相啊,傳說圖片來源於官網,然而筆者在官網並無找到,你們看一下:mysql
看起來是否是徹底吊打,可是當 HikariCP 橫空出世之後,這個局面就被徹底改寫了, BoneCP 被 HikariCP 徹底吊打,看了一下 BoneCP Github 上面的版本更新,發如今2013年10月23日之後就再也沒有更新過了,包括在倉庫介紹上面都寫着建議你們使用 HikariCP ,看來做者已經徹底心灰意冷了。git
Hikari 這個詞來源於日文,是「光」的意思,估計做者的意思是這個鏈接池將會和光同樣快,不知道做者是否是日本人。github
HikariCP 的口號是快速,簡單,可靠。不知道是否真的如它本身宣傳的同樣,官方又提供了一張圖,你們感覺一下,這張圖來源於:https://github.com/brettwoold... 。web
更多有關 HikariCP 的信息,你們能夠訪問官方的 Github 倉庫瞭解:https://github.com/brettwoold... ,筆者這裏很少作介紹,畢竟咱們更關注的如何使用。spring
JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化規範。它爲 Java 開發人員提供了一種對象/關聯映射工具來管理 Java 應用中的關係數據。它的出現主要是爲了簡化現有的持久化開發工做和整合 ORM 技術,結束如今 Hibernate,TopLink,JDO 等 ORM 框架各自爲營的局面。sql
值得注意的是,JPA 是在充分吸取了現有 Hibernate,TopLink,JDO 等 ORM 框架的基礎上發展而來的,具備易於使用,伸縮性強等優勢。從目前的開發社區的反應上看, JPA 受到了極大的支持和讚賞,其中就包括了 Spring 與 EJB3. 0的開發團隊。數據庫
注意: JPA 是一套規範,不是一套產品,那麼像 Hibernate,TopLink,JDO 他們是一套產品,若是說這些產品實現了這個 JPA 規範,那麼咱們就能夠叫他們爲 JPA 的實現產品。
Spring Boot JPA 是 Spring 基於 ORM 框架、 JPA 規範的基礎上封裝的一套 JPA 應用框架,可以使開發者用極簡的代碼便可實現對數據的訪問和操做。它提供了包括增刪改查等在內的經常使用功能,且易於擴展!學習並使用 Spring Data JPA 能夠極大提升開發效率!apache
Spring Boot JPA 讓咱們解脫了 DAO 層的操做,基本上全部 CRUD 均可以依賴於它來實現。
Spring Boot JPA 幫咱們定義了不少自定義的簡單查詢,而且能夠根據方法名來自動生成 SQL ,主要的語法是 findXXBy
, readAXXBy
, queryXXBy
, countXXBy
, getXXBy
後面跟屬性名稱:
public interface UserRepository extends JpaRepository<UserModel, Long> { UserModel getByIdIs(Long id); UserModel findByNickName(String nickName); int countByAge(int age); List<UserModel> findByNickNameLike(String nickName); }
具體的關鍵字,使用方法和生產成SQL以下表所示:
Keyword | Sample | JPQL snippet |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname,findByFirstnameIs,findByFirstnameEquals | … where x.firstname = 1? |
Between | findByStartDateBetween | … where x.startDate between 1? and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age <= ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection<Age> ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection<Age> age) | … where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
這裏咱們建立工程 spring-boot-jpa-hikari 。
代碼清單:spring-boot-jpa-hikari/pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.springboot</groupId> <artifactId>spring-boot-jpa-hikari</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-jpa-hikari</name> <description>spring-boot-jpa-hikari</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
代碼清單:spring-boot-jpa-hikari/src/main/resources/application.yml
server: port: 8080 spring: application: name: spring-boot-jpa-hikari jpa: database: mysql show-sql: true generate-ddl: true database-platform: org.hibernate.dialect.MySQL5InnoDBDialect hibernate: ddl-auto: update datasource: url: jdbc:mysql://192.168.0.128:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: auto-commit: true minimum-idle: 2 idle-timeout: 60000 connection-timeout: 30000 max-lifetime: 1800000 pool-name: DatebookHikariCP maximum-pool-size: 5
注意:
有關 JPA 的配置有一點須要的, spring.jpa.hibernate.ddl-auto
,這個屬性需謹慎配置,它的幾個值的含義對數據庫來說都是高危操做,筆者這裏方便起見配置了 update
,各位讀者請根據具體使用場景配置。
com.zaxxer.hikari.HikariConfig
,筆者這裏僅簡單配置了自動提交、超時時間、最大最小鏈接數等配置。代碼清單:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/model/UserModel.java
@Entity @Data @Table(name = "user") public class UserModel { @Id @GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "uuid") @Column(name ="ID",nullable=false,length=36) private String id; @Column(nullable = true, unique = true) private String nickName; @Column(nullable = false) private int age; }
代碼清單:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/repository/UserRepository.java
public interface UserRepository extends JpaRepository<UserModel, Long> { UserModel getByIdIs(Long id); UserModel findByNickName(String nickName); int countByAge(int age); List<UserModel> findByNickNameLike(String nickName); }
代碼清單:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/controller/UserController.java
@RestController public class UserController { @Autowired UserRepository userRepository; /** * 查詢用戶列表 * @return */ @GetMapping("/user") public List<UserModel> user() { return userRepository.findAll(Sort.by("id").descending()); } /** * 新增或更新用戶信息 * @param user * @return */ @PostMapping("/user") public UserModel user(UserModel user) { return userRepository.save(user); } /** * 根據id刪除用戶 * @param id * @return */ @DeleteMapping("/user") public String deleteUserById(Long id) { userRepository.deleteById(id); return "success"; } }
測試咱們藉助工具 PostMan ,啓動工程,首先咱們新增一個用戶信息,如圖:
若是咱們參數中加入 id ,而且 id 的值和數據庫中的 id 維持一致,這是會更新當前 id 的數據,如圖:
咱們執行查詢操做,如圖:
執行刪除操做,如圖:
至此,測試完成。
https://github.com/brettwoold...
https://docs.spring.io/spring...
http://www.ityouknow.com/spri...