最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合通用Mapper簡(jiǎn)化單表操作詳解

 更新時(shí)間:2019年06月25日 09:02:04   作者:空山新雨  
這篇文章主要介紹了springboot整合通用Mapper簡(jiǎn)化單表操作,通用Mapper是一個(gè)基于Mybatis,將單表的增刪改查通過通用方法實(shí)現(xiàn),來(lái)減少SQL編寫的開源框架,需要的朋友可以參考下

前言

數(shù)據(jù)庫(kù)訪問是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,將單表的增刪改查通過通用方法實(shí)現(xiàn),來(lái)減少SQL編寫的開源框架,且也有對(duì)應(yīng)開源的mapper-spring-boot-starter提供。我們?cè)诖嘶A(chǔ)上加了一些定制化的內(nèi)容,以便達(dá)到更大程度的復(fù)用。

框架源碼地址

Demo源碼地址

在開源mapper-spring-boot-starter的基礎(chǔ)上,增加了如下內(nèi)容:

  1. 針對(duì)MySQL數(shù)據(jù)庫(kù)與PostgreSQL數(shù)據(jù)庫(kù)添加了一些Java類型與數(shù)據(jù)庫(kù)類型的轉(zhuǎn)換處理類,如將List、Map類型與MySQL數(shù)據(jù)庫(kù)的json類型進(jìn)行轉(zhuǎn)換處理
  2. 對(duì)Domain、Mapper、Service、Controller各層進(jìn)行了封裝,將基本的增刪改查功能在各層通用化
  3. 提供了基于druid連接池的自動(dòng)配置
  4. 其它一些調(diào)整,如默認(rèn)映射復(fù)雜類型屬性(主要是List、Map類型,其它自定義類型需要自定義轉(zhuǎn)換處理類),將枚舉作為簡(jiǎn)單類型處理
  5. 提供了一個(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ù)框架有三種方式:

  1. 直接引入 cn.jboost.springboot:tkmapper-spring-boot-starter(沒有連接池)
  2. 直接引入 cn.jboost.springboot:druid-spring-boot-starter(druid連接池支持)
  3. 項(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ù)暫未做類型轉(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 # 打開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 # 通過connectProperties屬性來(lá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ù)腳本見resources/schema.sql),domain定義一個(gè)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注解指定數(shù)據(jù)庫(kù)表名,可通過繼承AutoIncrementKeyBaseDomain來(lái)實(shí)現(xiàn)自增主鍵,或UUIDKeyBaseDomain來(lái)實(shí)現(xiàn)UUID主鍵,如果自定義其它類型主鍵,則繼承BaseDomain。

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

框架默認(rèn)對(duì)List、Map等復(fù)雜類型屬性會(huì)映射到mysql的json類型或postgresql的jsonb類型,如果某個(gè)屬性不需要映射,可添加@Transient注解;枚舉類型需添加@ColumnType指定jdbcType。

dao層定義UserMapper,

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

BaseMapper默認(rèn)實(shí)現(xiàn)了單表的增刪改查及批量插入等功能,如需定義復(fù)雜查詢,可在該接口中定義,然后通過mapper xml文件編寫實(shí)現(xiàn)。

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

@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)的接口或類,繼承基礎(chǔ)接口或類,便完成了用戶基本的增刪改查功能,不需要寫一行具體的實(shí)現(xiàn)代碼。

5. 測(cè)試、運(yùn)行

示例中提供了兩個(gè)新建用戶的單元測(cè)試,參考SpringbootTkmapperApplicationTests類

運(yùn)行,在主類上直接運(yùn)行,然后瀏覽器里打開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)目開發(fā)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java高性能新一代構(gòu)建工具M(jìn)aven-mvnd(實(shí)踐可行版)

    Java高性能新一代構(gòu)建工具M(jìn)aven-mvnd(實(shí)踐可行版)

    這篇文章主要介紹了Java高性能新一代構(gòu)建工具M(jìn)aven-mvnd(實(shí)踐可行版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • java利用正則表達(dá)式處理特殊字符的方法實(shí)例

    java利用正則表達(dá)式處理特殊字符的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于java利用正則表達(dá)式處理特殊字符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java中functional interface的分類和使用詳解

    java中functional interface的分類和使用詳解

    這篇文章主要介紹了java中functional interface的分類和使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java實(shí)戰(zhàn)員工績(jī)效管理系統(tǒng)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)員工績(jī)效管理系統(tǒng)的實(shí)現(xiàn)流程

    只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+Mysql+Maven+HTML實(shí)現(xiàn)一個(gè)員工績(jī)效管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • Spring Cloud Stream 高級(jí)特性使用詳解

    Spring Cloud Stream 高級(jí)特性使用詳解

    這篇文章主要為大家介紹了Spring Cloud Stream 高級(jí)特性使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Mybatis注解實(shí)現(xiàn)多數(shù)據(jù)源讀寫分離詳解

    Mybatis注解實(shí)現(xiàn)多數(shù)據(jù)源讀寫分離詳解

    這篇文章主要給大家介紹了關(guān)于Mybatis注解實(shí)現(xiàn)多數(shù)據(jù)源讀寫分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Spring?Cloud集成Nacos?Config動(dòng)態(tài)刷新源碼剖析

    Spring?Cloud集成Nacos?Config動(dòng)態(tài)刷新源碼剖析

    這篇文章主要為大家介紹了Spring?Cloud集成Nacos?Config動(dòng)態(tài)刷新源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • java加解密RSA使用方法代碼示例

    java加解密RSA使用方法代碼示例

    這篇文章主要介紹了java加解密RSA使用方法代碼示例,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之隊(duì)列

    帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之隊(duì)列

    這篇文章主要為大家介紹了Java數(shù)據(jù)結(jié)構(gòu)和算法之隊(duì)列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • 由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制

    由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制

    fail-fast俗稱快速失敗,是在多線程進(jìn)行迭代操作時(shí)產(chǎn)生沖突的一種異常拋出機(jī)制,下面我們就由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制.
    2016-05-05

最新評(píng)論

长岛县| 乌恰县| 华阴市| 收藏| 三台县| 苏州市| 甘谷县| 渑池县| 山丹县| 常州市| 锡林浩特市| 视频| 多伦县| 宜都市| 巴东县| 威远县| 双牌县| 平舆县| 珲春市| 嵩明县| 长沙县| 徐汇区| 普兰店市| 景德镇市| 临武县| 甘南县| 汉中市| 青浦区| 淳化县| 休宁县| 吉隆县| 西林县| 肥东县| 绵阳市| 福安市| 阳曲县| 淮滨县| 屯昌县| 大荔县| 久治县| 宝应县|