欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合通用Mapper簡化單表操作詳解

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

前言

數據庫訪問是web應用必不可少的部分?,F今最常用的數據庫ORM框架有Hibernate與Mybatis,Hibernate貌似在傳統IT企業(yè)用的較多,而Mybatis則在互聯網企業(yè)應用較多。通用Mapper 是一個基于Mybatis,將單表的增刪改查通過通用方法實現,來減少SQL編寫的開源框架,且也有對應開源的mapper-spring-boot-starter提供。我們在此基礎上加了一些定制化的內容,以便達到更大程度的復用。

框架源碼地址

Demo源碼地址

在開源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簡化依賴配置(持續(xù)更新完善)

該框架可用于實際基于springboot的項目,只需簡單配置數據源,即可引入druid連接池及通用mapper的功能,以及各層基本的增刪改查方法。

如何使用?

下文給出使用步驟,可參考示例

1. 框架Maven部署安裝

下載框架源碼后,在項目根路徑下執(zhí)行mvn clean install可安裝到本地maven庫。如果需要共享,且搭了Nexus私服,則在根路徑pom.xml文件中添加distributionManagement配置,指定Nexus倉庫分發(fā)地址,使用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注入校驗) # 配置監(jiān)控統計攔截的filters,去掉后監(jiān)控界面sql無法統計,'wall'用于防火墻
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
useGlobalDataSourceStat: true # 合并多個DruidDataSource的監(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. 定義相應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 則可列出單元測試中創(chuàng)建的用戶(其它接口參考BaseController實現)

6. 總結

本文介紹框架基于tk.mybatis:mapper-spring-boot-starter做了一些自定義擴展,以更大程度地實現復用。可用于實際項目開發(fā)。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaSwing FlowLayout 流式布局的實現

    JavaSwing FlowLayout 流式布局的實現

    這篇文章主要介紹了JavaSwing FlowLayout 流式布局的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • 四個實例超詳細講解Java?貪心和枚舉的特點與使用

    四個實例超詳細講解Java?貪心和枚舉的特點與使用

    貪心算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的是在某種意義上的局部最優(yōu)解,枚舉法的本質就是從所有候選答案中去搜索正確的解,枚舉算法簡單粗暴,他暴力的枚舉所有可能,盡可能地嘗試所有的方法
    2022-04-04
  • Java編程將漢字轉Unicode碼代碼示例

    Java編程將漢字轉Unicode碼代碼示例

    偶然看到Unicode編碼,覺得挺有意思,于是搜索了相關資料,準備學習學習,本文主要是一個Unicode編碼的簡單Java實現,需要的朋友可以了解下。
    2017-10-10
  • Java面試題沖刺第十二天--數據庫(2)

    Java面試題沖刺第十二天--數據庫(2)

    這篇文章主要為大家分享了最有價值的三道數據庫面試題,涵蓋內容全面,包括數據結構和算法相關的題目、經典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java中transient關鍵字的作用解析

    java中transient關鍵字的作用解析

    這篇文章主要介紹了java中transient關鍵字的作用解析,日常業(yè)務中,為了安全起見,有些敏感信息我們不希望在網絡間被傳輸可以使用transient對字段進行修飾,不進行序列化,則返回獲取到的字段為null,需要的朋友可以參考下
    2023-11-11
  • Maven?Settings.xml的基本語法詳解

    Maven?Settings.xml的基本語法詳解

    這篇文章主要為大家介紹了Maven?Settings.xml的基本語法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java11?中基于嵌套關系的訪問控制優(yōu)化問題

    Java11?中基于嵌套關系的訪問控制優(yōu)化問題

    在?Java?語言中,類和接口可以相互嵌套,這種組合之間可以不受限制的彼此訪問,包括訪問彼此的構造函數、字段、方法,接下來通過本文給大家介紹Java11中基于嵌套關系的訪問控制優(yōu)化問題,感興趣的朋友一起看看吧
    2022-01-01
  • java中常見的6種線程池示例詳解

    java中常見的6種線程池示例詳解

    這篇文章主要介紹了java中常見的6種線程池示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • java中equals和等號(==)的區(qū)別淺談

    java中equals和等號(==)的區(qū)別淺談

    java中equals和等號(==)的區(qū)別淺談,需要的朋友可以參考一下
    2013-05-05
  • java9新特性Reactive?Stream響應式編程?API

    java9新特性Reactive?Stream響應式編程?API

    這篇文章主要為大家介紹了java9新特性響應式編程API的特點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03

最新評論