mysql-plus多数据库_IDEA项目搭建九——MybatisPlus多数据库实现
一、簡介
MybatisPlus中引用多數(shù)據(jù)庫時(shí),傳統(tǒng)的配置就失效了,需要單獨(dú)寫配置來實(shí)現(xiàn),下面就說一下具體應(yīng)該如何操作
二、引入MybatisPlus多數(shù)據(jù)源配置
還是先看一下我的項(xiàng)目結(jié)構(gòu),Model是單獨(dú)的模塊,請自行創(chuàng)建
1、創(chuàng)建一個(gè)Maven項(xiàng)目,修改pom.xml文件增加對spring boot、mybatis plus、druid、mysql connector的引用
org.springframework.boot
spring-boot-dependencies
2.0.3.RELEASE
pom
import
org.springframework.boot
spring-boot-starter-web
com.alibaba
druid-spring-boot-starter
1.1.10
mysql
mysql-connector-java
5.1.9
com.baomidou
mybatis-plus-boot-starter
2.3
2、創(chuàng)建resources文件夾,并創(chuàng)建application.yml文件增加以下配置,此處不需要寫mybatis plus的配置了,因?yàn)槎鄶?shù)據(jù)源時(shí)這里的mybatis plus會失效,具體原因還沒找到
#設(shè)置提供的服務(wù)名
spring:
application:
name: javademo-tyh-service-hotel#配置數(shù)據(jù)庫
datasource:
type: com.alibaba.druid.pool.DruidDataSource
db1:
url: jdbc:mysql://10.11.12.237:3306/db_test?useUnicode=true&characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
db2:
url: jdbc:mysql://10.11.12.237:3306/tyh_test?useUnicode=true&characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver#設(shè)置自己啟動的端口
server:
port:12000
3、在resources文件夾下創(chuàng)建mapper文件夾,在其內(nèi)部創(chuàng)建兩個(gè)數(shù)據(jù)庫的兩張表的mapper.xml文件,分別編寫一個(gè)自定義方法
BaseInfoMapper.xml
select count(*) from base_info;
UserInfoMapper.xml
select count(*) from user_info;
4、打開main方法所在的類并修改為如下代碼
importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("javademo.tyh.service.hotel.mapper")//標(biāo)記掃描的mapper位置
public classAppServiceHotel
{public static voidmain( String[] args )
{
SpringApplication.run(AppServiceHotel.class, args);
}
}
5、創(chuàng)建config文件夾,存放mybatis plus的相關(guān)配置,此內(nèi)部的類很多都摘自官網(wǎng),是按照他的方式進(jìn)行實(shí)現(xiàn)的
創(chuàng)建枚舉DBTypeEnum
/*** 多數(shù)據(jù)源枚舉*/
public enumDBTypeEnum {
db1("db1"), db2("db2");privateString value;
DBTypeEnum(String value) {this.value =value;
}publicString getValue() {returnvalue;
}
}
創(chuàng)建數(shù)據(jù)源操作類DbContextHolder
public classDbContextHolder {private static final ThreadLocal contextHolder = new ThreadLocal<>();/*** 設(shè)置數(shù)據(jù)源
*@paramdbTypeEnum*/
public static voidsetDbType(DBTypeEnum dbTypeEnum) {
contextHolder.set(dbTypeEnum.getValue());
}/*** 取得當(dāng)前數(shù)據(jù)源
*@return
*/
public staticString getDbType() {return(String) contextHolder.get();
}/*** 清除上下文數(shù)據(jù)*/
public static voidclearDbType() {
contextHolder.remove();
}
}
創(chuàng)建spring的DataSource抽象類 DynamicDataSource
importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** 擴(kuò)展Spring的AbstractRoutingDataSource抽象類,實(shí)現(xiàn)動態(tài)數(shù)據(jù)源。
* AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是實(shí)現(xiàn)數(shù)據(jù)源的route的核心,
* 這里對該方法進(jìn)行Override。 【上下文DbContextHolder為一線程安全的ThreadLocal】*/
public class DynamicDataSource extendsAbstractRoutingDataSource {/*** 取得當(dāng)前使用哪個(gè)數(shù)據(jù)源
*@return
*/@OverrideprotectedObject determineCurrentLookupKey(){returnDbContextHolder.getDbType();
}
}
創(chuàng)建MybatisPlusConfig配置類
importcom.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;importcom.baomidou.mybatisplus.MybatisConfiguration;importcom.baomidou.mybatisplus.entity.GlobalConfiguration;importcom.baomidou.mybatisplus.mapper.LogicSqlInjector;importcom.baomidou.mybatisplus.plugins.PaginationInterceptor;importcom.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.type.JdbcType;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importjavax.sql.DataSource;importjava.util.HashMap;importjava.util.Map;/*** MybatisPlus配置*/@Configurationpublic classMybatisPlusConfig {//分頁攔截器
@BeanpublicPaginationInterceptor paginationInterceptor() {return newPaginationInterceptor();
}//定義db1
@Bean(name = "db1")
@ConfigurationProperties(prefix= "spring.datasource.db1")//與配置文件中的層次結(jié)構(gòu)相同
publicDataSource db1() {returnDruidDataSourceBuilder.create().build();
}//定義db2
@Bean(name = "db2")
@ConfigurationProperties(prefix= "spring.datasource.db2")//與配置文件中的層次結(jié)構(gòu)相同
publicDataSource db2() {returnDruidDataSourceBuilder.create().build();
}/*** 動態(tài)數(shù)據(jù)源配置
*@return
*/@Bean
@Primarypublic DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {
DynamicDataSource dynamicDataSource= newDynamicDataSource();
Map targetDataSources = new HashMap<>();
targetDataSources.put(DBTypeEnum.db1.getValue(), db1);
targetDataSources.put(DBTypeEnum.db2.getValue(), db2);
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(db1);returndynamicDataSource;
}
@Bean("sqlSessionFactory")public SqlSessionFactory sqlSessionFactory() throwsException {//***導(dǎo)入MybatisSqlSession配置***
MybatisSqlSessionFactoryBean sqlSessionFactory = newMybatisSqlSessionFactoryBean();//指明數(shù)據(jù)源
sqlSessionFactory.setDataSource(multipleDataSource(db1(), db2()));//指明mapper.xml位置(配置文件中指明的xml位置會失效用此方式代替,具體原因未知)
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/**Mapper.xml"));//指明實(shí)體掃描(多個(gè)package用逗號或者分號分隔)
sqlSessionFactory.setTypeAliasesPackage("javademo.tyh.model.base;javademo.tyh.model.hotel");//***導(dǎo)入Mybatis配置***
MybatisConfiguration configuration = newMybatisConfiguration();
configuration.setJdbcTypeForNull(JdbcType.NULL);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setCacheEnabled(false);
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setPlugins(newInterceptor[]{paginationInterceptor()});//***導(dǎo)入全局配置***
sqlSessionFactory.setGlobalConfig(globalConfiguration());returnsqlSessionFactory.getObject();
}/*** 在代碼中配置MybatisPlus替換掉application.yml中的配置
*@return
*/@BeanpublicGlobalConfiguration globalConfiguration() {
GlobalConfiguration conf= new GlobalConfiguration(newLogicSqlInjector());//主鍵類型 0:數(shù)據(jù)庫ID自增, 1:用戶輸入ID,2:全局唯一ID (數(shù)字類型唯一ID), 3:全局唯一ID UUID
conf.setIdType(0);//字段策略(拼接sql時(shí)用于判斷屬性值是否拼接) 0:忽略判斷,1:非NULL判斷,2:非空判斷
conf.setFieldStrategy(2);//駝峰下劃線轉(zhuǎn)換含查詢column及返回column(column下劃線命名create_time,返回java實(shí)體是駝峰命名createTime,開啟后自動轉(zhuǎn)換否則保留原樣)
conf.setDbColumnUnderline(true);//是否動態(tài)刷新mapper
conf.setRefresh(true);returnconf;
}
}
6、創(chuàng)建mapper文件夾用于存放于xml對應(yīng)的mapper接口
BaseInfoMapper
importcom.baomidou.mybatisplus.mapper.BaseMapper;importjavademo.tyh.model.hotel.BaseInfoModel;importorg.springframework.stereotype.Component;
@Componentpublic interface BaseInfoMapper extends BaseMapper{//自定義方法
intlistCount();
}
UserInfoMapper
importcom.baomidou.mybatisplus.mapper.BaseMapper;importjavademo.tyh.model.hotel.UserInfoModel;importorg.springframework.stereotype.Component;
@Componentpublic interface UserInfoMapper extends BaseMapper{//自定義方法
intlistCount();
}
7、創(chuàng)建service文件夾用于存放業(yè)務(wù)邏輯類
importjavademo.tyh.model.hotel.BaseInfoModel;importjavademo.tyh.model.hotel.UserInfoModel;importjavademo.tyh.service.hotel.config.DBTypeEnum;importjavademo.tyh.service.hotel.config.DbContextHolder;importjavademo.tyh.service.hotel.mapper.BaseInfoMapper;importjavademo.tyh.service.hotel.mapper.UserInfoMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;
@Servicepublic classHotelService {
@Autowired
BaseInfoMapper baseMapper;
@Autowired
UserInfoMapper userMapper;public voidtestDynamicDb() {//使用db1
DbContextHolder.setDbType(DBTypeEnum.db1);
BaseInfoModel baseModel= baseMapper.selectById(1);int baseCount =baseMapper.listCount();
System.out.println("db1=" +baseModel.getNickname());//使用db2
DbContextHolder.setDbType(DBTypeEnum.db2);
UserInfoModel userModel= userMapper.selectById(1);int userCount =userMapper.listCount();
System.out.println("db2=" +userModel.getUsername());
}
}
8、創(chuàng)建controller文件夾編寫一個(gè)controller和action用于測試
importjavademo.tyh.service.hotel.service.HotelService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/hotel")public classHotelController {
@Autowired
HotelService service;
@ResponseBody
@RequestMapping("/test")public voidtest() {
service.testDynamicDb();
}
}
9、創(chuàng)建自己的實(shí)體Model,get/set方法自己生成吧
BaseInfoModel
importcom.baomidou.mybatisplus.annotations.TableName;importjava.time.LocalDateTime;
@TableName("base_info")public classBaseInfoModel {private intid;privateString nickname;privateLocalDateTime updateTime;
}
UserInfoModel
importcom.baomidou.mybatisplus.annotations.TableName;importjava.time.LocalDateTime;
@TableName("user_info")public classUserInfoModel {private intid;privateString username;privateString password;private intsex;private intage;privateLocalDateTime createTime;
}
OK,至此Mybatis Plus多數(shù)據(jù)源配置Demo就完成了,可以運(yùn)行http://localhost:12000/hotel/test看一下console控制臺會得到以下輸出,db1和db2就切換成功了
總結(jié)
以上是生活随笔為你收集整理的mysql-plus多数据库_IDEA项目搭建九——MybatisPlus多数据库实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腰间盘突出手术多少钱啊?
- 下一篇: ajax包含mysql吗_php 实例a