SpringBoot mybatis多数据源配置

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

}

@Pointcut(“execution(* com.warm.system.service.db2….(…))”)

private void db2Aspect() {

}

@Before( “db1Aspect()” )

public void db1(JoinPoint joinPoint) {

log.info(“切换到db1 数据源…”);

setDataSource(joinPoint,DBTypeEnum.db1);

}

@Before(“db2Aspect()” )

public void db2 (JoinPoint joinPoint) {

log.info(“切换到db2 数据源…”);

setDataSource(joinPoint,DBTypeEnum.db2);

}

/**

  • 添加注解方式,如果有注解优先注解,没有则按传过来的数据源配置

  • @param joinPoint

  • @param dbTypeEnum

*/

private void setDataSource(JoinPoint joinPoint, DBTypeEnum dbTypeEnum) {

MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();

DataSourceSwitch dataSourceSwitch = methodSignature.getMethod().getAnnotation(DataSourceSwitch.class);

if (Objects.isNull(dataSourceSwitch) || Objects.isNull(dataSourceSwitch.value())) {

DbContextHolder.setDbType(dbTypeEnum);

}else{

log.info(“根据注解来切换数据源,注解值为:”+dataSourceSwitch.value());

switch (dataSourceSwitch.value().getValue()) {

case “db1”:

DbContextHolder.setDbType(DBTypeEnum.db1);

break;

case “db2”:

DbContextHolder.setDbType(DBTypeEnum.db2);

break;

default:

DbContextHolder.setDbType(dbTypeEnum);

}

}

}

}

DbContextHolder

package com.warm.common;

/**

  • @Author DGD

  • @date 2018/2/7.

*/

public class DbContextHolder {

private static final ThreadLocal contextHolder = new ThreadLocal<>();

/**

  • 设置数据源

  • @param dbTypeEnum

*/

public static void setDbType(DBTypeEnum dbTypeEnum) {

contextHolder.set(dbTypeEnum.getValue());

}

/**

  • 取得当前数据源

  • @return

*/

public static String getDbType() {

return (String) contextHolder.get();

}

/**

  • 清除上下文数据

*/

public static void clearDbType() {

contextHolder.remove();

}

}

DBTypeEnum

package com.warm.common;

/**

  • @Author DGD

  • @date 2018/2/7.

*/

public enum DBTypeEnum {

db1(“db1”), db2(“db2”);

private String value;

DBTypeEnum(String value) {

this.value = value;

}

public String getValue() {

return value;

}

}

DynamicDataSource

package com.warm.common;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**

  • @Author DGD

  • @date 2018/2/7.

*/

public class DynamicDataSource extends AbstractRoutingDataSource {

/**

  • 取得当前使用哪个数据源

  • @return

*/

@Override

protected Object determineCurrentLookupKey() {

return DbContextHolder.getDbType();

}

}

MybatisPlusConfig

package com.warm.config.mybatis;

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;

import com.baomidou.mybatisplus.MybatisConfiguration;

import com.baomidou.mybatisplus.entity.GlobalConfiguration;

import com.baomidou.mybatisplus.mapper.LogicSqlInjector;

import com.baomidou.mybatisplus.plugins.PaginationInterceptor;

import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;

import com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;

import com.warm.common.DBTypeEnum;

import com.warm.common.DynamicDataSource;

import org.apache.ibatis.plugin.Interceptor;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.type.JdbcType;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

import java.util.HashMap;

import java.util.Map;

/**

  • @Author DGD

  • @date 2018/2/6.

*/

@Configuration

@MapperScan({“com.warm.system.mapper*”})

public class MybatisPlusConfig {

/**

  • mybatis-plus分页插件

  • 文档:http://mp.baomidou.com

*/

@Bean

public PaginationInterceptor paginationInterceptor() {

PaginationInterceptor paginationInterceptor = new PaginationInterceptor();

//paginationInterceptor.setLocalPage(true);// 开启 PageHelper 的支持

return paginationInterceptor;

}

/**

  • mybatis-plus SQL执行效率插件【生产环境可以关闭】

*/

@Bean

public PerformanceInterceptor performanceInterceptor() {

return new PerformanceInterceptor();

}

@Bean(name = “db1”)

@ConfigurationProperties(prefix = “spring.datasource.druid.db1” )

public DataSource db1 () {

return DruidDataSourceBuilder.create().build();

}

@Bean(name = “db2”)

@ConfigurationProperties(prefix = “spring.datasource.druid.db2” )

public DataSource db2 () {

return DruidDataSourceBuilder.create().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(DBTypeEnum.db1.getValue(), db1 );

targetDataSources.put(DBTypeEnum.db2.getValue(), db2);

dynamicDataSource.setTargetDataSources(targetDataSources);

dynamicDataSource.setDefaultTargetDataSource(db1);

return dynamicDataSource;

}

@Bean(“sqlSessionFactory”)

public SqlSessionFactory sqlSessionFactory() throws Exception {

MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();

sqlSessionFactory.setDataSource(multipleDataSource(db1(),db2()));

//sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(“classpath:/mapper/*/*Mapper.xml”));

MybatisConfiguration configuration = new MybatisConfiguration();

//configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);

configuration.setJdbcTypeForNull(JdbcType.NULL);

configuration.setMapUnderscoreToCamelCase(true);

configuration.setCacheEnabled(false);

sqlSessionFactory.setConfiguration(configuration);

sqlSessionFactory.setPlugins(new Interceptor[]{ //PerformanceInterceptor(),OptimisticLockerInterceptor()

paginationInterceptor()

});

sqlSessionFactory.setGlobalConfig(globalConfiguration());

return sqlSessionFactory.getObject();

}

@Bean

public GlobalConfiguration globalConfiguration() {

GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());

conf.setLogicDeleteValue(“-1”);

conf.setLogicNotDeleteValue(“1”);

conf.setIdType(0);

conf.setMetaObjectHandler(new MyMetaObjectHandler());

conf.setDbColumnUnderline(true);

conf.setRefresh(true);

return conf;

}

}

MyMetaObjectHandler

package com.warm.config.mybatis;

import com.baomidou.mybatisplus.mapper.MetaObjectHandler;

import org.apache.ibatis.reflection.MetaObject;

import java.sql.Timestamp;

/**

  • @Author DGD

  • @date 2018/2/6.

*/

public class MyMetaObjectHandler extends MetaObjectHandler {

/**

  • 字段为空自动填充,如果要使填充生效,一定在在实体类对应的字段上设置fill = FieldFill.INSERT字段!

*/

public void insertFill(MetaObject metaObject) {

// 更多查看源码测试用例

System.out.println(“*************************”);

System.out.println(“insert fill”);

System.out.println(“*************************”);

Object createTime = getFieldValByName(“createTime”, metaObject);//mybatis-plus版本2.0.9+

Timestamp timestamp = new Timestamp(System.currentTimeMillis());

if (createTime == null) {

setFieldValByName(“createTime”, timestamp, metaObject);//mybatis-plus版本2.0.9+

}

}

@Override

public void updateFill(MetaObject metaObject) {

//更新填充

System.out.println(“*************************”);

System.out.println(“update fill”);

System.out.println(“*************************”);

//mybatis-plus版本2.0.9+

setFieldValByName(“modifyTime”, new Timestamp(System.currentTimeMillis()), metaObject);

}

}

UserServiceImpl

package com.warm.system.service.impl;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;

import com.warm.common.DBTypeEnum;

import com.warm.common.DataSourceSwitch;

import com.warm.system.entity.User;

import com.warm.system.mapper.OrderMapper;

import com.warm.system.mapper.UserMapper;

import com.warm.system.service.db1.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.math.BigDecimal;

import java.util.List;

/**

  • 服务实现类

  • @author dgd123

  • @since 2018-02-10

*/

@Service

public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

@Autowired

private OrderMapper orderMapper;

@Override

public List getUserList() {

return selectList(null);

}

@DataSourceSwitch(DBTypeEnum.db2)

@Override

public BigDecimal getOrderPriceByUserId(Integer userId) {

return orderMapper.getPriceByUserId(userId);

}

}

application-dev.yml

server:

port: 8080

spring:

aop:

proxy-target-class: true

auto: true

datasource:

druid:

数据库 1

db1:

url: jdbc:mysql://120.78.5.210:3306/rosamdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver

initialSize: 5

minIdle: 5

maxActive: 20

数据库 2

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

在这里插入图片描述

在这里插入图片描述

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
rue

auto: true

datasource:

druid:

数据库 1

db1:

url: jdbc:mysql://120.78.5.210:3306/rosamdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver

initialSize: 5

minIdle: 5

maxActive: 20

数据库 2

总结

对于面试,一定要有良好的心态,这位小伙伴面试美团的时候没有被前面阿里的面试影响到,发挥也很正常,也就能顺利拿下美团的offer。
小编还整理了大厂java程序员面试涉及到的绝大部分面试题及答案,希望能帮助到大家,

[外链图片转存中…(img-fpY1gH60-1714754300873)]

[外链图片转存中…(img-oaV3hW1L-1714754300873)]

最后感谢大家的支持,希望小编整理的资料能够帮助到大家!也祝愿大家都能够升职加薪!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过配置多个数据来实现在Spring Boot中使用MyBatis数据。以下是一种常见的配置方式: 1. 在`application.properties`文件中配置第一个数据的连接信息: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/db1 spring.datasource.username=username1 spring.datasource.password=password1 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ``` 2. 创建一个`DataSource`的Bean来管理第一个数据: ```java @Configuration @MapperScan(basePackages = "com.example.db1.mapper", sqlSessionTemplateRef = "db1SqlSessionTemplate") public class DataSource1Config { @Primary @Bean(name = "db1DataSource") @ConfigurationProperties(prefix = "spring.datasource") public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "db1SqlSessionFactory") public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Primary @Bean(name = "db1SqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 3. 在`application.properties`文件中配置第二个数据的连接信息: ```properties spring.second-datasource.url=jdbc:mysql://localhost:3306/db2 spring.second-datasource.username=username2 spring.second-datasource.password=password2 spring.second-datasource.driver-class-name=com.mysql.jdbc.Driver ``` 4. 创建另一个`DataSource`的Bean来管理第二个数据: ```java @Configuration @MapperScan(basePackages = "com.example.db2.mapper", sqlSessionTemplateRef = "db2SqlSessionTemplate") public class DataSource2Config { @Bean(name = "db2DataSource") @ConfigurationProperties(prefix = "spring.second-datasource") public DataSource db2DataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "db2SqlSessionFactory") public SqlSessionFactory db2SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); return bean.getObject(); } @Bean(name = "db2SqlSessionTemplate") public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } } ``` 这样就配置了两个数据,分别对应两个不同的数据库。你可以根据自己的需求配置更多的数据。在使用时,可以在具体的Mapper接口上使用`@Qualifier`注解指定要使用的数据,例如: ```java @Mapper @Qualifier("db1SqlSessionTemplate") public interface UserMapper1 { // ... } @Mapper @Qualifier("db2SqlSessionTemplate") public interface UserMapper2 { // ... } ``` 这样就可以根据需要选择不同的数据来执行对应的SQL操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值