您好,登錄后才能下訂單哦!
MybatisPlus特性
•無侵入:只做增強不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑
•損耗?。簡蛹磿詣幼⑷牖?CURD,性能基本無損耗,直接面向?qū)ο蟛僮?br />
•強大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強大的條件構(gòu)造器,滿足各類使用需求
•支持 Lambda 形式調(diào)用:通過 Lambda 表達式,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯
•支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多種數(shù)據(jù)庫
•支持主鍵自動生成:支持多達 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
•支持 XML 熱加載:Mapper 對應(yīng)的 XML 支持熱加載,對于簡單的 CRUD 操作,甚至可以無 XML 啟動
•支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作
•支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
•支持關(guān)鍵詞自動轉(zhuǎn)義:支持?jǐn)?shù)據(jù)庫關(guān)鍵詞(order、key......)自動轉(zhuǎn)義,還可自定義關(guān)鍵詞
•內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
•內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
•內(nèi)置性能分析插件:可輸出 Sql 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢
•內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作
•內(nèi)置 Sql 注入剝離器:支持 Sql 注入剝離,有效預(yù)防 Sql 注入攻擊
快速開始
初始化測試數(shù)據(jù)表:
DROP TABLE IF EXISTS user; CREATE TABLE user ( id BIGINT(20) NOT NULL COMMENT '主鍵ID', name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名', age INT(11) NULL DEFAULT NULL COMMENT '年齡', email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱', PRIMARY KEY (id) ); DELETE FROM user; INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
父工程依賴
該工程用于依賴管理,pom如下:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> <mybatis-plus-version>3.1.1</mybatis-plus-version> <mysql-driver-version>5.1.47</mysql-driver-version> <druid-version>1.1.10</druid-version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
創(chuàng)建MyBaitsPlus工程
依賴如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- mybatis plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus-version}</version> </dependency> <!-- mysql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-driver-version}</version> </dependency> <!-- druid數(shù)據(jù)連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid-version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
properties配置
在這里配置數(shù)據(jù)庫連接,以及數(shù)據(jù)連接池與mybatisplus的配置等
server.port=8080 spring.application.name=mybatis spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&characterEncoding=utf8 spring.datasource.username=root spring.datasource.password=root spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.maxActive=20 spring.datasource.druid.maxWait=60000 spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.druid.minEvictableIdleTimeMillis=300000 spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL spring.datasource.druid.testWhileIdle=true spring.datasource.druid.testOnBorrow=false spring.datasource.druid.testOnReturn=false spring.datasource.druid.poolPreparedStatements=true spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.druid.filters=stat,slf4j spring.datasource.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 spring.datasource.druid.web-stat-filter.enabled=true spring.datasource.druid.web-stat-filter.url-pattern=/* spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/* spring.datasource.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.163.1 spring.datasource.druid.stat-view-servlet.deny=192.168.1.73 spring.datasource.druid.stat-view-servlet.reset-enable=false #Druid 管理賬號 spring.datasource.druid.stat-view-servlet.login-username=admin #Druid 管理密碼 spring.datasource.druid.stat-view-servlet.login-password=123456 #com.simple.spring.boot.mapper 該包打印DEBUG級別日志 logging.level.com.simple.spring.boot.mapper=debug #mybatis plus mapper文件路徑 mybatis-plus.mapperLocations=classpath:/mybatis/mapper/*.xml #mybaits plus 實體類路徑 mybatis-plus.typeAliasesPackage=com.simple.spring.**.entities mybatis-plus.typeEnumsPackage= #數(shù)據(jù)庫相關(guān)配置 #主鍵類型 AUTO:"數(shù)據(jù)庫ID自增", INPUT:"用戶輸入ID",ID_WORKER:"全局唯一ID (數(shù)字類型唯一ID)", UUID:"全局唯一ID UUID"; mybatis-plus.global-config.db-config.id-type=UUID #字段策略 IGNORED:"忽略判斷",NOT_NULL:"非 NULL 判斷"),NOT_EMPTY:"非空判斷" mybatis-plus.global-config.db-config.field-strategy=not_empty #駝峰下劃線轉(zhuǎn)換 mybatis-plus.global-config.db-config.column-underline=true #數(shù)據(jù)庫大寫下劃線轉(zhuǎn)換 #capital-mode: true #邏輯刪除配置 mybatis-plus.global-config.db-config.logic-delete-value=0 mybatis-plus.global-config.db-config.logic-not-delete-value= 1 #mybatis-plus.global-config.db-config.db-type= sqlserver #刷新mapper 調(diào)試神器 mybatis-plus.global-config.refresh=true # 原生配置 mybatis-plus.configuration.map-underscore-to-camel-case=true mybatis-plus.configuration.cache-enabled=false mybatis-plus.configuration.call-setters-on-nulls =true
常規(guī)增刪改查實現(xiàn)
創(chuàng)建實體類:
** * 實體類 * @author: SimpleWu * @date: 2019/5/25 */ @Data public class User { private Long id; private String name; private Integer age; private String email; }
該lombok插件省去getset方法。
創(chuàng)建UserMapper接口,并且實現(xiàn)BaseMapper<User>這里我們指定實體類為user可直接使用接口中的方法。
•查詢所有數(shù)據(jù)
public List<User> getList(){ return userMapper.selectList(null); }
•查詢數(shù)據(jù)帶查詢條件
public List<User> getListQuery(){ User user = new User(); user.setName("SimpleWu"); Wrapper<User> wrapper = new QueryWrapper<>(user); return userMapper.selectList(wrapper); }
•查詢帶分頁
public IPage<User> page(){ int currentPage = 1 ; //當(dāng)前頁 int pageSize = 2 ;//每頁大小 IPage<User> page = new Page(currentPage,pageSize); page = userMapper.selectPage(page,null); return page; }
•根據(jù)實體類新增數(shù)據(jù)
@Transactional//本地事務(wù)開啟 public int insert(){ User user = new User(); user.setId(6l); user.setName("SimpleWu"); user.setAge(100); user.setEmail("SimpleWu@gmail.com"); return userMapper.insert(user); }
•根據(jù)主鍵刪除數(shù)據(jù)
@Transactional//本地事務(wù)開啟 public int deleteById(){ int userId = 6; return userMapper.deleteById(userId); }
•根據(jù)ID更新數(shù)據(jù)
@Transactional//本地事務(wù)開啟 public int updateById(){ User user = new User(); user.setId(5l); user.setName("update"); user.setAge(100); user.setEmail("update@email.com"); return userMapper.updateById(user); }
•條件構(gòu)造器
◦UpdateWrapper 用于增刪改構(gòu)造條件
◦QueryWrapper 用于查詢構(gòu)造條件
Transactional//本地事務(wù)開啟 public int updateWrapperUser(){ User user = new User(); user.setId(5l); user.setName("update"); user.setAge(100); user.setEmail("update@email.com"); User updateWrapperUser = new User(); updateWrapperUser.setId(1l); /** * 修改 UpdateWrapper * 查詢 QueryWrapper */ Wrapper<User> wrapper = new UpdateWrapper<>(updateWrapperUser); return userMapper.update(user,wrapper); }
•Mapper接口綁定Mapper文件
◦properites中配置既可
#掃描mybatis/mapper下面的所有xml mybatis-plus.mapperLocations=classpath:/mybatis/mapper/*.xml
•UserMapper接口測試
public interface UserMapper extends BaseMapper<User> { Map<String,Object> queryUser(@Param("USER_ID") String userId); }
UserMapper.xml,如下:
<select id="queryUser" resultType="java.util.HashMap" parameterType="java.lang.String"> SELECT ID, NAME FROM USER WHERE ID = #{USER_ID} </select>
執(zhí)行SQL:
public Map<String,Object> myMapper(){ return userMapper.queryUser("2"); }
在SpringBoot中使用MybatisPlus分頁需要注入Bean,并且在啟動類上使用@MapperScan
("com.simple.spring.boot.mapper")掃描mapper文件路徑如下:
@SpringBootApplication @MapperScan("com.simple.spring.boot.mapper") public class MybatisPlusApplication { /** * 分頁插件注冊 * @return */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } public static void main(String[] args) { SpringApplication.run(MybatisPlusApplication.class, args); } }
使用MyBatisPlus可以為我們減少很多很多的代碼,不過需要編寫實體類,有失必有得。
配置動態(tài)數(shù)據(jù)源
dynamic-datasource-spring-boot-starter 是一個基于springboot的快速集成多數(shù)據(jù)源的啟動器。
優(yōu)勢
網(wǎng)上關(guān)于動態(tài)數(shù)據(jù)源的切換的文檔有很多,核心只有兩種。
1.構(gòu)建多套環(huán)境,優(yōu)勢是方便控制也容易集成一些簡單的分布式事務(wù),缺點是非動態(tài)同時代碼量較多,配置難度大。
2.基于spring提供原生的 AbstractRoutingDataSource ,參考一些文檔自己實現(xiàn)切換。
如果你的數(shù)據(jù)源較少,場景不復(fù)雜,選擇以上任意一種都可以。如果你需要更多特性,請嘗試本動態(tài)數(shù)據(jù)源。
1.數(shù)據(jù)源分組,適用于多種場景 純粹多庫 讀寫分離 一主多從 混合模式。
2.簡單集成Druid數(shù)據(jù)源監(jiān)控多數(shù)據(jù)源,簡單集成Mybatis-Plus簡化單表,簡單集成P6sy格式化sql,簡單集成Jndi數(shù)據(jù)源。
3.簡化Druid和HikariCp配置,提供全局參數(shù)配置。
4.提供自定義數(shù)據(jù)源來源(默認(rèn)使用yml或properties配置)。
5.項目啟動后能動態(tài)增減數(shù)據(jù)源。
6.使用spel動態(tài)參數(shù)解析數(shù)據(jù)源,如從session,header和參數(shù)中獲取數(shù)據(jù)源。(多租戶架構(gòu)神器)
7.多層數(shù)據(jù)源嵌套切換。(一個業(yè)務(wù)ServiceA調(diào)用ServiceB,ServiceB調(diào)用ServiceC,每個Service都是不同的數(shù)據(jù)源)
8.使用正則匹配或spel表達式來切換數(shù)據(jù)源(實驗性功能)。
劣勢
不能使用多數(shù)據(jù)源事務(wù)(同一個數(shù)據(jù)源下能使用事務(wù)),網(wǎng)上其他方案也都不能提供。
如果你需要使用到分布式事務(wù),那么你的架構(gòu)應(yīng)該到了微服務(wù)化的時候了。
如果呼聲強烈,項目達到800 star,作者考慮集成分布式事務(wù)。
PS: 如果您只是幾個數(shù)據(jù)庫但是有強烈的需求分布式事務(wù),建議還是使用傳統(tǒng)方式自己構(gòu)建多套環(huán)境集成atomic這類,網(wǎng)上百度很多。
約定
1.本框架只做 切換數(shù)據(jù)源 這件核心的事情,并不限制你的具體操作,切換了數(shù)據(jù)源可以做任何CRUD。
2.配置文件所有以下劃線 _ 分割的數(shù)據(jù)源 首部 即為組的名稱,相同組名稱的數(shù)據(jù)源會放在一個組下。
3.切換數(shù)據(jù)源即可是組名,也可是具體數(shù)據(jù)源名稱,切換時默認(rèn)采用負(fù)載均衡機制切換。
4.默認(rèn)的數(shù)據(jù)源名稱為 master ,你可以通過spring.datasource.dynamic.primary修改。
5.方法上的注解優(yōu)先于類上注解。
建議
強烈建議在 主從模式 下遵循普遍的規(guī)則,以便他人能更輕易理解你的代碼。
主數(shù)據(jù)庫 建議 只執(zhí)行 INSERT UPDATE DELETE 操作。
從數(shù)據(jù)庫 建議 只執(zhí)行 SELECT 操作。
快速開始
加入依賴:
<!-- 動態(tài)數(shù)據(jù)源 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>2.5.4</version> </dependency>
注釋掉原來的數(shù)據(jù)庫配置,加入:
#設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master spring.datasource.dynamic.primary=master #主庫配置 spring.datasource.dynamic.datasource.master.username=root spring.datasource.dynamic.datasource.master.password=root spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.jdbc.Driver spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&characterEncoding=utf8 #從庫配置 spring.datasource.dynamic.datasource.slave_1.username=root spring.datasource.dynamic.datasource.slave_1.password=root spring.datasource.dynamic.datasource.slave_1.driver-class-name=com.mysql.jdbc.Driver spring.datasource.dynamic.datasource.slave_1.url=jdbc:mysql://localhost:3307/mybatis?useSSL=false&characterEncoding=utf8
使用 @DS 切換數(shù)據(jù)源。
@DS("master") public List<User> getListQuery(){ User user = new User(); user.setName("SimpleWu"); Wrapper<User> wrapper = new QueryWrapper<>(user); return userMapper.selectList(wrapper); } @DS("slave_1") public IPage<User> page(){ int currentPage = 1 ; //當(dāng)前頁 int pageSize = 2 ;//每頁大小 IPage<User> page = new Page(currentPage,pageSize); page = userMapper.selectPage(page,null); return page; }
@DS 可以注解在方法上和類上,同時存在方法注解優(yōu)先于類上注解。
注解在service實現(xiàn)或mapper接口方法上,但強烈不建議同時在service和mapper注解。 (可能會有問題)
如果不加入主鍵則使用默認(rèn)數(shù)據(jù)源。
DruidDataSourceAutoConfigure會注入一個DataSourceWrapper,其會在原生的spring.datasource下找url,username,password等。而我們動態(tài)數(shù)據(jù)源的配置路徑是變化的,所以需要排除:
spring: autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
或者在類上排除:
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
然后更換properties配置信息:
#公共配置 Druid登錄賬號 密碼 spring.datasource.druid.stat-view-servlet.login-username=admin spring.datasource.druid.stat-view-servlet.login-password=123456 spring.datasource.dynamic.druid.initial-size=5 spring.datasource.dynamic.druid.min-idle=5 spring.datasource.dynamic.druid.maxActive=20 spring.datasource.dynamic.druid.maxWait=60000 spring.datasource.dynamic.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.dynamic.druid.minEvictableIdleTimeMillis=300000 spring.datasource.dynamic.druid.validationQuery=SELECT 1 FROM DUAL spring.datasource.dynamic.druid.testWhileIdle=true spring.datasource.dynamic.druid.testOnBorrow=false spring.datasource.dynamic.druid.testOnReturn=false spring.datasource.dynamic.druid.poolPreparedStatements=true spring.datasource.dynamic.druid.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.dynamic.druid.filters=stat,slf4j spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 spring.datasource.dynamic.druid.web-stat-filter.enabled=true spring.datasource.dynamic.druid.web-stat-filter.url-pattern=/* spring.datasource.dynamic.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/* spring.datasource.dynamic.druid.stat-view-servlet.url-pattern=/druid/* spring.datasource.dynamic.druid.stat-view-servlet.allow=127.0.0.1,192.168.163.1 spring.datasource.dynamic.druid.stat-view-servlet.deny=192.168.1.73 spring.datasource.dynamic.druid.stat-view-servlet.reset-enable=false
本篇代碼案例地址:
https://github.com/450255266/open-doubi
總結(jié)
以上所述是小編給大家介紹的SpringBoot整合MyBatisPlus配置動態(tài)數(shù)據(jù)源的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。