久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

 新用戶32269360 2020-06-11

1. 概述

數(shù)據(jù)庫方面我們選用 Mysql , Spring Boot 提供了直接使用 JDBC 的方式連接數(shù)據(jù)庫,,畢竟使用 JDBC 并不是很方便,,需要我們自己寫更多的代碼才能使用,一般而言在 Spring Boot 中我們常用的 ORM 框架有 JPA 和 Mybaties ,,本篇文章我們要介紹的就是 JPA 的使用姿勢(shì),。

說道使用 ORM 框架,,就不得不順便聊一下連接池,市面上很多成熟的數(shù)據(jù)庫連接池,,如 C3P0 ,、 Tomcat 連接池、 BoneCP 等等很多產(chǎn)品,,但是我們?yōu)槭裁匆榻B Hikari ,?這個(gè)要從 BoneCP 說起。(了解源碼可+求求: 1791743380)

因?yàn)?,傳說中 BoneCP 在快速這個(gè)特點(diǎn)上做到了極致,,官方數(shù)據(jù)是C3P0等的25倍左右。不相信,?其實(shí)我也不怎么信,。可是,,有圖有真相啊,,傳說圖片來源于官網(wǎng),然而筆者在官網(wǎng)并沒有找到,,大家看一下:

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

看起來是不是完全吊打,,但是當(dāng) HikariCP 橫空出世以后,這個(gè)局面就被完全改寫了,, BoneCP 被 HikariCP 完全吊打,,看了一下 BoneCP Github 上面的版本更新,發(fā)現(xiàn)在2013年10月23日以后就再也沒有更新過了,,包括在倉庫介紹上面都寫著建議大家使用 HikariCP ,,看來作者已經(jīng)完全心灰意冷了。

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

Hikari 這個(gè)詞來源于日文,,是“光”的意思,,估計(jì)作者的意思是這個(gè)連接池將會(huì)和光一樣快,不知道作者是不是日本人,。

HikariCP 的口號(hào)是快速,,簡(jiǎn)單,可靠,。不知道是否真的如它自己宣傳的一樣,,官方又提供了一張圖,大家感受一下,,這張圖來源于:https://github.com/brettwooldridge/HikariCP ,。

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

更多有關(guān) HikariCP 的信息,大家可以訪問官方的 Github 倉庫了解:https://github.com/brettwooldridge/HikariCP ,筆者這里不多做介紹,,畢竟我們更關(guān)注的如何使用,。

2. JPA 介紹

JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化規(guī)范。它為 Java 開發(fā)人員提供了一種對(duì)象/關(guān)聯(lián)映射工具來管理 Java 應(yīng)用中的關(guān)系數(shù)據(jù),。它的出現(xiàn)主要是為了簡(jiǎn)化現(xiàn)有的持久化開發(fā)工作和整合 ORM 技術(shù),,結(jié)束現(xiàn)在 Hibernate,TopLink,,JDO 等 ORM 框架各自為營的局面,。

值得注意的是,JPA 是在充分吸收了現(xiàn)有 Hibernate,,TopLink,,JDO 等 ORM 框架的基礎(chǔ)上發(fā)展而來的,具有易于使用,,伸縮性強(qiáng)等優(yōu)點(diǎn),。從目前的開發(fā)社區(qū)的反應(yīng)上看, JPA 受到了極大的支持和贊揚(yáng),,其中就包括了 Spring 與 EJB3. 0的開發(fā)團(tuán)隊(duì),。

注意: JPA 是一套規(guī)范,不是一套產(chǎn)品,,那么像 Hibernate,TopLink,JDO 他們是一套產(chǎn)品,,如果說這些產(chǎn)品實(shí)現(xiàn)了這個(gè) JPA 規(guī)范,那么我們就可以叫他們?yōu)?JPA 的實(shí)現(xiàn)產(chǎn)品,。

Spring Boot JPA 是 Spring 基于 ORM 框架,、 JPA 規(guī)范的基礎(chǔ)上封裝的一套 JPA 應(yīng)用框架,可使開發(fā)者用極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問和操作,。它提供了包括增刪改查等在內(nèi)的常用功能,,且易于擴(kuò)展!學(xué)習(xí)并使用 Spring Data JPA 可以極大提高開發(fā)效率,!

Spring Boot JPA 讓我們解脫了 DAO 層的操作,,基本上所有 CRUD 都可以依賴于它來實(shí)現(xiàn)。

Spring Boot JPA 幫我們定義了很多自定義的簡(jiǎn)單查詢,,并且可以根據(jù)方法名來自動(dòng)生成 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);
}COPY

具體的關(guān)鍵字,使用方法和生產(chǎn)成SQL如下表所示:

KeywordSampleJPQL snippet
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals… where x.firstname = 1?
BetweenfindByStartDateBetween… where x.startDate between 1? and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection age)… where x.age not in ?1
TruefindByActiveTrue()… where x.active = true
FalsefindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

3. 工程實(shí)戰(zhàn)

這里我們創(chuàng)建工程 spring-boot-jpa-hikari ,。

3.1 工程依賴 pom.xml

代碼清單:spring-boot-jpa-hikari/pom.xml


<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven./POM/4.0.0" xmlns:xsi="http://www./2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven./POM/4.0.0 https://maven./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>COPY
  • mysql-connector-java:mysql連接驅(qū)動(dòng)

  • spring-boot-starter-data-jpa:jpa相關(guān)的依賴包,,這個(gè)包里包含了很多內(nèi)容,包括我們使用的連接池 HikariCP ,,從 Spring Boot 2.x 開始,, Spring Boot 默認(rèn)的連接池更換成為 HikariCP ,在當(dāng)前的 Spring Boot 2.1.8 RELEASE 版本中,,所使用的 HikariCP 版本為 3.2.0 ,,如圖:

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

3.2 配置文件 application.yml

代碼清單:spring-boot-jpa-hikari/src/main/resources/application.yml


server:  port: 8080spring:  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: 5COPY

注意:

  1. 有關(guān) JPA 的配置有一點(diǎn)需要的, spring.jpa.hibernate.ddl-auto ,,這個(gè)屬性需謹(jǐn)慎配置,,它的幾個(gè)值的含義對(duì)數(shù)據(jù)庫來講都是高危操作,筆者這里方便起見配置了 update ,,各位讀者請(qǐng)根據(jù)具體使用場(chǎng)景配置,。

    • create :每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來生成新表,,哪怕兩次沒有任何改變也要這樣執(zhí)行,,這就是導(dǎo)致數(shù)據(jù)庫表數(shù)據(jù)丟失的一個(gè)重要原因。

    • create-drop :每次加載hibernate時(shí)根據(jù)model類生成表,,但是sessionFactory一關(guān)閉,表就自動(dòng)刪除,。

    • update :最常用的屬性,第一次加載hibernate時(shí)根據(jù)model類會(huì)自動(dòng)建立起表的結(jié)構(gòu)(前提是先建立好數(shù)據(jù)庫),,以后加載hibernate時(shí)根據(jù) model類自動(dòng)更新表結(jié)構(gòu),,即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,,表結(jié)構(gòu)是不會(huì)被馬上建立起來的,,是要等 應(yīng)用第一次運(yùn)行起來后才會(huì)。

    • validate :每次加載hibernate時(shí),,驗(yàn)證創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu),,只會(huì)和數(shù)據(jù)庫中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,,但是會(huì)插入新值,。

    • none :不做任何操作

  2. 有關(guān) HikariCP 更多的配置可以參考源碼類 com.zaxxer.hikari.HikariConfig ,筆者這里僅簡(jiǎn)單配置了自動(dòng)提交,、超時(shí)時(shí)間,、最大最小連接數(shù)等配置。

3.3 映射實(shí)體類 UserModel.java

代碼清單: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;
}COPY
  • unique : 唯一約束

  • 主鍵生成策略為uuid

3.4 資源類 UserRepository.java

代碼清單: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);
}COPY

3.5 接口測(cè)試類 UserController.java

代碼清單:spring-boot-jpa-hikari/src/main/java/com/springboot/springbootjpahikari/controller/UserController.java


@RestControllerpublic 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);
    }    /**
     * 根據(jù)id刪除用戶
     * @param id
     * @return
     */
    @DeleteMapping("/user")    public String deleteUserById(Long id) {
        userRepository.deleteById(id);        return "success";
    }
}COPY

4. 測(cè)試

測(cè)試我們借助工具 PostMan ,啟動(dòng)工程,,首先我們新增一個(gè)用戶信息,,如圖:

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

如果我們參數(shù)中加入 id ,并且 id 的值和數(shù)據(jù)庫中的 id 維持一致,,這是會(huì)更新當(dāng)前 id 的數(shù)據(jù),如圖:

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

我們執(zhí)行查詢操作,,如圖:

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

執(zhí)行刪除操作,,如圖:

Spring Boot (三): ORM 框架 JPA 與連接池 Hikari

至此,測(cè)試完成。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多