JAVA資料庫操作二(多個數據庫操作+Spring data + jpa)
阿新 • • 發佈:2018-12-25
本文我們將主要實現同時操作兩個資料庫,(oracle 和mysql)
當然為了展示技巧,本文將以java配置為主
首先是daoContext.xml的內容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:c="http://www.springframework.org/schema/c" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <bean class = "db.MyConfig"/> <bean class = "mysqldb.MySqlConfig"/> </beans>
好吧。其實有用的就兩行。
oralce的配置檔案就MyConfig 內容如下
mysql的配置檔案如下package db; import com.mysql.cj.jdbc.MysqlDataSource; import oracle.jdbc.pool.OracleDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.sql.SQLException; @Configuration @EnableJpaRepositories(basePackages = "db", entityManagerFactoryRef="entityManagerFactoryOracle", transactionManagerRef="transactionManagerOracle" ) public class MyConfig { @Bean public DataSource dataSourceOracle() throws SQLException { OracleDataSource dataSource = new OracleDataSource(); dataSource.setUser("abc"); dataSource.setPassword("abc"); dataSource.setURL("jdbc:oracle:thin:@192.168.1.2:1521:orcl"); dataSource.setImplicitCachingEnabled(true); dataSource.setFastConnectionFailoverEnabled(true); return dataSource; } @Bean public HibernateJpaVendorAdapter jpaVendorAdapterOracle() { HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); adapter.setDatabase(Database.ORACLE); adapter.setShowSql(true); adapter.setGenerateDdl(false); return adapter; } @Bean(name = "entityManagerFactoryOracle") public LocalContainerEntityManagerFactoryBean entityManagerFactoryOracle() throws SQLException{ LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(dataSourceOracle()); emf.setPersistenceUnitName("myPersistence1"); emf.setJpaVendorAdapter(jpaVendorAdapterOracle()); emf.setPackagesToScan("entity"); return emf; } @Bean(name="transactionManagerOracle") public JpaTransactionManager transactionManagerOracle() throws SQLException{ JpaTransactionManager txManager = new JpaTransactionManager(entityManagerFactoryOracle().getObject()); return txManager; } }
package mysqldb; import com.mysql.cj.jdbc.MysqlDataSource; import org.hibernate.jpa.boot.spi.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.Transactional; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; @Configuration @EnableJpaRepositories(basePackages = "mysqldb", entityManagerFactoryRef="entityManagerFactoryMySql", transactionManagerRef="transactionManagerMySql" ) public class MySqlConfig { @Bean public DataSource dataSourceMySql() throws SQLException { MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUser("abc"); dataSource.setPassword("abc"); dataSource.setURL("jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"); return dataSource; } @Bean public HibernateJpaVendorAdapter jpaVendorAdapterMySql() { HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); adapter.setDatabase(Database.MYSQL); adapter.setShowSql(true); adapter.setGenerateDdl(true); return adapter; } @Bean(name = "entityManagerFactoryMySql") public LocalContainerEntityManagerFactoryBean entityManagerFactoryMySql() throws SQLException{ LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); emf.setDataSource(dataSourceMySql()); emf.setPersistenceUnitName("myPersistence2"); emf.setJpaVendorAdapter(jpaVendorAdapterMySql()); emf.setPackagesToScan("mysqlentity"); return emf; } @Bean(name="transactionManagerMySql") public JpaTransactionManager transactionManagerMySql() throws SQLException{ return new JpaTransactionManager(entityManagerFactoryMySql().getObject()); } }
這兩個配置檔案一出,大部分的工作就完成啦。
作為測試。我們分別定義表MyEntity在 oracle中,表MySqlEntity在mysql中
package entity;
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "prooduct_id_seq")
@SequenceGenerator(name="prooduct_id_seq", sequenceName = "PRODUCT_ID_SEQ", allocationSize = 100)
private Integer id;
@Version
private Integer version;
private String testString;
private BigDecimal testNumber;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public String getTestString() {
return testString;
}
public void setTestString(String testString) {
this.testString = testString;
}
public BigDecimal getTestNumber() {
return testNumber;
}
public void setTestNumber(BigDecimal testNumber) {
this.testNumber = testNumber;
}
}
MySqlEntity的內容如下
package mysqlentity;
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
public class MySqlEntity {
@Id
@Column(name = "id", nullable = false, length = 64)
private Integer id;
@Version
private Integer version;
private String testString;
private BigDecimal testNumber;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
public String getTestString() {
return testString;
}
public void setTestString(String testString) {
this.testString = testString;
}
public BigDecimal getTestNumber() {
return testNumber;
}
public void setTestNumber(BigDecimal testNumber) {
this.testNumber = testNumber;
}
}
測試嘛。就隨便弄倆個數據庫操作
oracle 的
package db;
import entity.MyEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.math.BigDecimal;
import java.util.List;
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {
List<MyEntity> findByVersion(Integer version);
}
mysql的
package mysqldb;
import entity.MyEntity;
import mysqlentity.MySqlEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface MySqlEntityRepository extends JpaRepository<MySqlEntity, Long> {
List<MySqlEntity> findByVersion(Integer version);
}
最後就是測試用的MyService
package service;
import db.MyEntityRepository;
import entity.MyEntity;
import mysqldb.MySqlEntityRepository;
import mysqlentity.MySqlEntity;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
public class MyService {
@Autowired
public MyEntityRepository myEntityRepository;
@Autowired
public MySqlEntityRepository mySqlEntityRepository;
public String processCommand(String anything)
{
String str = "hello";
List<MyEntity> myEntityList = myEntityRepository.findAll();
List<MyEntity> myEntityList2 = myEntityRepository.findByVersion(3);
List<MySqlEntity> myEntityList3 = mySqlEntityRepository.findAll();
return str;
}
}
怎麼樣?程式碼都跑起來了吧。。很容易就實現了JAVA同時操作兩個資料庫,下一篇將介紹如何操作ES