SpringCloud微服務實戰——搭建企業級開發框架(五):資料庫持久化整合MySql+Druid+MyBatis-Plus
在引入相關資料庫持久化相關依賴庫之前,我們可以考慮到,當我們因業務開發需要,引入各種各樣的依賴庫時,Jar包衝突是我們必須面對的一個問題,Spring為了解決這些Jar包的衝突,推出了各種bom,最著名的就是Spring IO Platform bom,其中最核心的三個是:spring-framework-bom、spring-boot-dependencies、platform-bom。我們這裡參考Spring管理Jar包的方式,新建一個GitEgg-Platform平臺工程,提供各種第三方元件的配置及自定義方法,使用子工程gitegg-platform-bom統一管理GitEgg自定義方法擴充套件jar包及第三方Jar包版本。
1、首先在GitEgg-Platform工程下新建gitegg-platform-db用於管理系統需要用到的資料庫驅動、資料庫連線池的jar包及配置,新建gitegg-platform-mybatis用於管理系統需要用到的持久層框架,建好的結構如下:
2、修改GitEgg-Platform根目錄下的pom.xml,設定工程編碼方式,及引入的Spring Boot,Spring Cloud,gitegg-platform-bom版本:
<!--?xml version="1.0" encoding="UTF-8"?--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.gitegg.platform</groupid> <artifactid>GitEgg-Platform</artifactid> <name>${project.artifactId}</name> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>gitegg-platform-bom</module> <module>gitegg-platform-db</module> <module>gitegg-platform-mybatis</module> </modules> <properties> <!-- jdk版本1.8 --> <java.version>1.8</java.version> <!-- maven-compiler-plugin外掛版本,Java程式碼編譯 --> <maven.plugin.version>3.8.1</maven.plugin.version> <!-- maven編譯時指定編碼UTF-8 --> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <!-- 專案統一字符集編碼UTF-8 --> <project.build.sourceencoding>UTF-8</project.build.sourceencoding> <!-- 專案統一字符集編碼UTF-8 --> <project.reporting.outputencoding>UTF-8</project.reporting.outputencoding> <!-- SpringBoot版本號 --> <spring.boot.version>2.3.3.RELEASE</spring.boot.version> <!-- SpringCloud版本號 --> <spring.cloud.version>Hoxton.SR8</spring.cloud.version> <!-- SpringPlatform版本號 --> <spring.platform.version>Cairo-SR8</spring.platform.version> </properties> <dependencymanagement> <dependencies> <dependency> <groupid>com.gitegg.platform</groupid> <artifactid>gitegg-platform-bom</artifactid> <version>${project.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-dependencies</artifactid> <version>${spring.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupid>org.springframework.cloud</groupid> <artifactid>spring-cloud-dependencies</artifactid> <version>${spring.cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencymanagement> <build> <finalname>${project.name}</finalname> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <version>${maven.plugin.version}</version> <configuration> <source>${java.version} <target>${java.version}</target> <encoding>UTF-8</encoding> <compilerargs> <arg>-parameters</arg> </compilerargs> </configuration> </plugin> </plugins> </build> <repositories> <repository> <id>aliyun-repos</id> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> <repository> <id>gitegg-release</id> <name>Release Repository</name> <url>https://packages.aliyun.com/maven/repository/2020515-release-dpxo1j/</url> </repository> </repositories> <pluginrepositories> <pluginrepository> <id>aliyun-plugin</id> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <snapshots> <enabled>false</enabled> </snapshots> </pluginrepository> </pluginrepositories> <profiles> <profile> <id>dev</id> <properties> <profileactive>dev</profileactive> </properties> <activation> <!--預設為dev環境打包方式--> <activebydefault>true</activebydefault> </activation> </profile> <profile> <id>test</id> <properties> <profileactive>test</profileactive> </properties> </profile> <profile> <id>pro</id> <properties> <profileactive>pro</profileactive> </properties> </profile> </profiles> </project>
3、修改gitegg-platform-bom工程下的pom.xml,引入目前需要的資料庫驅動,資料連線池及Mybatis-Plus:
<!--?xml version="1.0" encoding="UTF-8"?--> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.3.3.RELEASE</version> <relativepath> </relativepath></parent> <modelversion>4.0.0</modelversion> <groupid>com.gitegg.platform</groupid> <artifactid>gitegg-platform-bom</artifactid> <name>${project.artifactId}</name> <version>${gitegg.project.version}</version> <packaging>pom</packaging> <properties> <!-- jdk版本1.8 --> <java.version>1.8</java.version> <!-- maven-compiler-plugin外掛版本,Java程式碼編譯 --> <maven.plugin.version>3.8.1</maven.plugin.version> <!-- maven編譯時指定編碼UTF-8 --> <maven.compiler.encoding>UTF-8</maven.compiler.encoding> <!-- 專案統一字符集編碼UTF-8 --> <project.build.sourceencoding>UTF-8</project.build.sourceencoding> <!-- 專案統一字符集編碼UTF-8 --> <project.reporting.outputencoding>UTF-8</project.reporting.outputencoding> <!-- GitEgg專案統一設定版本號 --> <gitegg.project.version>1.0-SNAPSHOT</gitegg.project.version> <!-- mysql資料庫驅動 --> <mysql.connector.version>8.0.17</mysql.connector.version> <!-- postgresql資料庫驅動 --> <postgresql.connector.version>9.1-901.jdbc4</postgresql.connector.version> <!-- 資料庫連線池Druid --> <druid.version>1.1.23</druid.version> <!-- Mybatis Plus增強工具 --> <mybatis.plus.version>3.4.0</mybatis.plus.version> </properties> <dependencymanagement> <dependencies> <!-- gitegg資料庫驅動及連線池 --> <dependency> <groupid>com.gitegg.platform</groupid> <artifactid>gitegg-platform-db</artifactid> <version>${gitegg.project.version}</version> </dependency> <!-- gitegg mybatis-plus --> <dependency> <groupid>com.gitegg.platform</groupid> <artifactid>gitegg-platform-mybatis</artifactid> <version>${gitegg.project.version}</version> </dependency> <!-- mysql資料庫驅動 --> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>${mysql.connector.version}</version> </dependency> <!-- postgresql資料庫驅動 --> <dependency> <groupid>postgresql</groupid> <artifactid>postgresql</artifactid> <version>${postgresql.connector.version}</version> </dependency> <!-- 資料庫連線池 --> <dependency> <groupid>com.alibaba</groupid> <artifactid>druid-spring-boot-starter</artifactid> <version>${druid.version}</version> </dependency> <!-- Mybatis Plus增強工具 --> <dependency> <groupid>com.baomidou</groupid> <artifactid>mybatis-plus-boot-starter</artifactid> <version>${mybatis.plus.version}</version> </dependency> </dependencies> </dependencymanagement> </project>
4、修改gitegg-platform-db工程下的pom.xml,只引入資料庫驅動及資料庫連線池相關jar包:
<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactid>GitEgg-Platform</artifactid>
<groupid>com.gitegg.platform</groupid>
<version>1.0-SNAPSHOT</version>
</parent>
<modelversion>4.0.0</modelversion>
<artifactid>gitegg-platform-db</artifactid>
<name>${project.artifactId}</name>
<version>${project.parent.version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
</dependency>
<dependency>
<groupid>postgresql</groupid>
<artifactid>postgresql</artifactid>
</dependency>
<dependency>
<groupid>com.alibaba</groupid>
<artifactid>druid-spring-boot-starter</artifactid>
</dependency>
</dependencies>
</project>
5、修改gitegg-platform-mybatis工程下的pom.xml,只引入mybatis-plus相關jar包:
<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactid>GitEgg-Platform</artifactid>
<groupid>com.gitegg.platform</groupid>
<version>1.0-SNAPSHOT</version>
</parent>
<modelversion>4.0.0</modelversion>
<artifactid>gitegg-platform-mybatis</artifactid>
<name>${project.artifactId}</name>
<version>${project.parent.version}</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupid>com.baomidou</groupid>
<artifactid>mybatis-plus-boot-starter</artifactid>
</dependency>
</dependencies>
</project>
6、pom.xml檔案配置好之後,在IDEA右側視窗,Maven中點選install,將包安裝到本地,這樣GitEgg-Cloud工程就可以引用GitEgg-Platform工程的jar包了,同理,測試及正式環境需要點選deploy,將jar包釋出到測試的Maven私服,或者正式環境的Maven私服。
7、回到GitEgg-Cloud專案,在gitegg-service下的pom.xml裡面引入gitegg-platform-db和gitegg-platform-mybatis
<!--?xml version="1.0" encoding="UTF-8"?-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactid>GitEgg-Cloud</artifactid>
<groupid>com.gitegg.cloud</groupid>
<version>1.0-SNAPSHOT</version>
</parent>
<modelversion>4.0.0</modelversion>
<artifactid>gitegg-service</artifactid>
<packaging>pom</packaging>
<modules>
<module>gitegg-service-base</module>
<module>gitegg-service-bigdata</module>
<module>gitegg-service-system</module>
</modules>
<dependencies>
<!-- gitegg資料庫驅動及連線池 -->
<dependency>
<groupid>com.gitegg.platform</groupid>
<artifactid>gitegg-platform-db</artifactid>
</dependency>
<!-- gitegg mybatis-plus -->
<dependency>
<groupid>com.gitegg.platform</groupid>
<artifactid>gitegg-platform-mybatis</artifactid>
</dependency>
<!-- spring boot web核心包 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- spring boot 健康監控 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-actuator</artifactid>
</dependency>
</dependencies>
</project>
8、在gitegg-service-system工程下修改application.yml,增加資料庫連線和mybatis的配置:
server:
port: 8001
spring:
application:
name: gitegg-service-system
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1/gitegg_cloud?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&autoReconnect=true
username: root
password: root
initialSize: 1
minIdle: 3
maxActive: 20
# 配置獲取連線等待超時的時間
maxWait: 60000
# 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一個連線在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 開啟PSCache,並且指定每個連線上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置監控統計攔截的filters,去掉後監控介面sql無法統計,'wall'用於防火牆
filters: config,stat,slf4j
# 通過connectProperties屬性來開啟mergeSql功能;慢SQL記錄
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;
# 合併多個DruidDataSource的監控資料
useGlobalDataSourceStat: true
mybatis-plus:
mapper-locations: classpath*:/com/gitegg/*/*/mapper/*Mapper.xml
typeAliasesPackage: com.gitegg.*.*.entity
global-config:
#主鍵型別 0:"資料庫ID自增", 1:"使用者輸入ID",2:"全域性唯一ID (數字型別唯一ID)", 3:"全域性唯一ID UUID";
id-type: 2
#欄位策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
field-strategy: 2
#駝峰下劃線轉換
db-column-underline: true
#重新整理mapper 除錯神器
refresh-mapper: true
#資料庫大寫下劃線轉換
#capital-mode: true
#邏輯刪除配置
logic-delete-value: 1
logic-not-delete-value: 0
configuration:
map-underscore-to-camel-case: true
cache-enabled: false
9、修改GitEggSystemApplication,新增要掃描的mapper路徑宣告:
package com.gitegg.service.system;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* gitegg-system 啟動類
*/
@MapperScan("com.gitegg.*.*.mapper")
@SpringBootApplication
public class GitEggSystemApplication {
public static void main(String[] args) {
SpringApplication.run(GitEggSystemApplication.class,args);
}
}
10、修改GitEgg-Platform工程中的gitegg-platform-db和gitegg-platform-mybatis,新增mybatis-plus分頁配置,和Druid資料庫連線配置,此配置類預留,後面需要自定義修改。
- DruidConfig.java內容如下:
package com.gitegg.platform.db.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DruidConfig {
}
- MybatisPlusConfig.java內容如下:
package com.gitegg.platform.mybatis.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.gitegg.**.mapper.**")
public class MybatisPlusConfig {
/**
* 新的分頁外掛,一緩和二緩遵循mybatis的規則,需要設定 MybatisConfiguration#useDeprecatedExecutor = false
* 避免快取出現問題(該屬性會在舊外掛移除後一同移除)
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
11、增加測試類,通過訪問controller->service->dao層,獲取資料庫資料。新建controller、service、impl、mapper、entity、dto包,這些包和類,後面可以用系統自動生成,不需要每次都自己手動建立。
- SystemController.java檔案內容:
package com.gitegg.service.system.controller;
import com.gitegg.service.system.service.ISystemService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "system")
@AllArgsConstructor
public class SystemController {
private final ISystemService systemService;
@GetMapping(value = "list")
public Object list() {
return systemService.list();
}
@GetMapping(value = "page")
public Object page() {
return systemService.page();
}
}
- ISystemService.java檔案內容:
package com.gitegg.service.system.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gitegg.service.system.entity.SystemTable;
import java.util.List;
public interface ISystemService {
List<systemtable> list();
Page<systemtable> page();
}
- SystemServiceImpl.java 內容:
package com.gitegg.service.system.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gitegg.service.system.entity.SystemTable;
import com.gitegg.service.system.mapper.SystemTableMapper;
import com.gitegg.service.system.service.ISystemService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
*/
@Service
@AllArgsConstructor
public class SystemServiceImpl implements ISystemService {
private final SystemTableMapper systemTableMapper;
@Override
public List<systemtable> list() {
return systemTableMapper.list();
}
@Override
public Page<systemtable> page() {
Page<systemtable> page = new Page<>(1, 10);
List<systemtable> records = systemTableMapper.page(page);
page.setRecords(records);
return page;
}
}
- SystemTableMapper.java內容:
package com.gitegg.service.system.mapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gitegg.service.system.entity.SystemTable;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SystemTableMapper {
List<systemtable> list();
List<systemtable> page(Page<systemtable> page);
}
- SystemTable.java內容:
package com.gitegg.service.system.entity;
import lombok.Data;
@Data
public class SystemTable {
private Long id;
private String name;
}
- SystemTableMapper.xml內容:
<!--?xml version="1.0" encoding="UTF-8" ?-->
<mapper namespace="com.gitegg.service.system.mapper.SystemTableMapper">
<select id="list" resulttype="com.gitegg.service.system.entity.SystemTable">
select * from system_table
</select>
<select id="page" resulttype="com.gitegg.service.system.entity.SystemTable">
select * from system_table
</select>
</mapper>
12、執行GitEggSystemApplication,在控制檯看是否啟動成功,如果啟動成功,在瀏覽器中分別訪問http://127.0.0.1:8001/system/list和http://127.0.0.1:8001/system/page,可以看到資料裡面的資料:
本文原始碼在https://gitee.com/wmz1930/GitEgg的chapter-05分支。