2天时间,终于把spring boot下配置连接多种不同类型数据库,配置多数据源实现!

======================================================================================================

spring boot对多种不同类型数据库,多数据源配置使用

多数据源配置相关官方API:https://docs.spring.io/spring-boot/docs/current/api/

环境如下:

  开发环境IDE:IntelliJ IDEA

  spring boot版本:1.5.9

  hibernate版本:5.0.12

  多数据源: sql server2008 和 mysql 5.5

======================================================================================================

实现多数据源的配置连接,主要思路如下:

1》首先在application.properties中配置两个数据源  和必要的JPA相关配置

2》DataSourceConfig总装载类,分别声明多个数据源【并指定其中一个数据源为主数据源】

3》分别创建多个数据源的具体装载类,例如MyagenDataSourceConfig,并在具体装载类中,注入并完善JpaProperties,声明并引用实体管理事务管理,并在过程中指定了本数据源要作用的包的范围

4》根据第3步中指定的包,分别对应多个数据源的具体装载类,创建包结构,以及生成实体和对应的repository层操作

5》最后再controller层,依次调用各种数据源对应的各个包下的各种repository操作进行操作

那么主要实现目录如下:

======================================================================================================

下面依照思路,一步一步看实现:

1》首先在application.properties中配置两个数据源  和必要的JPA相关配置

完整代码:

application.properties

#datasource
myagen.spring.datasource.url=jdbc:sqlserver://localhost:1433;databasename=geneShop
myagen.spring.datasource.username=sa
myagen.spring.datasource.password=398023
myagen.spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver orderdiscount.spring.datasource.url=jdbc:mysql://localhost:3306/orderdiscount
orderdiscount.spring.datasource.username=root
orderdiscount.spring.datasource.password=root
orderdiscount.spring.datasource.driver-class-name=com.mysql.jdbc.Driver #jpa 需要单独提出来
spring.jpa.show-sql=true

1.这个实现的例子中。使用的多数据源是不同数据库类型下的多数据源。

2.然后仅需要在application.properties中配置spring.datasource下的必要属性,当然,除了这4个必要属性之外,还有很多关于spring.datasource的配置,具体可以查看,spring boot官方完整文档:http://www.cnblogs.com/sxdcgaq8080/p/7724506.html,进入搜索【spring.datasource】,就可以找到完整的关于它的配置属性名。

3.这里分别对多数据源前面的属性命名分别添加了标识用于标识不同的数据源。例如:

myagen.spring.datasource.url 和  orderdiscount.spring.datasource.url

具体这个标识怎么用,就是用于在第二步中取前缀分别装载不同数据源的时候用。需要明白一点:application.properties文件中定义键名为什么都不会报错,但是如果不符合规范且你自己没有去处理,那你配置的键值对并不会被加载而起作用。

4.再说spring.jpa.show-sql,这个属性名不会因为在不同数据库下就不起作用了,所以,直接配置在这里即可。

5.最后要说的是hibernate.dialect,方言等等和不同类型数据库有关联的属性值,不能配置在配置文件中,因为没办法解析,所以这个要放在第3步中处理,如果需要查看这个,可以直接跳到第三步

===================================================================================================================================

2》DataSourceConfig总装载类,分别声明多个数据源【并指定其中一个数据源为主数据源】

1.这个DataSourceConfig总的装载类,就是根据上面配置文件中不同的前缀获取到不同的几个键值对的值,封装进了DataSource数据源,例如前缀:

myagen.spring.datasource

2.需要注意的是这个类需要@Configuration注解标注本类需要被扫描到

3.在有多个数据源的情况下,必须要指定其中一个为主数据源,通过

@Primary

完整代码:

DataSourceConfig.java
package com.agen.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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; /**
* @author SXD
* @date 2017/12/04
* 多数据源装载配置类
* 数据源的声明
*/
@Configuration
public class DataSourceConfig { /**
* @return 我的基因网数据库
*/
@Bean(name = "myagenDataSource")
@Qualifier(value = "myagenDataSource") //spring装配bean的唯一标识
@ConfigurationProperties(prefix = "myagen.spring.datasource") //application.properties配置文件中该数据源的配置前缀
public DataSource myagenDataSource(){
return DataSourceBuilder.create().build();
} /**
* @return 基因网订单返现数据库
*/
@Primary //配置该数据源为主数据源
@Bean(name = "orderDiscountDataSource")
@Qualifier(value = "orderDiscountDataSource")
@ConfigurationProperties(prefix = "orderdiscount.spring.datasource")
public DataSource orderDiscountDataSource(){
return DataSourceBuilder.create().build();
}
}

===============================================================================================================================================

 3》分别创建多个数据源的具体装载类,例如MyagenDataSourceConfig,并在具体装载类中,注入并完善JpaProperties,声明并引用实体管理事务管理,并在过程中指定了本数据源要作用的包的范围

主数据源完整代码:

OrderDiscountDataSourceConfig.java
package com.agen.config.datasource;

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.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.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map; /**
* @author SXD
* @date 2017/12/04
* mysql数据库中数据源的 声明装载类
*
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryOrderDiscount", //EntityManagerFactory引用
transactionManagerRef = "transactionManagerOrderDiscount", //transactionManager引用
basePackages = {"com.agen.orderdiscount"}) //设置 基因网orderDiscountDataSource应用到的包
public class OrderDiscountDataSourceConfig { /**
* 注入 基因网订单折扣数据源
*/
@Autowired()
@Qualifier("orderDiscountDataSource")
private DataSource orderDiscountDataSource; /**
* 注入JPA配置实体
*/
@Autowired
private JpaProperties jpaProperties; /**
* 通过调用JPA配置实体中的解析方法,解析datasource中各属性的值
* @param dataSource 数据源
* @return 本数据源中各参数
* Map中设值分别为:
* hibernate-dialect 方言
* hibernate.hbm2ddl.auto DDL执行策略
* hibernate.physical_naming_strategy 命名策略
*
*这些和不同类型数据库密切相关的属性设置,不能设置在application.properties中,所以需要再不同的数据源中具体设置,赋值给JpaProperties
*/
private Map<String,String> getVendorProperties(DataSource dataSource){
jpaProperties.setDatabase(Database.MYSQL);
Map<String,String> map = new HashMap<>();
map.put("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect");
map.put("hibernate.hbm2ddl.auto","update");
map.put("hibernate.physical_naming_strategy","org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
jpaProperties.setProperties(map);
return jpaProperties.getHibernateProperties(dataSource);
} /**
* 配置EntityManagerFactory实体
* @param builder
* @return 实体管理工厂
* packages 扫描@Entity注释的软件包名称
* persistenceUnit 持久性单元的名称。 如果只建立一个EntityManagerFactory,你可以省略这个,但是如果在同一个应用程序中有多个,你应该给它们不同的名字
* properties 标准JPA或供应商特定配置的通用属性。 这些属性覆盖构造函数中提供的任何值。
*
*/
@Primary
@Bean(name = "entityManagerFactoryOrderDiscount")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryOrderDiscount(EntityManagerFactoryBuilder builder){
return builder
.dataSource(orderDiscountDataSource)
.properties(getVendorProperties(orderDiscountDataSource))
.packages(new String[]{"com.agen.orderdiscount"})
.persistenceUnit("orderDiscountPersistenceUnit")
.build();
} /**
* 配置EntityManager实体
* @param builder
* @return 实体管理器
*/
@Primary
@Bean(name = "entityManagerOrderDiscount")
public EntityManager entityManager(EntityManagerFactoryBuilder builder){
return entityManagerFactoryOrderDiscount(builder).getObject().createEntityManager();
} /**
* 配置事务transactionManager
* @param builder
* @return 事务管理器
*/
@Primary
@Bean(name = "transactionManagerOrderDiscount")
public PlatformTransactionManager transactionManagerOrderDiscount(EntityManagerFactoryBuilder builder){
return new JpaTransactionManager(entityManagerFactoryOrderDiscount(builder).getObject());
} }

其他数据源完整代码:

MyagenDataSourceConfig.java
package com.agen.config.datasource;

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.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.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map; /**
* @author SXD
* @date 2017/12/04
* sql server数据库中数据源的 声明装载类
*
*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryMyagen", //实体管理引用
transactionManagerRef = "transactionManagerMyagen", //事务管理引用
basePackages = {"com.agen.myagen"}) //设置 myagenDataSource应用到的包
public class MyagenDataSourceConfig { /**
* 注入 我的基因网数据源
*/
@Autowired()
@Qualifier("myagenDataSource")
private DataSource myagenDataSource; /**
* 注入JPA配置实体
*/
@Autowired
private JpaProperties jpaProperties; /**
* 通过调用JPA配置实体中的解析方法,解析datasource中各属性的值
* @param dataSource 数据源
* @return 本数据源中各参数
* Map中设值分别为:
* hibernate-dialect 方言
* hibernate.hbm2ddl.auto DDL执行策略
* hibernate.physical_naming_strategy 命名策略
*
*这些和不同类型数据库密切相关的属性设置,不能设置在application.properties中,所以需要再不同的数据源中具体设置,赋值给JpaProperties
*/
private Map<String, String> getVendorProperties(DataSource dataSource) {
jpaProperties.setDatabase(Database.SQL_SERVER);
Map<String,String> map = new HashMap<>();
map.put("hibernate.dialect","org.hibernate.dialect.SQLServer2008Dialect");
map.put("hibernate.hbm2ddl.auto","update");
map.put("hibernate.physical_naming_strategy","org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl");
jpaProperties.setProperties(map);
return jpaProperties.getHibernateProperties(dataSource);
} /**
* 配置EntityManagerFactory实体
*
* @param builder
* @return
* packages 扫描@Entity注释的软件包名称
* persistenceUnit 持久性单元的名称。 如果只建立一个EntityManagerFactory,你可以省略这个,但是如果在同一个应用程序中有多个,你应该给它们不同的名字
* properties 标准JPA或供应商特定配置的通用属性。 这些属性覆盖构造函数中提供的任何值。
*/
@Bean(name = "entityManagerFactoryMyagen")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryMyagen(EntityManagerFactoryBuilder builder) {
return builder
.dataSource(myagenDataSource)
.properties(getVendorProperties(myagenDataSource))
.packages(new String[]{"com.agen.myagen"})
.persistenceUnit("myagenPersistenceUnit")
.build();
} /**
* 配置EntityManager实体
*
* @param builder
* @return 实体管理器
*/
@Bean(name = "entityManagerMyagen")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
return entityManagerFactoryMyagen(builder).getObject().createEntityManager();
} /**
* 配置事务
*
* @param builder
* @return 事务管理器
*/
@Bean(name = "transactionManagerMyagen")
public PlatformTransactionManager transactionManagerMyagen(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryMyagen(builder).getObject());
} }

1.主数据源和其他数据源最大的区别在于,主数据源中 的实体管理器,实体工厂管理器,事务管理器在声明加载时 ,要声明自己是主数据源的,通过

@Primary

2.在实体工厂管理器中,需要设置

persistenceUnit

如果仅有一个数据源的话,不需要设置这个,但是多数据源的情况下,需要设置其为不同的值即可,没有具体的命名规则。

3.指定本数据源要扫描的包名,可以指定多个包,也可以将entity和repository放在同一个包下,这样仅需要指定一个即可被扫描到。

4.关于application.properties中有关和数据库操作相关的部分属性值的默认值是什么设置的:

查看JpaProperties源码,默认的为hibernate命名生成策略:

而这种命名生成策略是为若有驼峰命名出现orderId,则数据库中会有order_id下划线出现。我自己不想采用这种。

DDL策略:

=================================================================================================================================================================

4》根据第3步中指定的包,分别对应多个数据源的具体装载类,创建包结构,以及生成实体和对应的repository层操作

XxOrder.java

package com.agen.myagen.entity;

import javax.persistence.*;
import java.math.BigDecimal;
import java.sql.Timestamp; @Entity
@Table(name = "xx_order", schema = "dbo", catalog = "geneshop")
public class XxOrder {
private int id;
private Timestamp createDate;
private Timestamp modifyDate;
private String address;
private BigDecimal amountPaid;
private String areaName;
private String consignee;
private BigDecimal couponDiscount;
private int exchangePoint;
private Timestamp expire;
private BigDecimal fee;
private BigDecimal freight;
private String invoiceTitle;
private boolean isAllocatedStock;
private boolean isInvoice;
private Timestamp lockExpire;
private String memo;
private String name;
private BigDecimal offsetAmount;
private int orderStatus;
private String paymentMethodName;
private int paymentStatus;
private String phone;
private BigDecimal promotionDiscount;
private String promotionName;
private int rewardPoint;
private String shippingMethodName;
private int shippingStatus;
private String sn;
private BigDecimal tax;
private int type;
private String zipCode;
private String memberorderno;
private Integer ordertype;
private Boolean distributeState;
private Timestamp ctime;
private String guid;
private String cbqrr;
private Timestamp cbqrTime;
private Boolean isCbqr;
private Boolean isSrqr;
private String srqrr;
private Timestamp srqrTime;
private String isShow;
private Boolean isHunantb;
private Boolean byCreditCard;
private XxMember xxMemberByMember;
private XxAdmin xxAdminByOperator;
private XxAdmin xxAdminByAdmin; @Id
@Column(name = "id", nullable = false, precision = 0)
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} @Basic
@Column(name = "create_date", nullable = false)
public Timestamp getCreateDate() {
return createDate;
} public void setCreateDate(Timestamp createDate) {
this.createDate = createDate;
} @Basic
@Column(name = "modify_date", nullable = false)
public Timestamp getModifyDate() {
return modifyDate;
} public void setModifyDate(Timestamp modifyDate) {
this.modifyDate = modifyDate;
} @Basic
@Column(name = "address", nullable = false, length = 255)
public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} @Basic
@Column(name = "amount_paid", nullable = false, precision = 6)
public BigDecimal getAmountPaid() {
return amountPaid;
} public void setAmountPaid(BigDecimal amountPaid) {
this.amountPaid = amountPaid;
} @Basic
@Column(name = "area_name", nullable = false, length = 255)
public String getAreaName() {
return areaName;
} public void setAreaName(String areaName) {
this.areaName = areaName;
} @Basic
@Column(name = "consignee", nullable = false, length = 255)
public String getConsignee() {
return consignee;
} public void setConsignee(String consignee) {
this.consignee = consignee;
} @Basic
@Column(name = "coupon_discount", nullable = false, precision = 6)
public BigDecimal getCouponDiscount() {
return couponDiscount;
} public void setCouponDiscount(BigDecimal couponDiscount) {
this.couponDiscount = couponDiscount;
} @Basic
@Column(name = "exchange_point", nullable = false, precision = 0)
public int getExchangePoint() {
return exchangePoint;
} public void setExchangePoint(int exchangePoint) {
this.exchangePoint = exchangePoint;
} @Basic
@Column(name = "expire", nullable = true)
public Timestamp getExpire() {
return expire;
} public void setExpire(Timestamp expire) {
this.expire = expire;
} @Basic
@Column(name = "fee", nullable = false, precision = 6)
public BigDecimal getFee() {
return fee;
} public void setFee(BigDecimal fee) {
this.fee = fee;
} @Basic
@Column(name = "freight", nullable = false, precision = 6)
public BigDecimal getFreight() {
return freight;
} public void setFreight(BigDecimal freight) {
this.freight = freight;
} @Basic
@Column(name = "invoice_title", nullable = true, length = 255)
public String getInvoiceTitle() {
return invoiceTitle;
} public void setInvoiceTitle(String invoiceTitle) {
this.invoiceTitle = invoiceTitle;
} @Basic
@Column(name = "is_allocated_stock", nullable = false)
public boolean isAllocatedStock() {
return isAllocatedStock;
} public void setAllocatedStock(boolean allocatedStock) {
isAllocatedStock = allocatedStock;
} @Basic
@Column(name = "is_invoice", nullable = false)
public boolean isInvoice() {
return isInvoice;
} public void setInvoice(boolean invoice) {
isInvoice = invoice;
} @Basic
@Column(name = "lock_expire", nullable = true)
public Timestamp getLockExpire() {
return lockExpire;
} public void setLockExpire(Timestamp lockExpire) {
this.lockExpire = lockExpire;
} @Basic
@Column(name = "memo", nullable = true, length = 255)
public String getMemo() {
return memo;
} public void setMemo(String memo) {
this.memo = memo;
} @Basic
@Column(name = "name", nullable = false, length = 500)
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Basic
@Column(name = "offset_amount", nullable = false, precision = 6)
public BigDecimal getOffsetAmount() {
return offsetAmount;
} public void setOffsetAmount(BigDecimal offsetAmount) {
this.offsetAmount = offsetAmount;
} @Basic
@Column(name = "order_status", nullable = false)
public int getOrderStatus() {
return orderStatus;
} public void setOrderStatus(int orderStatus) {
this.orderStatus = orderStatus;
} @Basic
@Column(name = "payment_method_name", nullable = true, length = 255)
public String getPaymentMethodName() {
return paymentMethodName;
} public void setPaymentMethodName(String paymentMethodName) {
this.paymentMethodName = paymentMethodName;
} @Basic
@Column(name = "payment_status", nullable = false)
public int getPaymentStatus() {
return paymentStatus;
} public void setPaymentStatus(int paymentStatus) {
this.paymentStatus = paymentStatus;
} @Basic
@Column(name = "phone", nullable = false, length = 255)
public String getPhone() {
return phone;
} public void setPhone(String phone) {
this.phone = phone;
} @Basic
@Column(name = "promotion_discount", nullable = false, precision = 6)
public BigDecimal getPromotionDiscount() {
return promotionDiscount;
} public void setPromotionDiscount(BigDecimal promotionDiscount) {
this.promotionDiscount = promotionDiscount;
} @Basic
@Column(name = "promotion_name", nullable = true, length = 255)
public String getPromotionName() {
return promotionName;
} public void setPromotionName(String promotionName) {
this.promotionName = promotionName;
} @Basic
@Column(name = "reward_point", nullable = false, precision = 0)
public int getRewardPoint() {
return rewardPoint;
} public void setRewardPoint(int rewardPoint) {
this.rewardPoint = rewardPoint;
} @Basic
@Column(name = "shipping_method_name", nullable = true, length = 255)
public String getShippingMethodName() {
return shippingMethodName;
} public void setShippingMethodName(String shippingMethodName) {
this.shippingMethodName = shippingMethodName;
} @Basic
@Column(name = "shipping_status", nullable = false)
public int getShippingStatus() {
return shippingStatus;
} public void setShippingStatus(int shippingStatus) {
this.shippingStatus = shippingStatus;
} @Basic
@Column(name = "sn", nullable = false, length = 100)
public String getSn() {
return sn;
} public void setSn(String sn) {
this.sn = sn;
} @Basic
@Column(name = "tax", nullable = false, precision = 6)
public BigDecimal getTax() {
return tax;
} public void setTax(BigDecimal tax) {
this.tax = tax;
} @Basic
@Column(name = "type", nullable = false)
public int getType() {
return type;
} public void setType(int type) {
this.type = type;
} @Basic
@Column(name = "zip_code", nullable = false, length = 255)
public String getZipCode() {
return zipCode;
} public void setZipCode(String zipCode) {
this.zipCode = zipCode;
} @Basic
@Column(name = "memberorderno", nullable = true, length = 255)
public String getMemberorderno() {
return memberorderno;
} public void setMemberorderno(String memberorderno) {
this.memberorderno = memberorderno;
} @Basic
@Column(name = "ordertype", nullable = true)
public Integer getOrdertype() {
return ordertype;
} public void setOrdertype(Integer ordertype) {
this.ordertype = ordertype;
} @Basic
@Column(name = "distributeState", nullable = true)
public Boolean getDistributeState() {
return distributeState;
} public void setDistributeState(Boolean distributeState) {
this.distributeState = distributeState;
} @Basic
@Column(name = "ctime", nullable = true)
public Timestamp getCtime() {
return ctime;
} public void setCtime(Timestamp ctime) {
this.ctime = ctime;
} @Basic
@Column(name = "guid", nullable = true, length = 255)
public String getGuid() {
return guid;
} public void setGuid(String guid) {
this.guid = guid;
} @Basic
@Column(name = "cbqrr", nullable = true, length = 255)
public String getCbqrr() {
return cbqrr;
} public void setCbqrr(String cbqrr) {
this.cbqrr = cbqrr;
} @Basic
@Column(name = "cbqr_time", nullable = true)
public Timestamp getCbqrTime() {
return cbqrTime;
} public void setCbqrTime(Timestamp cbqrTime) {
this.cbqrTime = cbqrTime;
} @Basic
@Column(name = "is_cbqr", nullable = true)
public Boolean getCbqr() {
return isCbqr;
} public void setCbqr(Boolean cbqr) {
isCbqr = cbqr;
} @Basic
@Column(name = "is_srqr", nullable = true)
public Boolean getSrqr() {
return isSrqr;
} public void setSrqr(Boolean srqr) {
isSrqr = srqr;
} @Basic
@Column(name = "srqrr", nullable = true, length = 255)
public String getSrqrr() {
return srqrr;
} public void setSrqrr(String srqrr) {
this.srqrr = srqrr;
} @Basic
@Column(name = "srqr_time", nullable = true)
public Timestamp getSrqrTime() {
return srqrTime;
} public void setSrqrTime(Timestamp srqrTime) {
this.srqrTime = srqrTime;
} @Basic
@Column(name = "is_show", nullable = true, length = 255)
public String getIsShow() {
return isShow;
} public void setIsShow(String isShow) {
this.isShow = isShow;
} @Basic
@Column(name = "is_hunantb", nullable = true)
public Boolean getHunantb() {
return isHunantb;
} public void setHunantb(Boolean hunantb) {
isHunantb = hunantb;
} @Basic
@Column(name = "by_credit_card", nullable = true)
public Boolean getByCreditCard() {
return byCreditCard;
} public void setByCreditCard(Boolean byCreditCard) {
this.byCreditCard = byCreditCard;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; XxOrder xxOrder = (XxOrder) o; if (id != xxOrder.id) return false;
if (exchangePoint != xxOrder.exchangePoint) return false;
if (isAllocatedStock != xxOrder.isAllocatedStock) return false;
if (isInvoice != xxOrder.isInvoice) return false;
if (orderStatus != xxOrder.orderStatus) return false;
if (paymentStatus != xxOrder.paymentStatus) return false;
if (rewardPoint != xxOrder.rewardPoint) return false;
if (shippingStatus != xxOrder.shippingStatus) return false;
if (type != xxOrder.type) return false;
if (createDate != null ? !createDate.equals(xxOrder.createDate) : xxOrder.createDate != null) return false;
if (modifyDate != null ? !modifyDate.equals(xxOrder.modifyDate) : xxOrder.modifyDate != null) return false;
if (address != null ? !address.equals(xxOrder.address) : xxOrder.address != null) return false;
if (amountPaid != null ? !amountPaid.equals(xxOrder.amountPaid) : xxOrder.amountPaid != null) return false;
if (areaName != null ? !areaName.equals(xxOrder.areaName) : xxOrder.areaName != null) return false;
if (consignee != null ? !consignee.equals(xxOrder.consignee) : xxOrder.consignee != null) return false;
if (couponDiscount != null ? !couponDiscount.equals(xxOrder.couponDiscount) : xxOrder.couponDiscount != null)
return false;
if (expire != null ? !expire.equals(xxOrder.expire) : xxOrder.expire != null) return false;
if (fee != null ? !fee.equals(xxOrder.fee) : xxOrder.fee != null) return false;
if (freight != null ? !freight.equals(xxOrder.freight) : xxOrder.freight != null) return false;
if (invoiceTitle != null ? !invoiceTitle.equals(xxOrder.invoiceTitle) : xxOrder.invoiceTitle != null)
return false;
if (lockExpire != null ? !lockExpire.equals(xxOrder.lockExpire) : xxOrder.lockExpire != null) return false;
if (memo != null ? !memo.equals(xxOrder.memo) : xxOrder.memo != null) return false;
if (name != null ? !name.equals(xxOrder.name) : xxOrder.name != null) return false;
if (offsetAmount != null ? !offsetAmount.equals(xxOrder.offsetAmount) : xxOrder.offsetAmount != null)
return false;
if (paymentMethodName != null ? !paymentMethodName.equals(xxOrder.paymentMethodName) : xxOrder.paymentMethodName != null)
return false;
if (phone != null ? !phone.equals(xxOrder.phone) : xxOrder.phone != null) return false;
if (promotionDiscount != null ? !promotionDiscount.equals(xxOrder.promotionDiscount) : xxOrder.promotionDiscount != null)
return false;
if (promotionName != null ? !promotionName.equals(xxOrder.promotionName) : xxOrder.promotionName != null)
return false;
if (shippingMethodName != null ? !shippingMethodName.equals(xxOrder.shippingMethodName) : xxOrder.shippingMethodName != null)
return false;
if (sn != null ? !sn.equals(xxOrder.sn) : xxOrder.sn != null) return false;
if (tax != null ? !tax.equals(xxOrder.tax) : xxOrder.tax != null) return false;
if (zipCode != null ? !zipCode.equals(xxOrder.zipCode) : xxOrder.zipCode != null) return false;
if (memberorderno != null ? !memberorderno.equals(xxOrder.memberorderno) : xxOrder.memberorderno != null)
return false;
if (ordertype != null ? !ordertype.equals(xxOrder.ordertype) : xxOrder.ordertype != null) return false;
if (distributeState != null ? !distributeState.equals(xxOrder.distributeState) : xxOrder.distributeState != null)
return false;
if (ctime != null ? !ctime.equals(xxOrder.ctime) : xxOrder.ctime != null) return false;
if (guid != null ? !guid.equals(xxOrder.guid) : xxOrder.guid != null) return false;
if (cbqrr != null ? !cbqrr.equals(xxOrder.cbqrr) : xxOrder.cbqrr != null) return false;
if (cbqrTime != null ? !cbqrTime.equals(xxOrder.cbqrTime) : xxOrder.cbqrTime != null) return false;
if (isCbqr != null ? !isCbqr.equals(xxOrder.isCbqr) : xxOrder.isCbqr != null) return false;
if (isSrqr != null ? !isSrqr.equals(xxOrder.isSrqr) : xxOrder.isSrqr != null) return false;
if (srqrr != null ? !srqrr.equals(xxOrder.srqrr) : xxOrder.srqrr != null) return false;
if (srqrTime != null ? !srqrTime.equals(xxOrder.srqrTime) : xxOrder.srqrTime != null) return false;
if (isShow != null ? !isShow.equals(xxOrder.isShow) : xxOrder.isShow != null) return false;
if (isHunantb != null ? !isHunantb.equals(xxOrder.isHunantb) : xxOrder.isHunantb != null) return false;
if (byCreditCard != null ? !byCreditCard.equals(xxOrder.byCreditCard) : xxOrder.byCreditCard != null)
return false; return true;
} @Override
public int hashCode() {
int result = id;
result = 31 * result + (createDate != null ? createDate.hashCode() : 0);
result = 31 * result + (modifyDate != null ? modifyDate.hashCode() : 0);
result = 31 * result + (address != null ? address.hashCode() : 0);
result = 31 * result + (amountPaid != null ? amountPaid.hashCode() : 0);
result = 31 * result + (areaName != null ? areaName.hashCode() : 0);
result = 31 * result + (consignee != null ? consignee.hashCode() : 0);
result = 31 * result + (couponDiscount != null ? couponDiscount.hashCode() : 0);
result = 31 * result + exchangePoint;
result = 31 * result + (expire != null ? expire.hashCode() : 0);
result = 31 * result + (fee != null ? fee.hashCode() : 0);
result = 31 * result + (freight != null ? freight.hashCode() : 0);
result = 31 * result + (invoiceTitle != null ? invoiceTitle.hashCode() : 0);
result = 31 * result + (isAllocatedStock ? 1 : 0);
result = 31 * result + (isInvoice ? 1 : 0);
result = 31 * result + (lockExpire != null ? lockExpire.hashCode() : 0);
result = 31 * result + (memo != null ? memo.hashCode() : 0);
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (offsetAmount != null ? offsetAmount.hashCode() : 0);
result = 31 * result + orderStatus;
result = 31 * result + (paymentMethodName != null ? paymentMethodName.hashCode() : 0);
result = 31 * result + paymentStatus;
result = 31 * result + (phone != null ? phone.hashCode() : 0);
result = 31 * result + (promotionDiscount != null ? promotionDiscount.hashCode() : 0);
result = 31 * result + (promotionName != null ? promotionName.hashCode() : 0);
result = 31 * result + rewardPoint;
result = 31 * result + (shippingMethodName != null ? shippingMethodName.hashCode() : 0);
result = 31 * result + shippingStatus;
result = 31 * result + (sn != null ? sn.hashCode() : 0);
result = 31 * result + (tax != null ? tax.hashCode() : 0);
result = 31 * result + type;
result = 31 * result + (zipCode != null ? zipCode.hashCode() : 0);
result = 31 * result + (memberorderno != null ? memberorderno.hashCode() : 0);
result = 31 * result + (ordertype != null ? ordertype.hashCode() : 0);
result = 31 * result + (distributeState != null ? distributeState.hashCode() : 0);
result = 31 * result + (ctime != null ? ctime.hashCode() : 0);
result = 31 * result + (guid != null ? guid.hashCode() : 0);
result = 31 * result + (cbqrr != null ? cbqrr.hashCode() : 0);
result = 31 * result + (cbqrTime != null ? cbqrTime.hashCode() : 0);
result = 31 * result + (isCbqr != null ? isCbqr.hashCode() : 0);
result = 31 * result + (isSrqr != null ? isSrqr.hashCode() : 0);
result = 31 * result + (srqrr != null ? srqrr.hashCode() : 0);
result = 31 * result + (srqrTime != null ? srqrTime.hashCode() : 0);
result = 31 * result + (isShow != null ? isShow.hashCode() : 0);
result = 31 * result + (isHunantb != null ? isHunantb.hashCode() : 0);
result = 31 * result + (byCreditCard != null ? byCreditCard.hashCode() : 0);
return result;
} @ManyToOne
@JoinColumn(name = "member", referencedColumnName = "id", nullable = false)
public XxMember getXxMemberByMember() {
return xxMemberByMember;
} public void setXxMemberByMember(XxMember xxMemberByMember) {
this.xxMemberByMember = xxMemberByMember;
} @ManyToOne
@JoinColumn(name = "operator", referencedColumnName = "id")
public XxAdmin getXxAdminByOperator() {
return xxAdminByOperator;
} public void setXxAdminByOperator(XxAdmin xxAdminByOperator) {
this.xxAdminByOperator = xxAdminByOperator;
} @ManyToOne
@JoinColumn(name = "admin", referencedColumnName = "id")
public XxAdmin getXxAdminByAdmin() {
return xxAdminByAdmin;
} public void setXxAdminByAdmin(XxAdmin xxAdminByAdmin) {
this.xxAdminByAdmin = xxAdminByAdmin;
} }

OrderRepository.java

package com.agen.myagen.repository;

import com.agen.myagen.entity.XxAdmin;
import com.agen.myagen.entity.XxOrder;
import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface OrderRepository extends JpaRepository<XxOrder,Integer> { List<XxOrder> findTop10ByXxAdminByOperator(XxAdmin xxAdminByOperator); @Override
XxOrder findOne(Integer integer);
}

Member.java

package com.agen.orderdiscount.entity;

import lombok.*;
import lombok.experimental.Accessors; import org.hibernate.annotations.GenericGenerator; import javax.persistence.*; @Data(staticConstructor = "of")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" )
public class Member { @Id
@GeneratedValue(generator = "uuid2")
private String memberId; @Column(nullable = false)
@NonNull
private Integer memberGrade; @Column(nullable = false)
@NonNull
private String orderSn;
}

MemberRepositpry.java

package com.agen.orderdiscount.repository;

import com.agen.orderdiscount.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface MemberRepository extends JpaRepository<Member,String>{
@Override
Member save(Member member); List<Member> findByMemberGrade(Integer memberGrade);
}

1.我这里myagen数据源下数据库中表早已存在,是根据hibernate反转工具生成的几个需要的类

【hibernate反转工具怎么使用】

idea下的实体生成反转工具:http://www.cnblogs.com/sxdcgaq8080/p/7978334.html

myecplise下的实体生成反转工具:http://www.cnblogs.com/sxdcgaq8080/p/5593591.html

2.和数据库打交道的持久化框架是spring boot自带的spring-data-jpa。

【spring-data-jpa怎么使用】

入门使用:http://www.cnblogs.com/sxdcgaq8080/p/7890571.html

复杂使用:http://www.cnblogs.com/sxdcgaq8080/p/7894828.html

3.Member实体中使用了lombok,一个java的一个奇技淫巧

lombok的详解和使用:http://www.cnblogs.com/sxdcgaq8080/p/7884477.html

4.关于Member.java实体,因为这个对应的是orderdiscount数据源,也就是主数据源,是mysql这边的,是先写了实体之后,自动根据第三步中设置在map中的

hibernate.physical_naming_strategy

,所以生成的数据表中的字段,应该是不带下划线的。

关于hibernate的命名规则,设置参考:http://www.cnblogs.com/sxdcgaq8080/p/7910474.html

=========================================================================================================================================

 5》最后再controller层,依次调用各种数据源对应的各个包下的各种repository操作进行操作

这一层,什么也不用多说了

MainController.java

package com.agen.controller;

import com.agen.myagen.entity.XxAdmin;
import com.agen.myagen.entity.XxOrder;
import com.agen.myagen.repository.OrderRepository;
import com.agen.orderdiscount.entity.Member;
import com.agen.orderdiscount.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import java.util.List;
import java.util.Objects;
import java.util.UUID; @Controller
public class MainController { @Autowired
private OrderRepository orderRepository;
@Autowired
private MemberRepository memberRepository; @RequestMapping("lo")
public void getOrder(){
XxOrder xxOrder = orderRepository.findOne(1510);
System.out.println("sql server数据库查到order编号:"+xxOrder.getSn());
Member member = new Member();
member.setMemberId(UUID.randomUUID().toString());
member.setMemberGrade(2);
member.setOrderSn(xxOrder.getSn()); Member member1 = memberRepository.save(member);
if(Objects.nonNull(member1)){
System.out.println("mysql数据库插入member成功"); List<Member> list = memberRepository.findByMemberGrade(2);
if(Objects.nonNull(list) && list.size() > 0){
list.forEach(i->{
System.out.println("mysql数据库查出order编号:"+i.getOrderSn());
});
}
} }
}

然后启动,启动可以看到下面这些信息:

最后,访问一下这个地址:

可以看到和多数据源交互的 SQL语句打印出来:

======================================================================================================

好了 ,终于完成了!!!!

【spring boot】12.spring boot对多种不同类型数据库,多数据源配置使用的更多相关文章

  1. spring学习12 -Spring 框架模块以及面试常见问题注解等

    以下为spring常见面试问题: 1.Spring 框架中都用到了哪些设计模式? Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的: 代理模式—在AOP和remoting中被用的比较 ...

  2. Spring Boot从入门到精通(五)多数据源配置实现及源码分析

    多数据源配置在项目软件中是比较常见的开发需求,Spring和Spring Boot中对此都有相应的解决方案可供大家参考.在Spring Boot中,如MyBatis.JdbcTemplate以及Jpa ...

  3. (七)spring+druid多数据源配置

    druid多数据源配置 一.druid简介 Druid首先是一个数据库连接池,但它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. ...

  4. Spring 多数据源配置(转)

    转载自:https://www.cnblogs.com/digdeep/p/4512368.html 同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据 ...

  5. spring boot(12)-数据源配置原理

    本篇讲的不仅是数据源配置,这也是spring boot实现自动配置的一部分.要理解数据源的配置原理,首先要理解第十篇tomcat连接池的配置 数据源配置源码 这里截取org.springframewo ...

  6. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  7. Spring boot 基于Spring MVC的Web应用和REST服务开发

    Spring Boot利用JavaConfig配置模式以及"约定优于配置"理念,极大简化了基于Spring MVC的Web应用和REST服务开发. Servlet: package ...

  8. 一键式Spring集成工具 Spring Boot

    最近公司使用Spring boot进行开发,稍微了解一下,不过自我感觉把集中式配置applicate.properties搞明白,注解用过Spring MVC的boot绝对没问题的 比如拦截器:@As ...

  9. 一:Spring Boot、Spring Cloud

    上次写了一篇文章叫Spring Cloud在国内中小型公司能用起来吗?介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇.其实我们在这条路上已经走了一年多,从16年初到现在. ...

随机推荐

  1. SSH进阶之路

    [SSH进阶之路]Hibernate基本原理(一)       在开始学Hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低 ...

  2. Asp.net自定义控件开发任我行(5)-嵌入资源上

    摘要 上一篇我们讲了VitwState保存控件状态,此章我们来讲讲嵌入css文件,js文件,嵌入Image文件我也一笔带过. 内容 随着我的控件的完善,我们目标控件DropDwonCheckList最 ...

  3. Win 10激活

    Win10专业版激活(亲测有效) 来源:http://jingyan.baidu.com/article/295430f1ce2e880c7e0050ff.html 1.首先,我们先查看一下Win10 ...

  4. fastjosn在低版本丢字段问题

    简单的说: 对于java bean中有字段类似pId这种写法,特征是第一个字母小写,第二个字母大写,在eclipse中生成的getter setter方法是 getpId, setpId. 在低版本的 ...

  5. IE hasLayout详解

    hasLayout定义 haslayout 是Windows Internet Explorer渲染引擎的一个内部组成部分.在Internet Explorer中,一个元素要么自己对自身的内容进行计算 ...

  6. php获取当前操作系统类型

    如何使用 php 获取当前操作系统类型呢? 严格来说这里分两种情况,一种情况是获取 服务器端 的操作系统类型,一种是获取 客户端 的操作系统类型. 下面将对如何使用php获取这两种情况下的操作系统类型 ...

  7. mybatis maven 代码生成器(mysql)

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  8. Weixin API -- 微信js接口

    今天在开发项目的时候,由于需要在微信中实现分享功能(分享成功后实现页面跳转并记录).问度娘,找了很久,终于找到一个不错的方法.收藏起来以后备用,也希望对大家有所帮助! 在github的地址:https ...

  9. jQuery操作DOM基础 - 创建节点

    案例:创建两个<li>元素节点,并且作为<ul>元素节点的子节点,添加到DOM树中 <!DOCTYPE html> <html lang="en&q ...

  10. Python之数据结构:元组

    一.元组 tupleA=(1,2,3,4,5,6) print tupleA 1.元组支持的运算符 tup1+tup2 tup1*2 3 in tup2 for i in tup2: print i ...