Spring Boot入坑-5-資料訪問

拐子發表於2024-05-30

概述

  • 程式中的各種資料,包括業務、日誌、監控、行為等資料都需要儲存起來,儲存資料的就是資料庫,常指關係型資料庫

  • 任何一種程式語言或是框架都會提供對資料庫進行操作的通用API

  • 各種資料庫產品的廠商也會提供自身資料庫產品針對常用語言的資料庫驅動

  • Java亦是如此

  • Java提供了基礎的資料訪問介面JDBC,在此基礎上,也衍生了一些功能更加強大的資料訪問的第三方庫或元件

常用的資料訪問元件

  • JDBC:Java語言提供的最基礎的資料訪問

  • JdbcTemplate:Spring提供的資料操作元件,比JDBC操作更加方便

  • MyBatis:一個優秀的,也是最簡單的持久層框架,可透過XML或註解來配置資料表與實體關係,靈活性高;但需要有一定的SQL語言基礎

  • MyBatis-Plus:基於MyBatis的一款優秀的國產持久層框架,可免去SQL語句,完全物件導向

  • JPA(Java Persistence API):Java的一個持久層API,使用簡單方便,不需要程式中使用SQL語句,有一套JPQL支援物件式的查詢相關操作

  • Hibernate實現了JPA,並提供了;提供標準的ORM處理;且具有移植性好、提供快取、HQL等特點,使用簡單

例項資料E-R圖

  • 下圖是本章及後續業務會講解的資料的E-R(Entity-Relationship)圖(非標準圖)

  • 其中,id都為int型,自增;所有表都具有的create_bycreate_timeupdate_byupdate_time欄位

    Spring Boot入坑-5-資料訪問

    例項資料E-R圖

JDBC【擴充套件】

概述

  • Java資料庫連線(Java Database Connectivity),是Java API重要的組成部分,是應用程式與資料庫之間的橋樑

  • 提供了一組介面,提供給不同的資料庫產品實現

  • 不同的資料庫產品根據JDBC的介面,提供不同版本的 JDBC驅動

  • Java語言中,使用相應資料庫產品的驅動,就能連線指定資料庫進行資料操作

  • JDBC連線示意圖如下

    Spring Boot入坑-5-資料訪問

    JDBC連線示意圖

主要物件

  • DriverManager:驅動管理,負責建立資料庫連線

  • Connection:資料庫連線,負責開啟/關閉資料庫連線,並負責建立Statement

  • Statement:資料處理,負責對資料庫的查詢、新增、修改、刪除等操作

  • PreparedStatement,多次使用時,會先將SQL語句提交到資料庫做預處理,多次使用能提高效率,支援?變數形式,避免SQL隱碼攻擊問題,相比Statement安全

  • ResultSet:查詢結果集,提供對返回結果集的一系列操作,能夠遍歷獲取資料表資料,提供了next、getString、getInt等方法獲取資料

資料型別對映

  • Java中有自身的基本資料型別和常用的引用資料型別,如String、日期類

  • 每個資料庫產品中,也有自身的資料型別,各不相同,也與Java中有一定的差異,如MySQL、Oracle等

  • Java程式中處理時需要與資料庫中資料型別進行對映

  • 下面列出了Java與MySQL中的型別對映關係

    Spring Boot入坑-5-資料訪問

    Java型別與MySQL型別對映

使用步驟

  1. 引入依賴,在pom.xml中新增對mysql-connector-java的依賴

    <!-- 連線MySQL資料庫 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
  2. 新增配置,在專案配置檔案application.properties中新增JDBC連線配置

    #jdbc連線配置
    jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot
    jdbc.driver-class-name=com.mysql.cj.jdbc.Driver
    jdbc.username=root
    jdbc.password=root
  3. 定義實體類,在演示專案entity包下新增與資料庫表匹配的實體類

  4. 使用JDBC,在演示專案repository下實現資料庫的訪問

JdbTemplate【擴充套件】

概述

  • Spring在資料庫的操作上,對JDBC做了再次的封裝,即JdbcTemplate

  • 同時,可以配置預設的HikariCP資料庫連線池引數

連線池【擴充套件】

  • 連線的頻繁建立與銷燬,是有很大的開銷的,於是就有了連線池

  • 連線池主要作用

    • 限制總量,連線本身比較耗費資源,且過多容易導致資料庫可用性差,讓超過限制問題的連線等待

    • 複用,預先建立一定量的資料庫連線,需要時直接使用,降低建立、銷燬頻率,提高資料庫連線利用率

  • JDBC有一個標準的連線池介面javax.sql.DataSource,實現該介面的產品,即可快速接入

  • 業界提供了一系列的連線池實現技術

    • HikariCP(Spring Boot預設連線池)

    • Druid

    • C3P0

    • BoneCP

使用步驟

  1. 引入依賴,在pom.xml中新增對spring-boot-starter-jdbc、mysql-connector-java的依賴

    <!-- 連線MySQL資料庫 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    ​
    <!-- jdbcTemplate需要的依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
  2. 新增配置,在專案配置檔案application.properties中新增JdbcTemplate資料庫連線配置和HikariCP連線池配置

    #JdbcTemplate配置,並且適用所有後續的資料庫連線方式,像MyBatis等
    spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    ​
    #hikariCP連線池配置
    spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    spring.datasource.hikari.minimum-idle=5
    spring.datasource.hikari.maximum-pool-size=15
    spring.datasource.hikari.auto-commit=true
    spring.datasource.hikari.idle-timeout=30000
    spring.datasource.hikari.pool-name=MyHikariCP
    spring.datasource.hikari.max-lifetime=1800000
    spring.datasource.hikari.connection-timeout=30000
    spring.datasource.hikari.connection-test-query=SELECT 1
  3. 配置日誌,在專案配置檔案application.properties中新增SQL語句debug日誌資訊輸出,【可選】

    #JdbcTemplate日誌配置
    logging.level.org.springframework.jdbc.core.JdbcTemplate=debug
  4. 定義實體類,在演示專案entity包下新增與資料庫表匹配的實體類

  5. 使用JdbcTemplate,在需要使用的地方自動裝配JdbcTemplate使用,並將運算元據與實體類進行手動對映,具體見演示專案的repository包下

注意:日期格式在application.properties中配置

MyBatis【擴充套件】

概述

  • MyBatis是一款優秀的持久層框架,支援自定義SQL、儲存過程以及高階對映

  • MyBatis免除了幾乎所有的JDBC程式碼以及設定引數和獲取結果集的工作

  • MyBatis可以透過簡單的XML配置註解配置,將Java POJO( Plain Ordinary Java Object / Pure Old Java Object ,普通老式 Java 物件)對映為資料庫中的記錄

  • 現在指的是MyBatis 3,具體使用方式,參考官網文件:https://mybatis.org/mybatis-3/zh/index.html

XML方式

概述
  • 傳統的MyBatis使用方式,多使用XML配置進行

  • 相對來說,這種方式稍顯複雜,且沒有結構化語法支援,出現問題也不容易排查

使用步驟
  1. 引入依賴,在pom.xml中新增對mysql-connector-java、mybatis-spring-boot-starter的依賴

    <!-- 連線MySQL資料庫 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
  2. 新增配置,在專案配置檔案application.properties中新增MyBatis相關配置資料庫連線配置和HikariCP連線池配置,其中比較重要的是與@Mapper註解的介面關聯的xml路徑配置

    #資料庫連線配置
    spring.datasource.url=jdbc:mysql://localhost:3306/springboot
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    ​
    #mybatis配置
    #掃描的xml
    mybatis.mapper-locations=classpath:mapper/*.xml
    #xml配置中的type的基礎包包
    mybatis.type-aliases-package=com.example.entity
    #mysql的下劃線轉駝峰,如資料庫欄位create_time對映到實體類的createTime
    mybatis.configuration.map-underscore-to-camel-case=true
    #mybatis日誌配置
    logging.level.com.example.mapper=debug
    #是否開啟二級快取
    #mybatis.configuration.cache-enabled=true
    ​
    #hikariCP連線池配置
    #連線池型別
    spring.datasource.type=com.zaxxer.hikari.HikariDataSource
    #最小空閒連線
    spring.datasource.hikari.minimum-idle=5
    #最大連線數
    spring.datasource.hikari.maximum-pool-size=15
    #連線池返回的連線自動提交
    spring.datasource.hikari.auto-commit=true
    #空閒連線超時時間,預設值600000(10分鐘)
    spring.datasource.hikari.idle-timeout=30000
    #連線池名稱
    spring.datasource.hikari.pool-name=MyHikariCP
    #連線最大存活時間
    spring.datasource.hikari.max-lifetime=1800000
    #連線超時時間
    spring.datasource.hikari.connection-timeout=30000
    #測試連線是否可用的查詢語句
    spring.datasource.hikari.connection-test-query=SELECT 1
  3. 配置日誌,也可以新增SQL語句debug日誌資訊輸出,使用logging.level.mapper所在包=debug使用,見上述程式碼中的配置,【可選】;注意,生產環境一般不輸出此日誌

  4. 定義實體類,在entity包下新增與資料庫表匹配的實體類;注意,實體類的屬性一般需要與資料庫表的欄位名相一致,一般實體類屬性使用小駝峰,資料庫表的欄位使用劃線,如屬性createBy對應表的create_by欄位

  5. 定義Mapper介面,在mapper包下新增對應資料表的Mapper介面及資料操作方法,並給介面新增@Mapper註解,將會自動注入Spring容器

  6. 新增XML配置,針對定義的Mapper介面,新增標準的XML配置,需要指定XML配置存放目錄(一般是在resources\mapper目錄,並在application.properties中透過mybatis.mapper-locations指向該配置目錄下的*.xml檔案);同時,在XML配置中,新增針對Mapper介面中資料操作方法匹配的SQL語句;相當於定義了Mapper介面的實現類;具體的模板如下(如果沒有,可以自行新增,在Settings選單下的Editor->File and Code Templates下新增)

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="">
    </mapper>

  7. 使用MyBatis,在相應的服務中,就可以直接裝配使用定義的Mapper介面,並使用其資料操作方法執行資料操作

註解方式

概述
  • 基於XML配置的複雜性和沒有結構化語法支援,註解方式更容易被接受

  • 註解方式與XML方式類似

使用步驟
  • 與XML配置方式類似,只是將使用XML配置,替換成了在Mapper上使用@Select、@Insert、@Update、@Delete等註解完成

動態SQL【擴充套件】

概述
  • XML方式支援if、foreach、choosen(when、otherwise)、trim(where、set)等動態SQL支援

  • 註解方式,使用Provider形式提供支援

#和$
  • #

    • 預編譯,能防止SQL隱碼攻擊,自動新增‘’

    • 主要用於對應欄位的資料值

    • 儘量使用#

  • $

    • 語句拼接,會有SQL隱碼攻擊風險,不會自動新增’’

    • 主要用於動態表名、Order By列、分頁資料,使用時字串要使用’${xxx}’格式

關聯查詢
  • 一對一:XML方式使用多表association語法或join語法;註解方式使用@One註解

  • 一對多:XML方式使用多表collection語法或join語法;註解方式使用@Many註解

  • 多對多:一般會拆成不同方向的一對多處理

快取【擴充套件】

  • MyBatis內建了一個強大的事務性查詢快取機制,分為一級快取和二級快取,第一次查詢時,會將資料快取起來,再次查詢,資料將從快取中獲取;當然,如果中間有新增、更新、刪除等操作,快取將失效

  • 一級快取,基於同一次請求的SqlSession,如果這個過程中一個相同的查詢會執行多次,可以在相應的服務入口方法新增@Transactional註解,會啟用一級快取,提高查詢效率

  • 二級快取,基於同一個namespace,也即同一個Mapper的快取,在配置檔案中新增<cache />(註解形式新增@CacheNamespace(blocking = true)註解),可啟用二級快取

  • 注意,如果是分散式的多節點部署,則不要開啟一級快取、二級快取;直接使用第三方的Redis、Memcached等第三方快取

  • 詳細介紹MyBatis站點:https://mybatis.org/mybatis-3/zh/index.html

Spring事務

  • Spring Boot中提供了事務處理機制針對各種資料訪問技術 ,如JdbcTemplate、MyBatis、MyBatis Plus等,分宣告式事務和程式設計式事務

  • 宣告式事務掌握

    • 基於AOP

    • 使用註解@Transactional標註在public修飾的方法上

    • 特點:使用簡單,但整個註解方法持續佔用當前Connection,直到方法結束才釋放Connection,效率相對相低

  • 程式設計式事務,瞭解【擴充套件】

    • 使用TransactionTemplate、TransactionCallback、TransactionStatus組合完成,底層使用的是PlatformTransactionManager類

    • 特點:控制粒度更小,比宣告式複雜,但可以控制只在TransactionTemplate.execute()方法中使用Connection,對於一些業務中具有事務特性,但也參雜大量資料查詢、IO非事務特性場景,可考慮使用程式設計式事務

  • 注意:在其他的資料訪問組合中,可以使用相同機制使用Spring事務

MyBatis-Plus

概述

  • 潤物無聲:只做增強不做改變,引入它不會對現有工程產生影響,如絲般順滑

  • 效率至上:只需簡單配置,即可快速進行單表 CRUD 操作,從而節省大量時間

  • 豐富功能:程式碼生成、物理分頁、效能分析等功能一應俱全

  • 最重要特點:基於MyBatis,但去除掉了MyBatis對於SQL語句的依賴,使用更簡單

使用步驟

  1. 引入依賴:MyBatis Plus需要的依賴包mysql-connector-java、mybatis-plus-boot-starter

    <!-- 連線MySQL資料庫 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <!--MyBatis-Plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.3.1</version>
    </dependency>
  2. 新增配置:與MyBatis相同,在專案配置檔案application.properties中新增MyBatis相關配置資料庫連線配置和HikariCP連線池配置;與MyBatis相同

  3. 定義實體類

    1. 表名對映:在與表對應的實體類上新增@TableName("表名")

    2. 主鍵屬性:新增@TableId(type= IdType.AUTO)

    3. 普通屬性:如果實體類屬性與資料庫中欄位名不同,可新增 @TableField(value = "列名")進行對映

  4. 定義Mapper:針對實體,定義Mapper介面,並繼承BaseMapper<實體類>;如下面就是使用者的Mapper

    package com.example.mapper;
    ​
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.entity.UserEntity;
    ​
    public interface UserMapper extends BaseMapper<UserEntity> {
    }
  5. 新增@MapperScan註解:在配置類或啟動類新增@MapperScan(mapper包),掃描指定mapper包下的所有繼承於BaseMapper的類

    -------------------------------------------------此時,就可以使用Mapper進行資料訪問,但方法不夠豐富-------------------------------------------------

  6. 定義Service:針對實體,定義Service介面,並繼承IService<實體類>;針對實體,定義Service介面實現,並繼承服務介面與ServiceImpl<對映Mapper,實體類>,此時,在Service實現中,可使用ServiceImpl的眾多對Mapper的封裝方法;提供了一系列的便利操作,【可選】

  7. 分頁,需要返回一個指定資料庫型別的分頁配置MybatisPlusInterceptor物件,因為不同的資料庫型別分佈邏輯並不相同(如SQL Server是top xxx,My SQL是limit),見config\MybatisPlusConfig類

  8. 使用MyBatis-Plus,在相應的服務中,可直接使用Mapper,也可直接使用Service

多層結構中的問題

問題一

  • 新增/修改時,需要呼叫方提供建立人/修改人和時間資訊嗎?新增/修改時,需要呼叫方提供主鍵ID嗎?

  • 返回響應資訊時,需要包含密碼麼?

  • 返回基礎字典資料作為前端頁面中的被選擇項時,需要返回建立人/修改人和時間等資訊麼?

問題二

  • 登入時,如果不成功,可能返回[使用者名稱不存在]、[密碼錯誤]、[密碼次數超限]不同形式的錯誤提示資訊;如果成功,則返回使用者及相關詳細資訊,兩者結構不同,介面使用者如何方便判斷、相容?

  • 如果返回時不僅需要返回資料集合,還需要有如分佈的彙總等資訊輸出,如何相容?

DTO

  • 資料傳輸物件(Data Transfer Object),用於專案各個層次資料傳輸,主要針對Service、Controller層接收和返回的都應該是DTO,是物件導向的

  • 有了DTO後,entity將會專注於與資料表一對一對映

  • DTO可能是多個entity屬性的組合,也可能是某個entity的一部分屬性,重點是呈現介面需要的輸入/輸出資料,不包含一些介面無關的資料,比如查詢時的密碼、儲存時的建立時間和更新時間等

  • DTO應用目的:讓介面或服務,只接收需要的輸入,只返回必需的輸出

  • 解決上述問題一

請求封裝和響應封裝

請求封裝
  • 一般會相容比較豐富的請求資料,不做過多封裝,一般是Java包裝類、DTO,分頁請求除外

  • 一般的專案,可以不對請求進行封裝,直接使用DTO即可

響應封裝
  • 一般會封裝成標準格式,並提供一些便利操作方法,標準格式包括code、message、data、total等

  • 一個專案,必須有一個標準的響應封裝,甚至一個團隊所有的專案保持相同的響應封裝,給外部提供的服務介面更易讀

  • 響應封裝應用目的:提供標準的響應,讓呼叫方法處理更簡單

  • 解決上述問題二

物件對映

概述
  • 由於引入了DTO,就存在比較頻繁的DTO與Entity之間的物件相互賦值,逐個屬性的getter和setter賦值相對程式碼比較麻煩

  • 可使用Spring中的BeanUtils進行對映,也可以使用第三方的工具

  • ModelMapper能夠實現具有相同屬性的物件間的屬性值自動對映

使用步驟
  • 引入依賴,在pom.xml中引入modelmapper-jackson依賴

    <!-- 基於jackson的物件對映 -->
    <dependency>
        <groupId>org.modelmapper.extensions</groupId>
        <artifactId>modelmapper-jackson</artifactId>
        <version>2.4.5</version>
    </dependency>
  • 將ModelMapper注入Spring容器,透過新增一個配置類實現

    package com.example.config;
    ​
    import org.modelmapper.ModelMapper;
    import org.modelmapper.convention.MatchingStrategies;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    ​
    /**
     * 物件對映工具Bean
     */
    @Configuration
    public class ModelMapperConfig {
        @Bean
        public ModelMapper modelMapper() {
            ModelMapper modelMapper = new ModelMapper();
            //設定對映時匹配策略
            //Standard表示標準匹配策略,為預設選項
            //Loose表示鬆散匹配策略
            //Strict表示嚴格匹配策略
            modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
            return modelMapper;
        }
    }
  • 自動裝配使用,需要的類中裝配就好,也可以直接new ModelMapper使用;如下面的程式碼返回一個

    UserOutputDto userOutputDto = modelMapper.map(userEntity, UserOutputDto.class);

領域驅動設計(Domain-Driven Design)【擴充套件】

概述
  • 主要是由領域專家、業務人員、技術人員組合一起進行業務建模的一種設計方式

  • 並構建出一個大家都能接受的業務模型,勾勒出產品全貌,最後交付可接收的產品

  • 涉及到很多概念,可擴充套件學習

各種Object封裝的特點
  • VO(View Object):檢視物件,用於展示層,它的作用是把某個指定頁面(或元件)的所有資料封裝起來

  • DTO(Data Transfer Object):資料傳輸物件,這個概念最早來源於J2EE,泛指用於展示層與服務層之間的資料傳輸物件

  • DO(Domain Object):領域物件,就是從現實世界中抽象出來的有形或無形的業務實體,會是多個PO的組合

  • PO(Persistent Object):持久化物件,也就是Entity,它跟持久層(通常是關係型資料庫)的資料結構形成一一對應的對映關係

    Spring Boot入坑-5-資料訪問

    各種Object的關係(圖片來自網路)
例項專案中的DTO與Entity
  • 具體見附件的springboot-data-mybatis-plus專案

Spring Boot入坑-5-資料訪問

例項專案中的DTO與Entity關係

資料驗證

概述
  • 在實際的專案中,介面對於請求引數是要進行一定的合理性驗證

  • 常用的驗證有兩種處理方式

    • 通用性驗證,可藉助第三方元件(如Spring Boot Validation)進行,驗證通常包括非空,長度,格式化等

    • 業務性驗證,一般需要手寫程式碼實現

Spring Boot Validation
  • 提供了一系列註解來對需要驗證的Dto進行驗證標識,如@NotNull、@Length、@Min、@Max等

  • 底層依賴hibernate-validator

Spring Boot Validation使用步驟

  1. 新增依賴:在pom中引入spring-boot-starter-validation

    <!-- 【通用驗證】1、新增依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
  2. 新增通用異常處理:新增ControllerAdvice針對BindException資料繫結異常的通用處理,程式碼片斷如下

    package com.example.advice;
    ​
    import com.example.dto.common.ResponseData;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.validation.BindException;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Collectors;
    ​
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @Autowired
        ObjectMapper objectMapper;
    ​
        /**
         * 【通用驗證】1、新增依賴
         * 攔截BindException,所有的驗證框架spring-boot-starter-validation裡的註解如果不符合規則都會丟擲此異常
         * @param ex
         * @throws IOException
         */
        @ExceptionHandler(BindException.class)
        @ResponseBody
        public ResponseData handleBindException(BindException ex) {
            //獲取錯誤資訊
            List<FieldError> fieldErrors = ex.getFieldErrors();
            List<String> errors = new ArrayList<>();
            fieldErrors.stream().forEach(s->{
                errors.add(s.getDefaultMessage());
            });
    ​
            //構建標準響應
            ResponseData responseData = new ResponseData();
            responseData.setCode(996);
            responseData.setMessage(errors.stream().collect(Collectors.joining(",")));
    ​
            return responseData;
        }
    }
  3. 輸入DTO新增驗證註解:在介面請求引數的DTO上新增相應驗證註解,程式碼片斷如下

    package com.example.dto.input.user;
    ​
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    import org.hibernate.validator.constraints.Length;
    ​
    import javax.validation.constraints.NotNull;
    ​
    /**
     * 使用者建立傳入DTO
     */
    @ApiModel(value = "使用者建立傳入DTO",description = "使用者建立傳入資訊DTO")
    @Data
    public class UserCreateInputDto {
        //【通用驗證】3、輸入DTO新增驗證註解
        @ApiModelProperty(value = "使用者名稱")
        @NotNull(message = "使用者名稱不能為空")
        @Length(min = 2,max = 20,message = "使用者名稱長度必須在2-20個字元之間")
        private String username;
    ​
        //【通用驗證】3、輸入DTO新增驗證註解
        @ApiModelProperty(value = "密碼")
        @NotNull(message = "密碼不能為空")
        @Length(min = 6,max = 20,message = "密碼長度必須在6-50個字元之間")
        private String password;
    ​
        //【通用驗證】3、輸入DTO新增驗證註解
        @ApiModelProperty(value = "姓名")
        @NotNull(message = "姓名不能為空")
        @Length(min = 4,max = 20,message = "姓名長度必須在4-50個字元之間")
        private String name;
    ​
        @ApiModelProperty(value = "描述")
        private String description;
    ​
    }
  4. HTTP請求介面新增@Validated註解:在Controller介面請求引數DTO前新增@Validated註解,程式碼片斷如下

    /**
    * 【通用驗證】4、HTTP請求介面新增@Validated註解
    * @param inputDto
    * @return
    */
    @ApiOperation(value = "建立",notes = "建立一條新資料")
    @PostMapping("/")
    ResponseData create(@RequestBody @Validated UserCreateInputDto inputDto){
       return userService.create(inputDto);
    }
  5. 生效,將會自動攔截生效

MyBatis-Plus的其他功能

自動填充

概述
  • 對於一些基礎的資料,是要根據資料產生的上下文自動產生的,如建立某條資料時的建立人、建立時間,多租戶的租戶資訊等

  • MyBatis-Plus中使用MetaObjectHandler介面,並配合@TableField註解實現自動填充

使用步驟
  1. 新增攔截

    • 新增MetaObjectHandler介面實現,並重寫insertFill、updateFill方法

    • 在方法中,使用登入時儲存在Session中的登入人資訊,填充建立人、更新人資訊

    • 在方法中,使用當前時間,設定建立時間、更新時間

  2. 關聯到實體類

    • 建立人/建立時間攔截,在實體類使用@TableField(fill = FieldFill.INSERT)註解實現攔截

    • 更新人/更新時間攔截,在實體類使用@TableField(fill =FieldFill.INSERT_UPDATE)註解實現攔截

多資料來源【擴充套件】

概述
  • MyBatis-Plus中,能方法的支援多資料來源

使用步驟
  1. 引入依賴:MyBatis-plus需要的依賴包mysql-connector-java、 mybatis-plus-boot-starter、 dynamic-datasource-spring-boot-starter

  2. 在application.properties中新增資料庫連線和相應配置

  3. 其他Entity、Mapper、Service同單資料來源

  4. 在Service上新增@DS(“資料來源”)使用指定的資料來源即可

JPA【擴充套件】

概述

  • 除了上述的資料訪問方式,Spring Boot中還整合了JPA

  • Java持久層API(Java Persistence API),提供了一套標準的ORM規範,目標是讓開發人員少寫或不寫SQL語句,主要實現產品有Hibernate、TopLink、Eclipselink等

  • 特點:簡單易用,整合方便,支援物件導向的特性,提供獨特的JPQL查詢語言

  • 底層使用的是Hibernate

使用方式

  1. 引入依賴,JPA需要的依賴包mysql-connector-java、 spring-boot-starter-data-jpa

  2. 新增配置,在application.properties中新增資料庫連線和相應配置

  3. 定義實體類

    • 表名對映:在與表對應的實體類上新增@Table(“表名”)、@Entity

    • 主鍵屬性:新增@Id、@GeneratedValue(strategy=GenerationType.IDENTITY)

    • 普通屬性:如果與資料庫中列名不同,可新增 @Column(value = "列名")進行對映

  4. 定義Repository,針對實體,定義Repository介面,並繼承JpaRepository<實體類, 主鍵型別> ,此時,Repository就可以用於做資料訪問

此外,在定義的Repository介面中,還提供了findByXXX宣告式的查詢

注意

注意

專案比較多,爭取掌握springboot-data-mybatis-plus專案的資料訪問、DTO、ResponseData封裝、物件對映、自動填充

程式碼

網盤地址:連結:https://pan.baidu.com/s/18DaKpTTx9T__XG8jkv3naw?pwd=8888

相關文章