【spring boot】12.spring boot对多种不同类型数据库,多数据源配置使用
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语句打印出来:
======================================================================================================
好了 ,终于完成了!!!!