1 主数据源和从数据源配置
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
/**
*主数据源配置
*/
@Configuration
//自动事务管理
@EnableTransactionManagement
//JPA配置
@EnableJpaRepositories(
entityManagerFactoryRef="primaryEntityManagerFactory",
transactionManagerRef="primaryTransactionManager",
basePackages= { "com.zdj.mapper.primary" })
public class PrimaryDataSourceConfig {
@Autowired
@Qualifier("primaryDataSource")
private DataSource primaryDataSource ;
// @Primary //primary是设置优先,因为有多个数据源,在没有明确指定用哪个的情况下,会用带有primary的,这个注解必须有一个数据源要添加
@Bean(name = "primaryJdbcTemplate")
@Primary
public JdbcTemplate primaryJdbcTemplate(
@Qualifier("primaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Primary
@Bean(name = "primaryDataSourceProperties")
@Qualifier("primaryDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSourceProperties primaryDataSourceProperties() {
return new DataSourceProperties();
}
@Primary
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.primary")
public DataSource primaryDataSource() {
return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}
@Primary
@Bean(name = "primaryEntityManager")
public EntityManager primaryEntityManager(EntityManagerFactoryBuilder builder) {
return primaryEntityManagerFactory(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "primaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder.dataSource(primaryDataSource)
//.properties(getVendorProperties())
.packages("com.zdj.entity.primary")
.persistenceUnit("primaryPersistenceUnit")
.build();
}
@Primary
@Bean(name = "primaryTransactionManager")
public PlatformTransactionManager primaryTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(primaryEntityManagerFactory(builder).getObject());
}
}
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
/**
* 第二个数据源
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="secondaryEntityManagerFactory",
transactionManagerRef="secondaryTransactionManager",
basePackages= { "com.zdj.mapper.primary" })
public class SecondaryDataSourceConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource ;
@Bean(name = "secondaryJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondaryDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondaryDataSourceProperties")
@Qualifier("secondaryDataSourceProperties")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSourceProperties secondaryDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource() {
return secondaryDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "secondaryEntityManager")
public EntityManager secondaryEntityManager(EntityManagerFactoryBuilder builder) {
return secondaryEntityManagerFactory(builder).getObject().createEntityManager();
}
@Bean(name = "secondaryEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory(EntityManagerFactoryBuilder builder) {
return builder.dataSource(secondaryDataSource)
//.properties(getVendorProperties())
.packages("com.zdj.entity.secondary")
.persistenceUnit("secondaryPersistenceUnit")
.build();
}
@Bean(name = "secondaryTransactionManager")
public PlatformTransactionManager secondaryTransactionManager(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(secondaryEntityManagerFactory(builder).getObject());
}
@Bean(name = "secondarySqlSessionFactory")
public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
}
2 application.properties配置
spring.datasource.primary.url=jdbc:oracle:thin:@{IP地址}:{SID}
spring.datasource.primary.username={用户名}
spring.datasource.primary.password={用户密码}
spring.datasource.primary.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.secondary.url=jdbc:oracle:thin:@{IP地址}:{SID}
spring.datasource.secondary.username={用户名}
spring.datasource.secondary.password={用户密码}
spring.datasource.secondary.driver-class-name=oracle.jdbc.driver.OracleDriver
3 Maven依赖配置
<!-- Oracle数据库依赖 ojdbc需要自己下载,然后用maven安装到本地仓库 -->
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mybatis springboot版本 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.4</version>
</dependency>
4 实体类
JPA中GenerationValue的使用
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import java.util.Date;
//主数据源中的表
@Entity
@Data
public class HotelCheck {
@Id
// @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "mem_num")
private Integer memNum;
@Column(name = "men_name")
private String memName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Column(name = "live_time")
private Date liveTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@Column(name = "leave_time")
private Date leaveTime;
@Column(name = "peo_num")
private String peoNum;
@Column(name = "room_num")
private Integer roomNum;
@Column(name = "id_card")
private String idCard;
@Column(name = "del_flag")
private Integer delFlag;
@Column(name = "phone_num")
private String phoneNum;
@Column(name = "money_num")
private String moneyNum;
public HotelCheck(){
this.delFlag = 0 ;
}
}
import lombok.Data;
import javax.persistence.*;
//从数据源中的表
@Entity
@Data
public class Room {
@Id
// @GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "room_num")
private Integer roomNum;
@Column(name = "air_flag")
private Integer airFlag;
}
5 Repository设置
//主数据源中HotelCheck对应的mapper
@Repository
public interface HotelCheckMapper extends BaseMapper<HotelCheck> {
}
//从数据源中Room对应的mapper
@Repository
//指定从数据源
@Qualifier("secondarySqlSessionFactory")
public interface RoomMapper extends BaseMapper<Room> {
}
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T> {
}