資料庫訪問是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的基礎上,增加了如下內容:
- 針對MySQL資料庫與PostgreSQL資料庫新增了一些Java型別與資料庫型別的轉換處理類,如將List、Map型別與MySQL資料庫的json型別進行轉換處理
- 對Domain、Mapper、Service、Controller各層進行了封裝,將基本的增刪改查功能在各層通用化
- 提供了基於druid連線池的自動配置
- 其它一些調整,如預設對映覆雜型別屬性(主要是List、Map型別,其它自定義型別需要自定義轉換處理類),將列舉作為簡單型別處理
- 提供了一個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配置
專案中引入該資料庫框架有三種方式:
- 直接引入 cn.jboost.springboot:tkmapper-spring-boot-starter(沒有連線池)
- 直接引入 cn.jboost.springboot:druid-spring-boot-starter(druid連線池支援)
- 專案繼承 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. 測試、執行
-
示例中提供了兩個新建使用者的單元測試,參考
SpringbootTkmapperApplicationTests
類 -
執行,在主類上直接執行,然後瀏覽器裡開啟 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
————————————————————————————————————————
歡迎關注我的微信公眾號,及時獲取最新分享