spring-boot-starter-dao是基於spring-boot開箱即用原則,集成了mybatis,通用mapper,pagehelper,druid的dao層庫。致力於降低數據層的開發複雜度,讓mybatis配置徹底告別xml,讓基於mybatis的開發嵌入jpa的身影,極大降低mybatis的入門門檻,也極大的增加mybatis的可用性,減少重複代碼的工作量。讓mybatis新手使用mybatis輕輕鬆鬆,讓mybatis老手開發效率和編碼質量更上一層樓。
spring-boot-starter-dao項目特點:
1. 配置及其簡單,非常容易上手;
2. 支持讀寫分離;
3. 支持多數據源;
4. 支持註解方式指定枚舉與數據庫存儲值的對應;
5. 基於通用mapper快速實現單表的增刪查改;
6. 基於pagehelper便捷易用的數據庫物理分頁實現;
7. 基於druid的服務器監控。
8. 可以根據數據庫表以及表中字段註釋,生成帶完整註釋的model,生成基於通用mapper的dao層
快速開始
1.項目依賴
在spring-boot項目中引入依賴
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dao</artifactId>
<version>${spring-boot-starter-dao.version}</version>
</dependency>
如果需要快速生成dao,model,mapper另外還需要引入依賴
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
<optional>true</optional> <!-- 打包時該jar包不需要被打包 -->
</dependency>
2. 配置項目
在spring-boot的application.yml
配置文件中增加配置項
druid監控配置
spring:
druid:
stat:
enable: true # 啓用druid監控控制檯,在web項目中,該值設置爲true,纔會啓用druid監控
allow: '' # IP白名單 (沒有配置或者爲空,則允許所有訪問)
deny: '' # IP黑名單 (存在共同時,deny優先於allow)
loginUsername: 'leige' # 用戶名
loginPassword: 'leige' # 密碼
exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*' # WebStatFilter忽略資源
resetEnable: false #禁用HTML頁面上的“Reset All”功能
filter-url-patterns: '/*'
druid連接池默認配置項
spring:
druid:
default: # druid連接池默認參數,具體主庫或者從庫的配置會繼承該配置
enable: true
initial-size: 5 # 鏈接池初始化大小
max-active: 500 # 鏈接池中最大的鏈接數
min-idle: 5 # 鏈接池中最少要保留的鏈接數
max-wait: 3000 # 鏈接池中最大等待的鏈接數
filters: wall,stat # 啓用過濾器
username: reger # 數據庫登陸名
password: reger_123 # 數據庫登陸密碼
default-auto-commit: true # 是否自動提交事務,如果設置爲false,代碼中不啓用事務數據將沒法持久化
mybatis配置參數
spring:
mybatis:
configuration: # mybatis具體的配置參數,所有的mybatis實例都會使用該配置
cache-enabled: true # 是否啓用緩存
local-cache-scope: session # 緩存範圍
lazy-loading-enabled: true # 是否啓用懶加載
default-executor-type: simple # sql執行模式
map-underscore-to-camel-case: true # 開啓駝峯轉換
mybatis數據源配置
spring:
mybatis:
nodes:
user: # 該數據源的名字,可以配置多個數據源
order: after # mybatis生成主鍵的順序,如果要在insert into 數據前獲得主鍵,配置爲 BEFORE,否則配置爲 AFTER 默認值爲 BEFORE
mapper: MYSQL # mybatis通用mapper使用的mapper接口集合,mysqldb時使用使用 MYSQL,SqlServer 時使用MSSQL,其它db類型時使用DEFAULT, 默認值是 DEFAULT
primary: false # 是否是默認的數據對象, 最多隻有一個爲true,如果配置多個只有第一個生效
base-package: com.reger.test.user.dao # mybatis mapper接口文件的配置位置,該值不可以爲空,可以用正則匹配,多個用逗號分隔
mapper-package: com.reger.test.user.mapper # mybatis mapper 的xml配置文件的位置 ,該值最好不要爲空,可以用正則匹配,多個用逗號分隔
type-aliases-package: 'com.reger.test.user.model' # model類所在的包,該值可以爲空,可以用正則匹配,多個用逗號分隔
master: # 主庫配置,不可爲空,參數默認繼承spring.druid.default,可以寫參數覆蓋默認配置
url: jdbc:mysql://127.0.0.1:3306/user?useSSL=true # 主庫的jdbc地址
slaves: # 從庫配置,可以爲空,可以配置多個,參數默認繼承spring.druid.default,可以寫參數覆蓋默認配置
- url: jdbc:mysql://127.0.0.1:3307/user?useSSL=true
- url: jdbc:mysql://127.0.0.1:3308/user?useSSL=true
- url: jdbc:mysql://127.0.0.1:3309/user?useSSL=true
配置項至此完畢
3.快速生成dao,model,代碼
3.1 添加生成代碼需要的配置文件
在 resources
目錄增加配置文件generator.properties
,編寫文件內容如下
mybatis.nodeName=message # 數據源結點的名字,必須配置
# extend
extends.modelClass= # 生成的model希望繼承的基類,如果不寫將繼承java.long.Object
extends.mapperInterface= # 生成dao接口希望繼承的接口,如果不寫將不會繼承
# java config
java.delimiter=` # 指明數據庫的用於標記數據庫對象名的符號,比如ORACLE就是雙引號,MYSQL默認是`反引
java.encoding=utf-8 # 代碼編碼,如果不寫,默認utf-8
# generator table config
table.primarykey=id # 生成表的主鍵id
table.columnMatch= ^ # 匹配的表中列,可以匹配去除列前綴,如^[idcb],會去除列首的字符i,d,c,b
table.tableName=% # 需要生成的表面,可以用%匹配多個,但建議每次只生成一個
table.tableModl= # 生成表的model名字,如果表名匹配多個時,該字段必須爲空
# generator package config
package.model= # 生成的model存放的包路徑,如果爲空將使用數據源節點下對應包路徑下的第一個完整包路徑
package.repo= # 生成的mapper接口存放的包路徑,如果爲空將使用數據源節點下對應包路徑下的第一個完整包路徑
package.mapper= # 生成的mapper的xml存放的包路徑,如果爲空將使用數據源節點下對應包路徑下的第一個完整包路徑
3.2 生成代碼
以Application方式啓動項目,選擇包含main方法的com.reger.mybatis.generator.GeneratorMain
,運行。
稍等,如果沒有出現異常,基本就生成好了你數據表的對應的包括中文註釋的dao,mapper,model。
4.讀寫分離實現
讀寫分離有兩種方式分別是,
4.1 基於註解
你可以在service方法上加註解@DataSourceChange(slave=false)
,讓方法調用過程在主庫查詢,也可以@DataSourceChange(slave=true)
,讓方法調用過程在從庫查詢
4.2 基於java
你可以在方法調用時通過Proxy.master(() -> { 方法調用過程 return null; });
,讓方法調用過程在主庫查詢,也可以Proxy.slave(() -> { 方法調用過程 return null; });
,讓方法調用過程在從庫查詢
注意數據更新操作,必須在主庫執行,從庫都是隻讀的
5. 基於註解,實現枚舉到數據庫字段的映射
創建枚舉如下
import com.reger.datasource.annotation.EnumTypeHandler;
@EnumTypeHandler(field= "intCode")// 設置枚舉在數據庫保存的值
public enum State {
delete(-1), disable(0), enable(1);
private final int intCode;
private State(final int code) {
this.intCode=code;
}
}
給枚舉添加註解@EnumTypeHandler(field= "intCode")
,這樣在持久化到數據庫,或者查詢出來時,就會用intCode
來轉化枚舉,保存到數據庫的就是-1,0,1。這裏的field除了自己定義的以外,枚舉還默認有name,ordinal
可用。