springboot整合通用Mapper簡(jiǎn)化單表操作詳解
前言
數(shù)據(jù)庫(kù)訪問(wèn)是web應(yīng)用必不可少的部分?,F(xiàn)今最常用的數(shù)據(jù)庫(kù)ORM框架有Hibernate與Mybatis,Hibernate貌似在傳統(tǒng)IT企業(yè)用的較多,而Mybatis則在互聯(lián)網(wǎng)企業(yè)應(yīng)用較多。通用Mapper 是一個(gè)基于Mybatis,將單表的增刪改查通過(guò)通用方法實(shí)現(xiàn),來(lái)減少SQL編寫(xiě)的開(kāi)源框架,且也有對(duì)應(yīng)開(kāi)源的mapper-spring-boot-starter提供。我們?cè)诖嘶A(chǔ)上加了一些定制化的內(nèi)容,以便達(dá)到更大程度的復(fù)用。
框架源碼地址
Demo源碼地址
在開(kāi)源mapper-spring-boot-starter的基礎(chǔ)上,增加了如下內(nèi)容:
- 針對(duì)MySQL數(shù)據(jù)庫(kù)與PostgreSQL數(shù)據(jù)庫(kù)添加了一些Java類(lèi)型與數(shù)據(jù)庫(kù)類(lèi)型的轉(zhuǎn)換處理類(lèi),如將List、Map類(lèi)型與MySQL數(shù)據(jù)庫(kù)的json類(lèi)型進(jìn)行轉(zhuǎn)換處理
- 對(duì)Domain、Mapper、Service、Controller各層進(jìn)行了封裝,將基本的增刪改查功能在各層通用化
- 提供了基于druid連接池的自動(dòng)配置
- 其它一些調(diào)整,如默認(rèn)映射復(fù)雜類(lèi)型屬性(主要是List、Map類(lèi)型,其它自定義類(lèi)型需要自定義轉(zhuǎn)換處理類(lèi)),將枚舉作為簡(jiǎn)單類(lèi)型處理
- 提供了一個(gè)parent項(xiàng)目,將一些常用的框架進(jìn)行集成,實(shí)際項(xiàng)目可繼承parent簡(jiǎn)化依賴配置(持續(xù)更新完善)
該框架可用于實(shí)際基于springboot的項(xiàng)目,只需簡(jiǎn)單配置數(shù)據(jù)源,即可引入druid連接池及通用mapper的功能,以及各層基本的增刪改查方法。
如何使用?
下文給出使用步驟,可參考示例
1. 框架Maven部署安裝
下載框架源碼后,在項(xiàng)目根路徑下執(zhí)行mvn clean install可安裝到本地maven庫(kù)。如果需要共享,且搭了Nexus私服,則在根路徑pom.xml文件中添加distributionManagement配置,指定Nexus倉(cāng)庫(kù)分發(fā)地址,使用mvn clean deploy安裝到遠(yuǎn)程maven倉(cāng)庫(kù),如
<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中有對(duì)應(yīng)賬號(hào)配置(id需要一一對(duì)應(yīng)),如
<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配置
項(xiàng)目中引入該數(shù)據(jù)庫(kù)框架有三種方式:
- 直接引入 cn.jboost.springboot:tkmapper-spring-boot-starter(沒(méi)有連接池)
- 直接引入 cn.jboost.springboot:druid-spring-boot-starter(druid連接池支持)
- 項(xiàng)目繼承 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>
根據(jù)情況引入mysql或postgresql的驅(qū)動(dòng)依賴(其它數(shù)據(jù)庫(kù)暫未做類(lèi)型轉(zhuǎn)換支持,未作測(cè)試)
3. 配置數(shù)據(jù)源
如果使用druid連接池,則在application.yml配置文件中,加入如下數(shù)據(jù)源配置(推薦)
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 # 配置獲取連接等待超時(shí)的時(shí)間 timeBetweenEvictionRunsMillis: 60000 # 配置間隔多久才進(jìn)行一次檢測(cè),檢測(cè)需要關(guān)閉的空閑連接,單位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一個(gè)連接在池中最小生存的時(shí)間,單位是毫秒 validationQuery: SELECT 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true # 打開(kāi)PSCache,并且指定每個(gè)連接上PSCache的大小 maxPoolPreparedStatementPerConnectionSize: 20 filters: stat #,wall(添加wall代碼里不能直接拼接sql,druid有sql注入校驗(yàn)) # 配置監(jiān)控統(tǒng)計(jì)攔截的filters,去掉后監(jiān)控界面sql無(wú)法統(tǒng)計(jì),'wall'用于防火墻 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 通過(guò)connectProperties屬性來(lái)打開(kāi)mergeSql功能;慢SQL記錄 useGlobalDataSourceStat: true # 合并多個(gè)DruidDataSource的監(jiān)控?cái)?shù)據(jù)
如果不使用連接池,則配置相對(duì)簡(jiǎn)單,如下
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. 定義相應(yīng)domain,mapper,service,controller各層對(duì)象
以demo為例(demo數(shù)據(jù)庫(kù)腳本見(jiàn)resources/schema.sql),domain定義一個(gè)User類(lèi),
@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注解指定數(shù)據(jù)庫(kù)表名,可通過(guò)繼承AutoIncrementKeyBaseDomain來(lái)實(shí)現(xiàn)自增主鍵,或UUIDKeyBaseDomain來(lái)實(shí)現(xiàn)UUID主鍵,如果自定義其它類(lèi)型主鍵,則繼承BaseDomain。
該框架Service層通用方法實(shí)現(xiàn)BaseService只支持單列主鍵,不支持組合主鍵(也不建議使用組合主鍵)
框架默認(rèn)對(duì)List、Map等復(fù)雜類(lèi)型屬性會(huì)映射到mysql的json類(lèi)型或postgresql的jsonb類(lèi)型,如果某個(gè)屬性不需要映射,可添加@Transient注解;枚舉類(lèi)型需添加@ColumnType指定jdbcType。
dao層定義UserMapper,
@Repository public interface UserMapper extends BaseMapper<User> { }
BaseMapper默認(rèn)實(shí)現(xiàn)了單表的增刪改查及批量插入等功能,如需定義復(fù)雜查詢,可在該接口中定義,然后通過(guò)mapper xml文件編寫(xiě)實(shí)現(xiàn)。
service層定義 UserService,繼承了BaseService的通用功能(具體可查看源碼),同樣可在該類(lèi)中自定義方法
@Service public class UserService extends BaseService<Integer, User> { @Transactional public void createWithTransaction(User user){ create(user); //用于測(cè)試事務(wù) throw new RuntimeException("拋出異常,讓前面的數(shù)據(jù)庫(kù)操作回滾"); } }
controller層定義 UserController,繼承了BaseController的通用接口(具體可查看源碼)
@RestController @RequestMapping("/user") public class UserController extends BaseController<Integer, User> { }
如上,只需要定義各層對(duì)應(yīng)的接口或類(lèi),繼承基礎(chǔ)接口或類(lèi),便完成了用戶基本的增刪改查功能,不需要寫(xiě)一行具體的實(shí)現(xiàn)代碼。
5. 測(cè)試、運(yùn)行
示例中提供了兩個(gè)新建用戶的單元測(cè)試,參考SpringbootTkmapperApplicationTests類(lèi)
運(yùn)行,在主類(lèi)上直接運(yùn)行,然后瀏覽器里打開(kāi)http://localhost:8080/user 則可列出單元測(cè)試中創(chuàng)建的用戶(其它接口參考BaseController實(shí)現(xiàn))
6. 總結(jié)
本文介紹框架基于tk.mybatis:mapper-spring-boot-starter做了一些自定義擴(kuò)展,以更大程度地實(shí)現(xiàn)復(fù)用。可用于實(shí)際項(xiàng)目開(kāi)發(fā)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaSwing FlowLayout 流式布局的實(shí)現(xiàn)
這篇文章主要介紹了JavaSwing FlowLayout 流式布局的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12四個(gè)實(shí)例超詳細(xì)講解Java?貪心和枚舉的特點(diǎn)與使用
貪心算法是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)上加以考慮,他所做出的是在某種意義上的局部最優(yōu)解,枚舉法的本質(zhì)就是從所有候選答案中去搜索正確的解,枚舉算法簡(jiǎn)單粗暴,他暴力的枚舉所有可能,盡可能地嘗試所有的方法2022-04-04Java面試題沖刺第十二天--數(shù)據(jù)庫(kù)(2)
這篇文章主要為大家分享了最有價(jià)值的三道數(shù)據(jù)庫(kù)面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-07-07Java11?中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化問(wèn)題
在?Java?語(yǔ)言中,類(lèi)和接口可以相互嵌套,這種組合之間可以不受限制的彼此訪問(wèn),包括訪問(wèn)彼此的構(gòu)造函數(shù)、字段、方法,接下來(lái)通過(guò)本文給大家介紹Java11中基于嵌套關(guān)系的訪問(wèn)控制優(yōu)化問(wèn)題,感興趣的朋友一起看看吧2022-01-01java中equals和等號(hào)(==)的區(qū)別淺談
java中equals和等號(hào)(==)的區(qū)別淺談,需要的朋友可以參考一下2013-05-05java9新特性Reactive?Stream響應(yīng)式編程?API
這篇文章主要為大家介紹了java9新特性響應(yīng)式編程API的特點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03