Spring Boot文档阅读笔记-使用Spring Data JPA连接多源数据库(MySQL和Oracle)
发布日期:2021-06-30 10:46:12 浏览次数:2 分类:技术文章

本文共 10638 字,大约阅读时间需要 35 分钟。

下面这个小项目展示了如何连接2个数据库,一个是Oracle,一个是MySQL。

关键的Maven依赖:

org.springframework.boot
spring-boot-starter-data-jpa
com.oracle
ojdbc6
11.2.0
mysql
mysql-connector-java

这个Oracle的jar包是不再maven仓库里面的,需要自己手动导入到maven仓库。

application.properties的代码如下:

#Oracle DB Configdb.dialect=org.hibernate.dialect.Oracle10gDialectdb.driver=oracle.jdbc.driver.OracleDriverdb.url=jdbc:oracle:thin:@localhost:1521:xedb.user=pavansdb.password=******#MySQL DB Configmysql.db.dialect=org.hibernate.dialect.MySQLDialectmysql.db.driver=com.mysql.jdbc.Drivermysql.db.url=jdbc:mysql://localhost:3306/localdb?useSSL=falsemysql.db.user=lessrootmysql.db.password=******

所以,要定义2个dataSource的Bean,Spring需要知道那个dataSource是主要的,哪个是次要的。如果不去定义主次,那么Spring程序将会启动失败。如果不定义主次,那么相同的bean,Spring是不能将其注册的。

使用@Primary注解定义主要的dataSource的Bean。

 

首要的DtaSource配置:

@Configuration@EnableTransactionManagement@EnableJpaRepositories(		entityManagerFactoryRef = "entityManagerFactory", 		transactionManagerRef = "transactionManager", 		basePackages = "com.opencodez.dao.oracle.repo")public class PrimaryDbConfig {	public static final String PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size";	public static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";	public static final String PROPERTY_NAME_HIBERNATE_FMT_SQL = "hibernate.format_sql";	public static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN = { "com.opencodez.dao.oracle.domain" };	public static final String DB_URL = "db.url";	public static final String DB_USER = "db.user";	public static final String DB_PASSWORD = "db.password";	public static final String DB_DRIVER = "db.driver";	public static final String DB_DIALECT = "db.dialect";		@Autowired	private Environment env;		@Bean	public AnnotationMBeanExporter annotationMBeanExporter() {	    AnnotationMBeanExporter annotationMBeanExporter = new AnnotationMBeanExporter();	    annotationMBeanExporter.addExcludedBean("dataSource");	    annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);	    return annotationMBeanExporter;	}		@Bean(destroyMethod = "close")	@Primary	public DataSource dataSource() {		ComboPooledDataSource dataSource = new ComboPooledDataSource();		try {			dataSource.setDriverClass(env.getProperty(DB_DRIVER));		} catch (PropertyVetoException e) {			e.printStackTrace();		}		dataSource.setJdbcUrl(env.getProperty(DB_URL));		dataSource.setUser(env.getProperty(DB_USER));		dataSource.setPassword(env.getProperty(DB_PASSWORD));		dataSource.setAcquireIncrement(5);		dataSource.setMaxStatementsPerConnection(20);		dataSource.setMaxStatements(100);		dataSource.setMaxPoolSize(500);		dataSource.setMinPoolSize(5);		return dataSource;	}	@Bean(name = "transactionManager")	@Primary	public JpaTransactionManager jpaTransactionManager() {		JpaTransactionManager transactionManager = new JpaTransactionManager();		transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());		return transactionManager;	}	@Bean(name = "entityManagerFactory")	@Primary	public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {		LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();		entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor());		entityManagerFactoryBean.setDataSource(dataSource());		entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);		entityManagerFactoryBean.setPersistenceUnitManager(persistenceUnitManager());		entityManagerFactoryBean.setPersistenceUnitName("orcl");		entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);		entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties());		return entityManagerFactoryBean;	}	@Bean	@Primary	public DefaultPersistenceUnitManager persistenceUnitManager() {		DefaultPersistenceUnitManager persistenceUnitManager = new DefaultPersistenceUnitManager();		persistenceUnitManager.setDefaultDataSource(dataSource());		return persistenceUnitManager;	}	private HibernateJpaVendorAdapter vendorAdaptor() {		HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();		vendorAdapter.setDatabasePlatform(env.getProperty(DB_DIALECT));		vendorAdapter.setShowSql(false);		return vendorAdapter;	}	private Properties jpaHibernateProperties() {		Properties properties = new Properties();		properties.put(PROPERTY_NAME_HIBERNATE_FMT_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_FMT_SQL));		properties.put(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE));		properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));		return properties;	}}

这里有几个关键地方:

1. dataSource要加上@Primary注解;

2. entityMananger也要加上@Primary注解;

3. persistenceUnitManager同样也要加上@Primary

 

 

次要DataSource源配置:

@Configuration@EnableTransactionManagement@EnableJpaRepositories(		entityManagerFactoryRef = "mysqlEntityManager", 		transactionManagerRef = "mysqlTransactionManager", 		basePackages = "com.opencodez.dao.mysql.repo")public class SecondaryDbConfig {	public static final String PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size";	public static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";	public static final String PROPERTY_NAME_HIBERNATE_FMT_SQL = "hibernate.format_sql";	public static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN = { "com.opencodez.dao.mysql.domain" };	public static final String DB_URL = "mysql.db.url";	public static final String DB_USER = "mysql.db.user";	public static final String DB_PASSWORD = "mysql.db.password";	public static final String DB_DRIVER = "mysql.db.driver";	public static final String DB_DIALECT = "mysql.db.dialect";	@Autowired	private Environment env;	@Bean	public AnnotationMBeanExporter annotationMBeanExporter() {		AnnotationMBeanExporter annotationMBeanExporter = new AnnotationMBeanExporter();		annotationMBeanExporter.addExcludedBean("dataSource");		annotationMBeanExporter.setRegistrationPolicy(RegistrationPolicy.IGNORE_EXISTING);		return annotationMBeanExporter;	}	@Bean(name = "mysqlDataSource", destroyMethod = "close")	public DataSource dataSource() {		ComboPooledDataSource dataSource = new ComboPooledDataSource();		try {			dataSource.setDriverClass(env.getProperty(DB_DRIVER));		} catch (PropertyVetoException e) {			e.printStackTrace();		}		dataSource.setJdbcUrl(env.getProperty(DB_URL));		dataSource.setUser(env.getProperty(DB_USER));		dataSource.setPassword(env.getProperty(DB_PASSWORD));		dataSource.setAcquireIncrement(5);		dataSource.setMaxStatementsPerConnection(20);		dataSource.setMaxStatements(100);		dataSource.setMaxPoolSize(500);		dataSource.setMinPoolSize(5);		return dataSource;	}	@Bean(name = "mysqlTransactionManager")	public JpaTransactionManager jpaTransactionManager() {		JpaTransactionManager transactionManager = new JpaTransactionManager();		transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());		return transactionManager;	}	@Bean(name = "mysqlEntityManager")	public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {		LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();		entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor());		entityManagerFactoryBean.setDataSource(dataSource());		entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);		entityManagerFactoryBean.setPersistenceUnitManager(persistenceUnitManager());		entityManagerFactoryBean.setPersistenceUnitName("mysql");		entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);				entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties());		return entityManagerFactoryBean;	}	@Bean(name = "mysqlpersistenceUnitManager")	public DefaultPersistenceUnitManager persistenceUnitManager() {		DefaultPersistenceUnitManager persistenceUnitManager = new DefaultPersistenceUnitManager();		persistenceUnitManager.setDefaultDataSource(dataSource());		return persistenceUnitManager;	}	private HibernateJpaVendorAdapter vendorAdaptor() {		HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();		vendorAdapter.setDatabasePlatform(env.getProperty(DB_DIALECT));		vendorAdapter.setShowSql(false);		return vendorAdapter;	}	private Properties jpaHibernateProperties() {		Properties properties = new Properties();		properties.put(PROPERTY_NAME_HIBERNATE_FMT_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_FMT_SQL));		properties.put(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE,				env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE));		properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));		return properties;	}}

这里配置类,无需@Primary注解,但是@Bean中的name需要唯一。

这样就完成了数据库的配置,下面定义2个Java类,用于映射数据库表,一个是TblOracle,一个是TblMysql。

 

TblOracle

@Entity@Table(name = "TBL_ORCL")public class TblOracle {	@Id	@GeneratedValue	@Column(name = "MESSAGE_ID")	private Long id;	@Column(name = "MESSAGE")	private String message;	@Column(name = "CREATED_DATE")	private Date created;	//Getters and Setters}

TblMysql

@Entity@Table(name = "tbl_mysql")public class TblMysql {	@Id	@GeneratedValue	@Column(name = "MESSAGE_ID")	private Long id;	@Column(name = "MESSAGE")	private String message;	@Column(name = "CREATED_DATE")	private Date created;	//Getters and Setters}

对应的persistence.xml如下:

com.opencodez.dao.oracle.domain.TblOracle
true
com.opencodez.dao.mysql.domain.TblMysql
true

在此事例中,定义了相同的controller,这些controller调用了Spring Data JPA中的Repositories。

仓库声明如下:

@Autowiredprivate OracleMessageRepo oracleMessageRepo;@Autowiredprivate MysqlMessageRepo mysqlMessageRepo;

调用如下:

List
messages = oracleMessageRepo.findAll();List
messages = mysqlMessageRepo.findAll();

上面是使用JPA的方式存储,如果要使用传统的实体管理,需要这样:

@Autowired@Qualifier("entityManagerFactory")private EntityManager oracleEM;	@Autowired@Qualifier("mysqlEntityManager")private EntityManager mysqlEM;

这里需要自己提供检索条件,如下事例:

try {	String sql = "select t from TblOracle t";	Query query = oracleEM.createQuery(sql);	List
list =(List
)query.getResultList( ); } catch (Exception e) { e.printStackTrace();}try { String sql = "select t from TblMysql t"; Query query = mysqlEM.createQuery(sql); List
list=(List
)query.getResultList( ); } catch (Exception e) { e.printStackTrace();}

下面是调用了,运行截图如下:

总结:本次实例展示了如何使用Spring Data JPA轻松配置多源数据库。

创库代码如下:

 

 

转载地址:https://it1995.blog.csdn.net/article/details/111628471 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java笔记-String.format的使用(可用于格式化字符串)
下一篇:Java笔记-Spring-rabbitmq中设置receiveMessage参数为Message

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月27日 05时35分57秒