IDEA项⽬搭建九——MybatisPlus多数据库实现
⼀、简介
MybatisPlus中引⽤多数据库时,传统的配置就失效了,需要单独写配置来实现,下⾯就说⼀下具体应该如何操作
⼆、引⼊MybatisPlus多数据源配置
还是先看⼀下我的项⽬结构,Model是单独的模块,请⾃⾏创建
1、创建⼀个Maven项⽬,修改l⽂件增加对spring boot、mybatis plus、druid、mysql connector的引⽤
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--import druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--import mysql connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!--import mybatis plus 它会⾃动引⼊mybatis及mybatis spring切勿重复引⽤以免冲突-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
</dependencies>
2、创建resources⽂件夹,并创建l⽂件增加以下配置,此处不需要写mybatis plus的配置了,因为多数据源时这⾥的mybatis plus会失效,具体原因还没到
#设置提供的服务名
spring:
application:
name: javademo-tyh-service-hotel
#配置数据库
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: sql.jdbc.Driver
db2:
url: jdbc:mysql://10.11.12.237:3306/tyh_test?useUnicode=true&characterEncoding=utf8
username: root
password: root
driver-class-name: sql.jdbc.Driver
#设置⾃⼰启动的端⼝
server:
port: 12000
3、在resources⽂件夹下创建mapper⽂件夹,在其内部创建两个数据库的两张表的l⽂件,分别编写⼀个⾃定义⽅法
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-///DTD Mapper 3.0" "/dtd/mybatis-3-mapper.dtd">
<!-- 指明当前xml对应的Mapper -->
<mapper namespace="h.service.hotel.mapper.BaseInfoMapper">
<select id="listCount" resultType="Integer">
select count(*) from base_info;
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-///DTD Mapper 3.0" "/dtd/mybatis-3-mapper.dtd">
<!-- 指明当前xml对应的Mapper -->
<mapper namespace="h.service.hotel.mapper.UserInfoMapper">
<select id="listCount" resultType="Integer">
select count(*) from user_info;
</select>
</mapper>
4、打开main⽅法所在的类并修改为如下代码
batis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("h.service.hotel.mapper")//标记扫描的mapper位置
public class AppServiceHotel
{
public static void main( String[] args )
{
SpringApplication.run(AppServiceHotel.class, args);
}
}
5、创建config⽂件夹,存放mybatis plus的相关配置,此内部的类很多都摘⾃官⽹,是按照他的⽅式进⾏实现的创建枚举DBTypeEnum
/**
* 多数据源枚举
*/
public enum DBTypeEnum {
db1("db1"), db2("db2");
private String value;
DBTypeEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
创建数据源操作类DbContextHolder
public class DbContextHolder {
private static final ThreadLocal contextHolder = new ThreadLocal<>();
/**
* 设置数据源
* @param dbTypeEnum
*/
public static void setDbType(DBTypeEnum dbTypeEnum) {
contextHolder.Value());
}
/
**
* 取得当前数据源
* @return
*/
public static String getDbType() {
return (String) ();
}
/**
* 清除上下⽂数据
*/
public static void clearDbType() {
}
}
创建spring的DataSource抽象类 DynamicDataSource
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
/*
* 扩展Spring的AbstractRoutingDataSource抽象类,实现动态数据源。
* AbstractRoutingDataSource中的抽象⽅法determineCurrentLookupKey是实现数据源的route的核⼼,
* 这⾥对该⽅法进⾏Override。【上下⽂DbContextHolder为⼀线程安全的ThreadLocal】
*/
public class DynamicDataSource extends AbstractRoutingDataSource {
/
**
* 取得当前使⽤哪个数据源
* @return
*/
@Override
protected Object determineCurrentLookupKey(){
DbType();
}
}
创建MybatisPlusConfig配置类
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import batisplus.MybatisConfiguration;
import ity.GlobalConfiguration;
import batisplus.mapper.LogicSqlInjector;
import batisplus.plugins.PaginationInterceptor;
import batisplus.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.pe.JdbcType;
import org.springframework.beans.factory.annotation.Qualifier;
import org.t.properties.ConfigurationProperties;
import t.annotation.Bean;
import t.annotation.Configuration;
import t.annotation.Primary;
import io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
/**
* MybatisPlus配置
*/
@Configuration
public class MybatisPlusConfig {
/
/ 分页
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
//定义db1
@Bean(name = "db1")
@ConfigurationProperties(prefix = "spring.datasource.db1")//与配置⽂件中的层次结构相同
public DataSource db1() {
ate().build();
}
/
/定义db2
@Bean(name = "db2")
@ConfigurationProperties(prefix = "spring.datasource.db2")//与配置⽂件中的层次结构相同
public DataSource db2() {
ate().build();
}
/**
* 动态数据源配置
* @return
*/
@Bean
@Primary
public DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {        DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put(Value(), db1);
targetDataSources.put(Value(), db2);
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(db1);
return dynamicDataSource;
}
@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
//***导⼊MybatisSqlSession配置***
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
//指明数据源
sqlSessionFactory.setDataSource(multipleDataSource(db1(), db2()));
//指明l位置(配置⽂件中指明的xml位置会失效⽤此⽅式代替,具体原因未知)
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/**l"));
//指明实体扫描(多个package⽤逗号或者分号分隔)
sqlSessionFactory.setTypeAliasesPackage("del.h.model.hotel");
//***导⼊Mybatis配置***
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setJdbcTypeForNull(JdbcType.NULL);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setCacheEnabled(false);
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setPlugins(new Interceptor[]{paginationInterceptor()});
//***导⼊全局配置***
sqlSessionFactory.setGlobalConfig(globalConfiguration());
Object();
}
/**
* 在代码中配置MybatisPlus替换掉l中的配置
* @return
*/
@Bean
public GlobalConfiguration globalConfiguration() {
GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());
//主键类型 0:数据库ID⾃增, 1:⽤户输⼊ID,2:全局唯⼀ID (数字类型唯⼀ID), 3:全局唯⼀ID UUID
conf.setIdType(0);
//字段策略(拼接sql时⽤于判断属性值是否拼接) 0:忽略判断,1:⾮NULL判断,2:⾮空判断
conf.setFieldStrategy(2);
//驼峰下划线转换含查询column及返回column(column下划线命名create_time,返回java实体是驼峰命名createTime,开启后⾃动转换否则保留原样)        conf.setDbColumnUnderline(true);
//是否动态刷新mapper
conf.setRefresh(true);
return conf;
}
}
6、创建mapper⽂件夹⽤于存放于xml对应的mapper接⼝
BaseInfoMapper
import batisplus.mapper.BaseMapper;
h.model.hotel.BaseInfoModel;
import org.springframework.stereotype.Component;
@Component
public interface BaseInfoMapper extends BaseMapper<BaseInfoModel> {
//⾃定义⽅法
int listCount();
}
UserInfoMapper
import batisplus.mapper.BaseMapper;
h.model.hotel.UserInfoModel;
import org.springframework.stereotype.Component;
@Component
public interface UserInfoMapper extends BaseMapper<UserInfoModel> {
//⾃定义⽅法
int listCount();
}
7、创建service⽂件夹⽤于存放业务逻辑类
h.model.hotel.BaseInfoModel;
h.model.hotel.UserInfoModel;
h.fig.DBTypeEnum;
h.fig.DbContextHolder;
h.service.hotel.mapper.BaseInfoMapper;
h.service.hotel.mapper.UserInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class HotelService {
@Autowired
BaseInfoMapper baseMapper;
@Autowired
spring frameworkUserInfoMapper userMapper;
public void testDynamicDb() {
//使⽤db1
DbContextHolder.setDbType(DBTypeEnum.db1);
BaseInfoModel baseModel = baseMapper.selectById(1);
int baseCount = baseMapper.listCount();
System.out.println("db1=" + Nickname());
//使⽤db2
DbContextHolder.setDbType(DBTypeEnum.db2);
UserInfoModel userModel = userMapper.selectById(1);
int userCount = userMapper.listCount();
System.out.println("db2=" + Username());
}
}
8、创建controller⽂件夹编写⼀个controller和action⽤于测试h.service.hotel.service.HotelService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/hotel")
public class HotelController {
@Autowired
HotelService service;
@ResponseBody
@RequestMapping("/test")
public void test() {
}
}
9、创建⾃⼰的实体Model,get/set⽅法⾃⼰⽣成吧BaseInfoModel
import batisplus.annotations.TableName;
import java.time.LocalDateTime;
@TableName("base_info")
public class BaseInfoModel {
private int id;
private String nickname;
private LocalDateTime updateTime;
}
UserInfoModel
import batisplus.annotations.TableName;
import java.time.LocalDateTime;
@TableName("user_info")
public class UserInfoModel {
private int id;
private String username;
private String password;
private int sex;
private int age;
private LocalDateTime createTime;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。