国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot : ORM 框架 JPA 與連接池 Hikari。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

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

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

因?yàn)?,傳說(shuō)中 BoneCP 在快速這個(gè)特點(diǎn)上做到了極致,官方數(shù)據(jù)是C3P0等的25倍左右。不相信?其實(shí)我也不怎么信。可是,有圖有真相啊,傳說(shuō)圖片來(lái)源于官網(wǎng),然而筆者在官網(wǎng)并沒(méi)有找到,大家看一下:
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
看起來(lái)是不是完全吊打,但是當(dāng) HikariCP 橫空出世以后,這個(gè)局面就被完全改寫(xiě)了, BoneCP 被 HikariCP 完全吊打,看了一下 BoneCP Github 上面的版本更新,發(fā)現(xiàn)在2013年10月23日以后就再也沒(méi)有更新過(guò)了,包括在倉(cāng)庫(kù)介紹上面都寫(xiě)著建議大家使用 HikariCP ,看來(lái)作者已經(jīng)完全心灰意冷了。
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
Hikari 這個(gè)詞來(lái)源于日文,是“光”的意思,估計(jì)作者的意思是這個(gè)連接池將會(huì)和光一樣快,不知道作者是不是日本人。

HikariCP 的口號(hào)是快速,簡(jiǎn)單,可靠。不知道是否真的如它自己宣傳的一樣,官方又提供了一張圖。
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
2. JPA 介紹**(了解源碼可+求求: 1791743380)**
JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化規(guī)范。它為 Java 開(kāi)發(fā)人員提供了一種對(duì)象/關(guān)聯(lián)映射工具來(lái)管理 Java 應(yīng)用中的關(guān)系數(shù)據(jù)。它的出現(xiàn)主要是為了簡(jiǎn)化現(xiàn)有的持久化開(kāi)發(fā)工作和整合 ORM 技術(shù),結(jié)束現(xiàn)在 Hibernate,TopLink,JDO 等 ORM 框架各自為營(yíng)的局面。

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

注意: JPA 是一套規(guī)范,不是一套產(chǎn)品,那么像 Hibernate,TopLink,JDO 他們是一套產(chǎn)品,如果說(shuō)這些產(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)用框架,可使開(kāi)發(fā)者用極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)的訪問(wèn)和操作。它提供了包括增刪改查等在內(nèi)的常用功能,且易于擴(kuò)展!學(xué)習(xí)并使用 Spring Data JPA 可以極大提高開(kāi)發(fā)效率!

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

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

具體的關(guān)鍵字,使用方法和生產(chǎn)成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 ages)	… where x.age in ?1
NotIn	findByAgeNotIn(Collection 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)

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.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>

mysql-connector-java:mysql連接驅(qū)動(dòng)
spring-boot-starter-data-jpa:jpa相關(guān)的依賴包,這個(gè)包里包含了很多內(nèi)容,包括我們使用的連接池 HikariCP ,從 Spring Boot 2.x 開(kāi)始, Spring Boot 默認(rèn)的連接池更換成為 HikariCP ,在當(dāng)前的 Spring Boot 2.1.8 RELEASE 版本中,所使用的 HikariCP 版本為 3.2.0 ,如圖:
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
3.2 配置文件 application.yml
代碼清單: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

注意:

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

create :每次加載hibernate時(shí)都會(huì)刪除上一次的生成的表,然后根據(jù)你的model類再重新來(lái)生成新表,哪怕兩次沒(méi)有任何改變也要這樣執(zhí)行,這就是導(dǎo)致數(shù)據(jù)庫(kù)表數(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ù)庫(kù)),以后加載hibernate時(shí)根據(jù) model類自動(dòng)更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了但表中的行仍然存在不會(huì)刪除以前的行。要注意的是當(dāng)部署到服務(wù)器后,表結(jié)構(gòu)是不會(huì)被馬上建立起來(lái)的,是要等 應(yīng)用第一次運(yùn)行起來(lái)后才會(huì)。
validate :每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
none :不做任何操作
有關(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;
}

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);
}

3.5 接口測(cè)試類 UserController.java
代碼清單: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);
    }

    /**
     * 根據(jù)id刪除用戶
     * @param id
     * @return
     */
    @DeleteMapping("/user")
    public String deleteUserById(Long id) {
        userRepository.deleteById(id);
        return "success";
    }
}

4. 測(cè)試
測(cè)試我們借助工具 PostMan ,啟動(dòng)工程,首先我們新增一個(gè)用戶信息,如圖:
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
我們執(zhí)行查詢操作,如圖:
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
執(zhí)行刪除操作,如圖:
Spring Boot : ORM 框架 JPA 與連接池 Hikari,spring boot,后端,java
至此,測(cè)試完成。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-622753.html

到了這里,關(guān)于Spring Boot : ORM 框架 JPA 與連接池 Hikari的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Jpa與Druid線程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久層

    Jpa與Druid線程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久層

    ? ? ? ? ? ? ? ? ? ? ? Jpa與Druid線程池及Spring Boot整合(一) Jpa與Druid線程池及Spring Boot整合(二):幾個(gè)坑 附錄官網(wǎng)文檔:core.domain-events域事件 docker實(shí)戰(zhàn)(一):centos7 yum安裝docker docker實(shí)戰(zhàn)(二):基礎(chǔ)命令篇 docker實(shí)戰(zhàn)(三):docker網(wǎng)絡(luò)模式(超詳細(xì)) docker實(shí)戰(zhàn)(四):docker架構(gòu)原理 docker實(shí)戰(zhàn)(五

    2024年02月13日
    瀏覽(34)
  • Jpa與Druid線程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑異常處理方案

    Jpa與Druid線程池及Spring Boot整合(二): spring-boot-starter-data-jpa 踏坑異常處理方案

    ? ? ? ? ? ? ? ? ? ?? docker實(shí)戰(zhàn)(一):centos7 yum安裝docker docker實(shí)戰(zhàn)(二):基礎(chǔ)命令篇 docker實(shí)戰(zhàn)(三):docker網(wǎng)絡(luò)模式(超詳細(xì)) docker實(shí)戰(zhàn)(四):docker架構(gòu)原理 docker實(shí)戰(zhàn)(五):docker鏡像及倉(cāng)庫(kù)配置 docker實(shí)戰(zhàn)(六):docker 網(wǎng)絡(luò)及數(shù)據(jù)卷設(shè)置 docker實(shí)戰(zhàn)(七):docker 性質(zhì)及版本選擇 認(rèn)知升維: 道、法、

    2024年02月13日
    瀏覽(27)
  • 在Spring Boot項(xiàng)目中使用JPA

    Spring Boot提供了啟動(dòng)器spring-boot-starter-data-jpa,只需要添加啟動(dòng)器(Starters)就能實(shí)現(xiàn)在項(xiàng)目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。 步驟01 添加JPA依賴。 首先創(chuàng)建新的Spring Boot項(xiàng)目,在項(xiàng)目的pom.xml中增加JPA相關(guān)依賴,具體代碼如下:

    2024年02月09日
    瀏覽(22)
  • Spring Boot 篇四: Spring Data JPA使用SQL Server

    Spring Boot 篇四: Spring Data JPA使用SQL Server

    本篇介紹篇一至篇三中用到的JPA鏈接SQL Server的具體情況以及實(shí)戰(zhàn)過(guò)程中可能遇到的問(wèn)題。 具體的下載和安裝教程,請(qǐng)參閱微軟SQL Server官網(wǎng); SQL Server Express 是免費(fèi)的,并且配套的SQL Server Management Studio也是可以用的。 呃,當(dāng)然,使用Docker來(lái)運(yùn)行SQL Server是另外一條路徑。具體

    2024年02月05日
    瀏覽(17)
  • 【Spring Boot】SpringBoot和數(shù)據(jù)庫(kù)交互: 使用Spring Data JPA

    在現(xiàn)代應(yīng)用程序的開(kāi)發(fā)中,數(shù)據(jù)是核心部分。為了能夠持久化、檢索、更新和刪除數(shù)據(jù),應(yīng)用程序需要與數(shù)據(jù)庫(kù)進(jìn)行交互。 1.1 為什么需要數(shù)據(jù)庫(kù)交互 數(shù)據(jù)持久化 :當(dāng)你關(guān)閉應(yīng)用程序或者服務(wù)器時(shí),你仍希望數(shù)據(jù)能夠保存。數(shù)據(jù)庫(kù)提供了一個(gè)持久的存儲(chǔ)方案,使得數(shù)據(jù)在關(guān)閉

    2024年02月12日
    瀏覽(29)
  • 【Spring Boot 3】【JPA】枚舉類型持久化

    軟件開(kāi)發(fā)是一門(mén)實(shí)踐性科學(xué),對(duì)大多數(shù)人來(lái)說(shuō),學(xué)習(xí)一種新技術(shù)不是一開(kāi)始就去深究其原理,而是先從做出一個(gè)可工作的DEMO入手。但在我個(gè)人學(xué)習(xí)和工作經(jīng)歷中,每次學(xué)習(xí)新技術(shù)總是要花費(fèi)或多或少的時(shí)間、檢索不止一篇資料才能得出一個(gè)可工作的DEMO,這占用了我大量的時(shí)

    2024年01月24日
    瀏覽(25)
  • Spring Boot 61:JPA 中的級(jí)聯(lián)類型

    Spring Boot 61:JPA 中的級(jí)聯(lián)類型

    圖源:簡(jiǎn)書(shū) (jianshu.com) 關(guān)系型數(shù)據(jù)庫(kù)的增刪改查操作會(huì)因?yàn)橛嘘P(guān)聯(lián)關(guān)系而存在“級(jí)聯(lián)操作”的需要,體現(xiàn)在 JPA 中,就是實(shí)體中會(huì)定義的級(jí)聯(lián)類型(Cascade Type)。 JPA 中的級(jí)聯(lián)類型由枚舉 jakarta.persistence.CascadeType 表示,包括: ALL PERSIST MERGE REMOVE REFRESH DETACH 這些級(jí)聯(lián)類型對(duì)應(yīng)實(shí)

    2024年02月12日
    瀏覽(23)
  • Spring Boot集成JPA和ClickHouse數(shù)據(jù)庫(kù)

    Spring Boot是一個(gè)用于創(chuàng)建獨(dú)立的、基于Spring的應(yīng)用程序的框架。它具有快速開(kāi)發(fā)特性,可以大大減少開(kāi)發(fā)人員的工作量。JPA(Java Persistence API)是Java中處理關(guān)系型數(shù)據(jù)庫(kù)持久化的標(biāo)準(zhǔn)規(guī)范,而ClickHouse是一個(gè)高性能、分布式的列式數(shù)據(jù)庫(kù)。 本文將介紹如何在Spring Boot項(xiàng)目中集成

    2024年02月09日
    瀏覽(18)
  • Spring Boot整合JPA 與 JpaRepository 基礎(chǔ)方法介紹

    1. 什么是JPA ? ?JPA(Java Persistence API, Java 持久化API)是SUN公司提出的Java持久化規(guī)范,它提供了一種對(duì)象/關(guān)系映射的管理工具來(lái)管理Java中的關(guān)系型數(shù)據(jù)庫(kù)。JPA的主要目的是簡(jiǎn)化現(xiàn)有的持久化開(kāi)發(fā)工作并且整合ORM框架,JPA本身并不是ORM框架,它是一種規(guī)范,這種規(guī)范可以私下

    2024年02月09日
    瀏覽(19)
  • 國(guó)慶中秋特輯(八)Spring Boot項(xiàng)目如何使用JPA

    國(guó)慶中秋特輯(八)Spring Boot項(xiàng)目如何使用JPA

    國(guó)慶中秋特輯系列文章: 國(guó)慶中秋特輯(八)Spring Boot項(xiàng)目如何使用JPA 國(guó)慶中秋特輯(七)Java軟件工程師常見(jiàn)20道編程面試題 國(guó)慶中秋特輯(六)大學(xué)生常見(jiàn)30道寶藏編程面試題 國(guó)慶中秋特輯(五)MySQL如何性能調(diào)優(yōu)?下篇 國(guó)慶中秋特輯(四)MySQL如何性能調(diào)優(yōu)?上篇 國(guó)慶

    2024年02月08日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包