栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通过mybatis或JPA进行多数据源连接

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过mybatis或JPA进行多数据源连接

多数据源配置
  • 数据库
  • mybatis连接数据库
  • JPA连接数据库
  • 注意事项

数据库
package com.example.db.config;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class baseDBConfig {
    private String username;
    private String url;
    private String password;
    private String driverClassName;
}

  • 默认数据库defaultDB
package com.example.db.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DBDefaultConfig extends baseDBConfig{
}

  • DEV数据库devDB
package com.example.db.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "db.dev")
public class DBDevConfig extends baseDBConfig {
}
mybatis连接数据库
  • 数据源配置
* @Primary 优先选择这个Bean,多数据源时必须通过@Primary配置主数据源
* @MapperScan 扫描 Mapper 接口,确定需要被扫描的包, 与其他数据进行区分
* sqlSessionFactoryRef 表示定义了 key ,表示一个唯一 SqlSessionFactory 实例
package com.example.db.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = {"com.example.db.dao.mybatis"},sqlSessionFactoryRef = "mybatisSqlSessionFactory")
public class DataSourceConfigMybtis {
    @Autowired
    DBDefaultConfig dbDefaultConfig;

    @Primary
    @Bean("mybatisDataSource")
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(dbDefaultConfig.getDriverClassName());
        dataSource.setUsername(dbDefaultConfig.getUsername());
        dataSource.setPassword(dbDefaultConfig.getPassword());
        return dataSource;
    }

    @Bean("mybatisSqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("mybatisDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResource("mapper.xml文件的存放路径"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean("mybatisTransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("mybatisDataSource") DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean("mybatisSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("mybatisSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

JPA连接数据库
  • 数据源配置
package com.example.db.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;

import javax.persistence.EntityManager;
import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
                        transactionManagerRef = "jpaTransactionManager",
                        basePackages = {"com.example.db.dao.jpa"})
public class DataSourceConfigJPA {
    @Autowired
    private DBDevConfig dbDevConfig;
    @Autowired
    private JpaProperties jpaProperties;

    @Bean("jpaDataSource")
    public DataSource dataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(dbDevConfig.getDriverClassName());
        dataSource.setUsername(dbDevConfig.getUsername());
        dataSource.setPassword(dbDevConfig.getPassword());
        return dataSource;
    }

    @Bean("entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder entityManagerFactoryBuilder,
                                                                       @Qualifier("jpaDataSource") DataSource dataSource){
        return entityManagerFactoryBuilder.dataSource(dataSource)
                                          .properties(jpaProperties.getProperties())
                                          .packages("com.example.db.bean.jpa") //实体类存放package
                                          .build();
    }

    public EntityManager entityManager(@Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory){
        return entityManagerFactory.getObject().createEntityManager();
    }

    @Bean("jpaTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory){
        return new JpaTransactionManager(entityManagerFactory.getObject());
    }


}

注意事项
  • 在service层需要在@Transctional中添加transactionManager的名字,比如:@Transctional(transactionManager=“jpaTransactionManager”)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号