Spring Boot從入門到實戰:整合通用Mapper簡化單表操作

【空山新雨】發表於2019-06-25

資料庫訪問是web應用必不可少的部分。現今最常用的資料庫ORM框架有Hibernate與Mybatis,Hibernate貌似在傳統IT企業用的較多,而Mybatis則在網際網路企業應用較多。通用Mapper(https://github.com/abel533/Mapper) 是一個基於Mybatis,將單表的增刪改查通過通用方法實現,來減少SQL編寫的開源框架,且也有對應開源的mapper-spring-boot-starter提供。我們在此基礎上加了一些定製化的內容,以便達到更大程度的複用。

框架原始碼地址:https://github.com/ronwxy/base-spring-boot (持續更新完善中,歡迎follow,star)
Demo原始碼地址:https://github.com/ronwxy/springboot-demos/tree/master/springboot-tkmapper

在開源mapper-spring-boot-starter的基礎上,增加了如下內容:

  1. 針對MySQL資料庫與PostgreSQL資料庫新增了一些Java型別與資料庫型別的轉換處理類,如將List、Map型別與MySQL資料庫的json型別進行轉換處理
  2. 對Domain、Mapper、Service、Controller各層進行了封裝,將基本的增刪改查功能在各層通用化
  3. 提供了基於druid連線池的自動配置
  4. 其它一些調整,如預設對映覆雜型別屬性(主要是List、Map型別,其它自定義型別需要自定義轉換處理類),將列舉作為簡單型別處理
  5. 提供了一個parent專案,將一些常用的框架進行整合,實際專案可繼承parent簡化依賴配置(持續更新完善)

該框架可用於實際基於springboot的專案,只需簡單配置資料來源,即可引入druid連線池及通用mapper的功能,以及各層基本的增刪改查方法。

如何使用?
下文給出使用步驟,可參考示例:https://github.com/ronwxy/springboot-demos/tree/master/springboot-tkmapper

1. 框架Maven部署安裝

下載框架原始碼後,在專案根路徑下執行mvn clean install可安裝到本地maven庫。如果需要共享,且搭了Nexus私服,則在根路徑pom.xml檔案中新增distributionManagement配置,指定Nexus倉庫分發地址,使用mvn clean deploy安裝到遠端maven倉庫,如

<distributionManagement>
     <repository>
         <id>nexus-releases</id>
         <url>
             http://ip:port/repository/maven-releases/
         </url>
     </repository>
     <snapshotRepository>
         <id>nexus-snapshots</id>
         <url>
             http://ip:port/repository/maven-snapshots/
         </url>
     </snapshotRepository>
 </distributionManagement>

 

上述指定的repository需要在maven的全部配置檔案settings.xml中有對應賬號配置(id需要一一對應),如 

 <servers>
   <server>
     <id>nexus-snapshots</id>
     <username>admin</username>
     <password>xxx</password>
   </server>
<server>
     <id>nexus-releases</id>
     <username>admin</username>
     <password>xxx</password>
   </server>
 </servers>

 

2. pom.xml配置

專案中引入該資料庫框架有三種方式:

  1. 直接引入 cn.jboost.springboot:tkmapper-spring-boot-starter(沒有連線池)
  2. 直接引入 cn.jboost.springboot:druid-spring-boot-starter(druid連線池支援)
  3. 專案繼承 cn.jboost.springboot:spring-boot-parent(使用的是druid連線池)

三種方式的pom.xml配置如下

#第一種方式
<dependency>
   <groupId>cn.jboost.springboot</groupId>
   <artifactId>tkmapper-spring-boot-starter</artifactId>
   <version>1.2-SNAPSHOT</version>
</dependency>

#第二種方式
<dependency>
   <groupId>cn.jboost.springboot</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.2-SNAPSHOT</version>
</dependency>

#第三種方式
<parent>
   <groupId>cn.jboost.springboot</groupId>
   <artifactId>spring-boot-parent</artifactId>
   <version>1.2-SNAPSHOT</version>
   <relativePath/> <!-- lookup parent from repository -->
</parent>

 

根據情況引入mysql或postgresql的驅動依賴(其它資料庫暫未做型別轉換支援,未作測試)

 

3. 配置資料來源

如果使用druid連線池,則在application.yml配置檔案中,加入如下資料來源配置(推薦)

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
      username: root
      password:
      # 自定義配置
      initialSize: 2  # 初始化大小
      minIdle: 1   # 最小連線
      maxActive: 5 # 最大連線
      druidServletSettings:
        allow: 127.0.0.1
        deny:
        loginUsername: admin
        loginPassword: Passw0rd
        resetEnable: true
      druidFilterSettings:
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
      maxWait: 60000   # 配置獲取連線等待超時的時間
      timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
      minEvictableIdleTimeMillis: 300000 # 配置一個連線在池中最小生存的時間,單位是毫秒
      validationQuery: SELECT 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      poolPreparedStatements: true # 開啟PSCache,並且指定每個連線上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      filters: stat #,wall(新增wall程式碼裡不能直接拼接sql,druid有sql注入校驗) # 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
      useGlobalDataSourceStat: true # 合併多個DruidDataSource的監控資料

 

如果不使用連線池,則配置相對簡單,如下 

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
    username: root
    password:
    driver-class-name: com.mysql.jdbc.Driver

 

4. 定義相應domain,mapper,service,controller各層物件 

以demo為例(demo資料庫指令碼見resources/schema.sql),domain定義一個User類,

@Table(name = "user")
@Getter
@Setter
@ToString
public class User extends AutoIncrementKeyBaseDomain<Integer> {
    private String name;
    @ColumnType(jdbcType = JdbcType.CHAR)
    private Gender gender;
    private List<String> favor;
    private Map<String, String> address;

    public enum Gender{
        M,
        F
    }
}

 

需要新增@Table註解指定資料庫表名,可通過繼承AutoIncrementKeyBaseDomain來實現自增主鍵,或UUIDKeyBaseDomain來實現UUID主鍵,如果自定義其它型別主鍵,則繼承BaseDomain。 

該框架Service層通用方法實現BaseService只支援單列主鍵,不支援組合主鍵(也不建議使用組合主鍵)

框架預設對List、Map等複雜型別屬性會對映到mysql的json型別或postgresql的jsonb型別,如果某個屬性不需要對映,可新增@Transient註解;列舉型別需新增@ColumnType指定jdbcType。

dao層定義UserMapper

@Repository
public interface UserMapper extends BaseMapper<User> {
}

 

BaseMapper預設實現了單表的增刪改查及批量插入等功能,如需定義複雜查詢,可在該介面中定義,然後通過mapper xml檔案編寫實現。 

service層定義 UserService,繼承了BaseService的通用功能(具體可檢視原始碼),同樣可在該類中自定義方法

@Service
public class UserService extends BaseService<Integer, User> {

    @Transactional
    public void createWithTransaction(User user){
        create(user);
        //用於測試事務
        throw new RuntimeException("丟擲異常,讓前面的資料庫操作回滾");
    }
}

 

controller層定義 UserController,繼承了BaseController的通用介面(具體可檢視原始碼) 

@RestController
@RequestMapping("/user")
public class UserController extends BaseController<Integer, User> {
}

 

如上,只需要定義各層對應的介面或類,繼承基礎介面或類,便完成了使用者基本的增刪改查功能,不需要寫一行具體的實現程式碼。 

5. 測試、執行

  1. 示例中提供了兩個新建使用者的單元測試,參考SpringbootTkmapperApplicationTests

  2. 執行,在主類上直接執行,然後瀏覽器裡開啟 http://localhost:8080/user 則可列出單元測試中建立的使用者(其它介面參考BaseController實現)

6. 總結

本文介紹框架基於tk.mybatis:mapper-spring-boot-starter做了一些自定義擴充套件,以更大程度地實現複用。可用於實際專案開發,使用過程中如果遇到問題,可關注公眾號留言反饋。




我的個人部落格地址:http://blog.jboost.cn
我的頭條空間: https://www.toutiao.com/c/user/5833678517/#mid=1636101215791112
我的github地址:https://github.com/ronwxy
我的微信公眾號:jboost-ksxy

————————————————————————————————————————

微信公眾號
歡迎關注我的微信公眾號,及時獲取最新分享

相關文章