ToB企服应用市场:ToB评测及商务社交产业平台

标题: quarkus数据库篇之三:单应用同时操作多个数据库 [打印本页]

作者: 天空闲话    时间: 2023-8-29 09:16
标题: quarkus数据库篇之三:单应用同时操作多个数据库
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览


限制

准备工作

  1. # 建数据库
  2. CREATE DATABASE first_db;
  3. # 选中数据库
  4. use first_db;
  5. # 建表
  6. CREATE TABLE IF NOT EXISTS `seller`(
  7.     `id` INT UNSIGNED AUTO_INCREMENT,
  8.     `name` VARCHAR(100) NOT NULL,
  9.     `product_num` INT NULL,
  10.     PRIMARY KEY ( `id` )
  11. )ENGINE=InnoDB DEFAULT CHARSET=utf8;
  12. # 新增三条记录
  13. insert into seller (name, product_num) values ('seller1', 1111);
  14. insert into seller (name, product_num) values ('seller2', 2222);
  15. insert into seller (name, product_num) values ('seller3', 3333);
复制代码
  1. # 建数据库
  2. CREATE DATABASE second_db;
  3. # 建表
  4. CREATE TABLE buyer(
  5.    id SERIAL PRIMARY KEY,
  6.    name VARCHAR NOT NULL,
  7.    order_num int NOT NULL
  8. );
  9. # 新增两条记录
  10. insert into buyer (name, order_num) values ('buyer1', 100);
  11. insert into buyer (name, order_num) values ('buyer2', 200);
复制代码
开发-创建子工程

  1.     <dependencies>
  2.         <dependency>
  3.             <groupId>io.quarkus</groupId>
  4.             <artifactId>quarkus-arc</artifactId>
  5.         </dependency>
  6.         
  7.         <dependency>
  8.             <groupId>io.quarkus</groupId>
  9.             <artifactId>quarkus-agroal</artifactId>
  10.         </dependency>
  11.         
  12.         <dependency>
  13.             <groupId>io.quarkus</groupId>
  14.             <artifactId>quarkus-hibernate-orm</artifactId>
  15.         </dependency>
  16.         
  17.         <dependency>
  18.             <groupId>io.quarkus</groupId>
  19.             <artifactId>quarkus-jdbc-postgresql</artifactId>
  20.         </dependency>
  21.         
  22.         <dependency>
  23.             <groupId>io.quarkus</groupId>
  24.             <artifactId>quarkus-jdbc-mysql</artifactId>
  25.         </dependency>
  26.         
  27.         <dependency>
  28.             <groupId>io.quarkus</groupId>
  29.             <artifactId>quarkus-junit5</artifactId>
  30.             <scope>test</scope>
  31.         </dependency>
  32.         <dependency>
  33.             <groupId>io.rest-assured</groupId>
  34.             <artifactId>rest-assured</artifactId>
  35.             <scope>test</scope>
  36.         </dependency>
  37.     </dependencies>
复制代码
开发-配置文件


  1. # first-db的配置,下面五个配置项在application.properties文件中
  2. quarkus.hibernate-orm.log.sql=true
  3. quarkus.datasource.db-kind=mysql
  4. quarkus.datasource.jdbc.max-size=8
  5. quarkus.datasource.jdbc.min-size=2
  6. quarkus.hibernate-orm.packages=com.bolingcavalry.multidb.entity.firstdb
  7. # first-db的配置,下面三个配置项在application-test.properties文件中,即test环境下fitst-db的数据库地址、账号、密码等信息
  8. quarkus.datasource.username=root
  9. quarkus.datasource.password=123456
  10. quarkus.datasource.jdbc.url=jdbc:mysql://192.168.50.43:3306/first_db
复制代码

  1. # second_db的配置,下面五个配置项在application.properties文件中
  2. quarkus.hibernate-orm.second_db.log.sql=true
  3. quarkus.datasource.second_db.db-kind=postgresql
  4. quarkus.datasource.second_db.jdbc.max-size=8
  5. quarkus.datasource.second_db.jdbc.min-size=2
  6. quarkus.hibernate-orm.second_db.datasource=second_db
  7. quarkus.hibernate-orm.second_db.packages=com.bolingcavalry.multidb.entity.seconddb
  8. # second_db的配置,下面三个配置项在application-test.properties文件中,即test环境下second_db的数据库地址、账号、密码等信息
  9. quarkus.datasource.second_db.username=quarkus
  10. quarkus.datasource.second_db.password=123456
  11. quarkus.datasource.second_db.jdbc.url=jdbc:postgresql://192.168.50.43:15432/second_db
复制代码
开发-编码

  1. package com.bolingcavalry.multidb.entity.firstdb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "seller")
  5. @NamedQuery(name = "Seller.findAll", query = "SELECT f FROM Seller f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  6. @Cacheable
  7. public class Seller {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Integer id;
  11.     @Column
  12.     private String name;
  13.     @Column(name = "product_num")
  14.     private int productNum;
  15.     public Integer getId() {
  16.         return id;
  17.     }
  18.     public void setId(Integer id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getProductNum() {
  28.         return productNum;
  29.     }
  30.     public void setProductNum(int productNum) {
  31.         this.productNum = productNum;
  32.     }
  33. }
复制代码
  1. package com.bolingcavalry.multidb.entity.seconddb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "buyer")
  5. @NamedQuery(name = "Buyer.findAll", query = "SELECT f FROM Buyer f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  6. @Cacheable
  7. public class Buyer {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Integer id;
  11.     @Column
  12.     private String name;
  13.     @Column(name = "order_num")
  14.     private int orderNum;
  15.     public Integer getId() {
  16.         return id;
  17.     }
  18.     public void setId(Integer id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getOrderNum() {
  28.         return orderNum;
  29.     }
  30.     public void setOrderNum(int orderNum) {
  31.         this.orderNum = orderNum;
  32.     }
  33. }
复制代码
  1. @ApplicationScoped
  2. public class SellerService {
  3.     @Inject
  4.     EntityManager entityManager;
  5.     public List<Seller> get() {
  6.         return entityManager.createNamedQuery("Seller.findAll", Seller.class)
  7.                 .getResultList();
  8.     }
  9.     public Seller getSingle(Integer id) {
  10.         return entityManager.find(Seller.class, id);
  11.     }
  12.     @Transactional
  13.     public void create(Seller seller) {
  14.         entityManager.persist(seller);
  15.     }
  16.     @Transactional
  17.     public void update(Integer id, Seller seller) {
  18.         Seller entity = entityManager.find(Seller.class, id);
  19.         if (null!=entity) {
  20.             entity.setName(seller.getName());
  21.         }
  22.     }
  23.     @Transactional
  24.     public void delete(Integer id) {
  25.         Seller entity = entityManager.getReference(Seller.class, id);
  26.         if (null!=entity) {
  27.             entityManager.remove(entity);
  28.         }
  29.     }
  30. }
复制代码
  1. package com.bolingcavalry.multidb.service;
  2. import com.bolingcavalry.multidb.entity.seconddb.Buyer;
  3. import io.quarkus.hibernate.orm.PersistenceUnit;
  4. import javax.enterprise.context.ApplicationScoped;
  5. import javax.inject.Inject;
  6. import javax.persistence.EntityManager;
  7. import javax.transaction.Transactional;
  8. import java.util.List;
  9. @ApplicationScoped
  10. public class BuyerService {
  11.     @Inject
  12.     @PersistenceUnit("second_db")
  13.     EntityManager entityManager;
  14.     public List<Buyer> get() {
  15.         return entityManager.createNamedQuery("Buyer.findAll", Buyer.class)
  16.                 .getResultList();
  17.     }
  18.     public Buyer getSingle(Integer id) {
  19.         return entityManager.find(Buyer.class, id);
  20.     }
  21.     @Transactional
  22.     public void create(Buyer buyer) {
  23.         entityManager.persist(buyer);
  24.     }
  25.     @Transactional
  26.     public void update(Integer id, Buyer buyer) {
  27.         Buyer entity = entityManager.find(Buyer.class, id);
  28.         if (null!=entity) {
  29.             entity.setName(buyer.getName());
  30.         }
  31.     }
  32.     @Transactional
  33.     public void delete(Integer id) {
  34.         Buyer entity = entityManager.getReference(Buyer.class, id);
  35.         if (null!=entity) {
  36.             entityManager.remove(entity);
  37.         }
  38.     }
  39. }
复制代码
开发-单元测试

  1. @QuarkusTest
  2. @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  3. public class MultiDBTest {
  4.     /**
  5.      * first_db的seller表中,初始记录数
  6.      */
  7.     private static final int FIRST_DB_EXIST_RECORDS_SIZE = 3;
  8.     /**
  9.      * second_db的buyer表中,初始记录数
  10.      */
  11.     private static final int SECOND_DB_EXIST_RECORDS_SIZE = 2;
  12.     /**
  13.      * import.sql中,第一条记录的id
  14.      */
  15.     private static final int EXIST_FIRST_ID = 1;
  16.     /**
  17.      * 在Fruit.java中,id字段的SequenceGenerator指定了initialValue等于10,
  18.      * 表示自增ID从10开始
  19.      */
  20.     private static final int ID_SEQUENCE_INIT_VALUE = 10;
  21.     @Inject
  22.     SellerService sellerService;
  23.     @Inject
  24.     BuyerService buyerService;
  25.     @Test
  26.     @DisplayName("list")
  27.     @Order(1)
  28.     public void testGet() {
  29.         List<Seller> sellerList = sellerService.get();
  30.         // 判定非空
  31.         Assertions.assertNotNull(sellerList);
  32.         // seller表初始化时新增了3条记录
  33.         Assertions.assertEquals(FIRST_DB_EXIST_RECORDS_SIZE, sellerList.size());
  34.         List<Buyer> buyerList = buyerService.get();
  35.         // 判定非空
  36.         Assertions.assertNotNull(buyerList);
  37.         // buyer表初始化时新增了2条记录
  38.         Assertions.assertEquals(SECOND_DB_EXIST_RECORDS_SIZE, buyerList.size());
  39.     }
  40.     @Test
  41.     @DisplayName("getSingle")
  42.     @Order(2)
  43.     public void testGetSingle() {
  44.         // 用第二条记录吧,第一条在执行testUpdate方法时被更改了
  45.         Seller seller = sellerService.getSingle(EXIST_FIRST_ID+1);
  46.         // 判定非空
  47.         Assertions.assertNotNull(seller);
  48.         // buyer表的第一条记录
  49.         Assertions.assertEquals("seller2", seller.getName());
  50.         // 用第二条记录吧,第一条在执行testUpdate方法时被更改了
  51.         Buyer buyer = buyerService.getSingle(EXIST_FIRST_ID+1);
  52.         // 判定非空
  53.         Assertions.assertNotNull(buyer);
  54.         // buyer表的第二条记录
  55.         Assertions.assertEquals("buyer2", buyer.getName());
  56.     }
  57.     @Test
  58.     @DisplayName("update")
  59.     @Order(3)
  60.     public void testUpdate() {
  61.         // 验证first_db的操作
  62.         String newName = LocalDateTime.now().toString();
  63.         Seller seller = new Seller();
  64.         seller.setName(newName);
  65.         // 更新数据库
  66.         sellerService.update(EXIST_FIRST_ID, seller);
  67.         Seller sellerFromDB = sellerService.getSingle(EXIST_FIRST_ID);
  68.         // 从数据库取出的对象,其名称应该等于修改的名称
  69.         Assertions.assertEquals(newName, sellerFromDB.getName());
  70.         // 验证second_db的操作
  71.         Buyer buyer = new Buyer();
  72.         buyer.setName(newName);
  73.         // 更新数据库
  74.         buyerService.update(EXIST_FIRST_ID, buyer);
  75.         Buyer buyerFromDB = buyerService.getSingle(EXIST_FIRST_ID);
  76.         // 从数据库取出的对象,其名称应该等于修改的名称
  77.         Assertions.assertEquals(newName, buyerFromDB.getName());
  78.     }
  79.     @Test
  80.     @DisplayName("create")
  81.     @Order(3)
  82.     public void testCreate() {
  83.         Seller seller = new Seller();
  84.         seller.setName("seller4");
  85.         sellerService.create(seller);
  86.         // 创建成功后,记录主键肯定是大于3的
  87.         Assertions.assertTrue(seller.getId()>FIRST_DB_EXIST_RECORDS_SIZE);
  88.         // 记录总数应该等于已有记录数+1
  89.         Assertions.assertEquals(FIRST_DB_EXIST_RECORDS_SIZE+1, sellerService.get().size());
  90.         Buyer buyer = new Buyer();
  91.         buyer.setName("buyer3");
  92.         buyerService.create(buyer);
  93.         // 创建成功后,记录主键肯定是大于3的
  94.         Assertions.assertTrue(buyer.getId()>SECOND_DB_EXIST_RECORDS_SIZE);
  95.         // 记录总数应该等于已有记录数+1
  96.         Assertions.assertEquals(SECOND_DB_EXIST_RECORDS_SIZE+1, buyerService.get().size());
  97.     }
  98.     @Test
  99.     @DisplayName("delete")
  100.     @Order(5)
  101.     public void testDelete() {
  102.         List<Seller> sellers = sellerService.get();
  103.         // 先记删除前的总数
  104.         int numBeforeDelete = sellers.size();
  105.         // 删除最后一条记录
  106.         sellerService.delete(sellers.get(numBeforeDelete-1).getId());
  107.         // 记录数应该应该等于删除前的数量减一
  108.         Assertions.assertEquals(numBeforeDelete-1, sellerService.get().size());
  109.         List<Buyer> buyers = buyerService.get();
  110.         // 先记删除前的总数
  111.         numBeforeDelete = buyers.size();
  112.         // 删除最后一条记录
  113.         buyerService.delete(buyers.get(numBeforeDelete-1).getId());
  114.         // 记录数应该应该等于删除前的数量减一
  115.         Assertions.assertEquals(numBeforeDelete-1, buyerService.get().size());
  116.     }
  117. }
复制代码
验证



源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
本篇概览


限制

准备工作

  1. # 建数据库
  2. CREATE DATABASE first_db;
  3. # 选中数据库
  4. use first_db;
  5. # 建表
  6. CREATE TABLE IF NOT EXISTS `seller`(
  7.     `id` INT UNSIGNED AUTO_INCREMENT,
  8.     `name` VARCHAR(100) NOT NULL,
  9.     `product_num` INT NULL,
  10.     PRIMARY KEY ( `id` )
  11. )ENGINE=InnoDB DEFAULT CHARSET=utf8;
  12. # 新增三条记录
  13. insert into seller (name, product_num) values ('seller1', 1111);
  14. insert into seller (name, product_num) values ('seller2', 2222);
  15. insert into seller (name, product_num) values ('seller3', 3333);
复制代码
  1. # 建数据库
  2. CREATE DATABASE second_db;
  3. # 建表
  4. CREATE TABLE buyer(
  5.    id SERIAL PRIMARY KEY,
  6.    name VARCHAR NOT NULL,
  7.    order_num int NOT NULL
  8. );
  9. # 新增两条记录
  10. insert into buyer (name, order_num) values ('buyer1', 100);
  11. insert into buyer (name, order_num) values ('buyer2', 200);
复制代码
开发-创建子工程

  1.     <dependencies>
  2.         <dependency>
  3.             <groupId>io.quarkus</groupId>
  4.             <artifactId>quarkus-arc</artifactId>
  5.         </dependency>
  6.         
  7.         <dependency>
  8.             <groupId>io.quarkus</groupId>
  9.             <artifactId>quarkus-agroal</artifactId>
  10.         </dependency>
  11.         
  12.         <dependency>
  13.             <groupId>io.quarkus</groupId>
  14.             <artifactId>quarkus-hibernate-orm</artifactId>
  15.         </dependency>
  16.         
  17.         <dependency>
  18.             <groupId>io.quarkus</groupId>
  19.             <artifactId>quarkus-jdbc-postgresql</artifactId>
  20.         </dependency>
  21.         
  22.         <dependency>
  23.             <groupId>io.quarkus</groupId>
  24.             <artifactId>quarkus-jdbc-mysql</artifactId>
  25.         </dependency>
  26.         
  27.         <dependency>
  28.             <groupId>io.quarkus</groupId>
  29.             <artifactId>quarkus-junit5</artifactId>
  30.             <scope>test</scope>
  31.         </dependency>
  32.         <dependency>
  33.             <groupId>io.rest-assured</groupId>
  34.             <artifactId>rest-assured</artifactId>
  35.             <scope>test</scope>
  36.         </dependency>
  37.     </dependencies>
复制代码
开发-配置文件


  1. # first-db的配置,下面五个配置项在application.properties文件中
  2. quarkus.hibernate-orm.log.sql=true
  3. quarkus.datasource.db-kind=mysql
  4. quarkus.datasource.jdbc.max-size=8
  5. quarkus.datasource.jdbc.min-size=2
  6. quarkus.hibernate-orm.packages=com.bolingcavalry.multidb.entity.firstdb
  7. # first-db的配置,下面三个配置项在application-test.properties文件中,即test环境下fitst-db的数据库地址、账号、密码等信息
  8. quarkus.datasource.username=root
  9. quarkus.datasource.password=123456
  10. quarkus.datasource.jdbc.url=jdbc:mysql://192.168.50.43:3306/first_db
复制代码

  1. # second_db的配置,下面五个配置项在application.properties文件中
  2. quarkus.hibernate-orm.second_db.log.sql=true
  3. quarkus.datasource.second_db.db-kind=postgresql
  4. quarkus.datasource.second_db.jdbc.max-size=8
  5. quarkus.datasource.second_db.jdbc.min-size=2
  6. quarkus.hibernate-orm.second_db.datasource=second_db
  7. quarkus.hibernate-orm.second_db.packages=com.bolingcavalry.multidb.entity.seconddb
  8. # second_db的配置,下面三个配置项在application-test.properties文件中,即test环境下second_db的数据库地址、账号、密码等信息
  9. quarkus.datasource.second_db.username=quarkus
  10. quarkus.datasource.second_db.password=123456
  11. quarkus.datasource.second_db.jdbc.url=jdbc:postgresql://192.168.50.43:15432/second_db
复制代码
开发:编码

  1. package com.bolingcavalry.multidb.entity.firstdb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "seller")
  5. @NamedQuery(name = "Seller.findAll", query = "SELECT f FROM Seller f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  6. @Cacheable
  7. public class Seller {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Integer id;
  11.     @Column
  12.     private String name;
  13.     @Column(name = "product_num")
  14.     private int productNum;
  15.     public Integer getId() {
  16.         return id;
  17.     }
  18.     public void setId(Integer id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getProductNum() {
  28.         return productNum;
  29.     }
  30.     public void setProductNum(int productNum) {
  31.         this.productNum = productNum;
  32.     }
  33. }
复制代码
  1. package com.bolingcavalry.multidb.entity.seconddb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "buyer")
  5. @NamedQuery(name = "Buyer.findAll", query = "SELECT f FROM Buyer f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  6. @Cacheable
  7. public class Buyer {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Integer id;
  11.     @Column
  12.     private String name;
  13.     @Column(name = "order_num")
  14.     private int orderNum;
  15.     public Integer getId() {
  16.         return id;
  17.     }
  18.     public void setId(Integer id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getOrderNum() {
  28.         return orderNum;
  29.     }
  30.     public void setOrderNum(int orderNum) {
  31.         this.orderNum = orderNum;
  32.     }
  33. }
复制代码
  1. @ApplicationScoped
  2. public class SellerService {
  3.     @Inject
  4.     EntityManager entityManager;
  5.     public List<Seller> get() {
  6.         return entityManager.createNamedQuery("Seller.findAll", Seller.class)
  7.                 .getResultList();
  8.     }
  9.     public Seller getSingle(Integer id) {
  10.         return entityManager.find(Seller.class, id);
  11.     }
  12.     @Transactional
  13.     public void create(Seller seller) {
  14.         entityManager.persist(seller);
  15.     }
  16.     @Transactional
  17.     public void update(Integer id, Seller seller) {
  18.         Seller entity = entityManager.find(Seller.class, id);
  19.         if (null!=entity) {
  20.             entity.setName(seller.getName());
  21.         }
  22.     }
  23.     @Transactional
  24.     public void delete(Integer id) {
  25.         Seller entity = entityManager.getReference(Seller.class, id);
  26.         if (null!=entity) {
  27.             entityManager.remove(entity);
  28.         }
  29.     }
  30. }
复制代码
  1. package com.bolingcavalry.multidb.service;
  2. import com.bolingcavalry.multidb.entity.seconddb.Buyer;
  3. import io.quarkus.hibernate.orm.PersistenceUnit;
  4. import javax.enterprise.context.ApplicationScoped;
  5. import javax.inject.Inject;
  6. import javax.persistence.EntityManager;
  7. import javax.transaction.Transactional;
  8. import java.util.List;
  9. @ApplicationScoped
  10. public class BuyerService {
  11.     @Inject
  12.     @PersistenceUnit("second_db")
  13.     EntityManager entityManager;
  14.     public List<Buyer> get() {
  15.         return entityManager.createNamedQuery("Buyer.findAll", Buyer.class)
  16.                 .getResultList();
  17.     }
  18.     public Buyer getSingle(Integer id) {
  19.         return entityManager.find(Buyer.class, id);
  20.     }
  21.     @Transactional
  22.     public void create(Buyer buyer) {
  23.         entityManager.persist(buyer);
  24.     }
  25.     @Transactional
  26.     public void update(Integer id, Buyer buyer) {
  27.         Buyer entity = entityManager.find(Buyer.class, id);
  28.         if (null!=entity) {
  29.             entity.setName(buyer.getName());
  30.         }
  31.     }
  32.     @Transactional
  33.     public void delete(Integer id) {
  34.         Buyer entity = entityManager.getReference(Buyer.class, id);
  35.         if (null!=entity) {
  36.             entityManager.remove(entity);
  37.         }
  38.     }
  39. }
复制代码
开发-单元测试

  1. @QuarkusTest
  2. @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  3. public class MultiDBTest {
  4.     /**
  5.      * first_db的seller表中,初始记录数
  6.      */
  7.     private static final int FIRST_DB_EXIST_RECORDS_SIZE = 3;
  8.     /**
  9.      * second_db的buyer表中,初始记录数
  10.      */
  11.     private static final int SECOND_DB_EXIST_RECORDS_SIZE = 2;
  12.     /**
  13.      * import.sql中,第一条记录的id
  14.      */
  15.     private static final int EXIST_FIRST_ID = 1;
  16.     /**
  17.      * 在Fruit.java中,id字段的SequenceGenerator指定了initialValue等于10,
  18.      * 表示自增ID从10开始
  19.      */
  20.     private static final int ID_SEQUENCE_INIT_VALUE = 10;
  21.     @Inject
  22.     SellerService sellerService;
  23.     @Inject
  24.     BuyerService buyerService;
  25.     @Test
  26.     @DisplayName("list")
  27.     @Order(1)
  28.     public void testGet() {
  29.         List<Seller> sellerList = sellerService.get();
  30.         // 判定非空
  31.         Assertions.assertNotNull(sellerList);
  32.         // seller表初始化时新增了3条记录
  33.         Assertions.assertEquals(FIRST_DB_EXIST_RECORDS_SIZE, sellerList.size());
  34.         List<Buyer> buyerList = buyerService.get();
  35.         // 判定非空
  36.         Assertions.assertNotNull(buyerList);
  37.         // buyer表初始化时新增了2条记录
  38.         Assertions.assertEquals(SECOND_DB_EXIST_RECORDS_SIZE, buyerList.size());
  39.     }
  40.     @Test
  41.     @DisplayName("getSingle")
  42.     @Order(2)
  43.     public void testGetSingle() {
  44.         // 用第二条记录吧,第一条在执行testUpdate方法时被更改了
  45.         Seller seller = sellerService.getSingle(EXIST_FIRST_ID+1);
  46.         // 判定非空
  47.         Assertions.assertNotNull(seller);
  48.         // buyer表的第一条记录
  49.         Assertions.assertEquals("seller2", seller.getName());
  50.         // 用第二条记录吧,第一条在执行testUpdate方法时被更改了
  51.         Buyer buyer = buyerService.getSingle(EXIST_FIRST_ID+1);
  52.         // 判定非空
  53.         Assertions.assertNotNull(buyer);
  54.         // buyer表的第二条记录
  55.         Assertions.assertEquals("buyer2", buyer.getName());
  56.     }
  57.     @Test
  58.     @DisplayName("update")
  59.     @Order(3)
  60.     public void testUpdate() {
  61.         // 验证first_db的操作
  62.         String newName = LocalDateTime.now().toString();
  63.         Seller seller = new Seller();
  64.         seller.setName(newName);
  65.         // 更新数据库
  66.         sellerService.update(EXIST_FIRST_ID, seller);
  67.         Seller sellerFromDB = sellerService.getSingle(EXIST_FIRST_ID);
  68.         // 从数据库取出的对象,其名称应该等于修改的名称
  69.         Assertions.assertEquals(newName, sellerFromDB.getName());
  70.         // 验证second_db的操作
  71.         Buyer buyer = new Buyer();
  72.         buyer.setName(newName);
  73.         // 更新数据库
  74.         buyerService.update(EXIST_FIRST_ID, buyer);
  75.         Buyer buyerFromDB = buyerService.getSingle(EXIST_FIRST_ID);
  76.         // 从数据库取出的对象,其名称应该等于修改的名称
  77.         Assertions.assertEquals(newName, buyerFromDB.getName());
  78.     }
  79.     @Test
  80.     @DisplayName("create")
  81.     @Order(3)
  82.     public void testCreate() {
  83.         Seller seller = new Seller();
  84.         seller.setName("seller4");
  85.         sellerService.create(seller);
  86.         // 创建成功后,记录主键肯定是大于3的
  87.         Assertions.assertTrue(seller.getId()>FIRST_DB_EXIST_RECORDS_SIZE);
  88.         // 记录总数应该等于已有记录数+1
  89.         Assertions.assertEquals(FIRST_DB_EXIST_RECORDS_SIZE+1, sellerService.get().size());
  90.         Buyer buyer = new Buyer();
  91.         buyer.setName("buyer3");
  92.         buyerService.create(buyer);
  93.         // 创建成功后,记录主键肯定是大于3的
  94.         Assertions.assertTrue(buyer.getId()>SECOND_DB_EXIST_RECORDS_SIZE);
  95.         // 记录总数应该等于已有记录数+1
  96.         Assertions.assertEquals(SECOND_DB_EXIST_RECORDS_SIZE+1, buyerService.get().size());
  97.     }
  98.     @Test
  99.     @DisplayName("delete")
  100.     @Order(5)
  101.     public void testDelete() {
  102.         List<Seller> sellers = sellerService.get();
  103.         // 先记删除前的总数
  104.         int numBeforeDelete = sellers.size();
  105.         // 删除最后一条记录
  106.         sellerService.delete(sellers.get(numBeforeDelete-1).getId());
  107.         // 记录数应该应该等于删除前的数量减一
  108.         Assertions.assertEquals(numBeforeDelete-1, sellerService.get().size());
  109.         List<Buyer> buyers = buyerService.get();
  110.         // 先记删除前的总数
  111.         numBeforeDelete = buyers.size();
  112.         // 删除最后一条记录
  113.         buyerService.delete(buyers.get(numBeforeDelete-1).getId());
  114.         // 记录数应该应该等于删除前的数量减一
  115.         Assertions.assertEquals(numBeforeDelete-1, buyerService.get().size());
  116.     }
  117. }
复制代码
验证



源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
本篇概览


限制

准备工作

  1. # 建数据库
  2. CREATE DATABASE first_db;
  3. # 选中数据库
  4. use first_db;
  5. # 建表
  6. CREATE TABLE IF NOT EXISTS `seller`(
  7.     `id` INT UNSIGNED AUTO_INCREMENT,
  8.     `name` VARCHAR(100) NOT NULL,
  9.     `product_num` INT NULL,
  10.     PRIMARY KEY ( `id` )
  11. )ENGINE=InnoDB DEFAULT CHARSET=utf8;
  12. # 新增三条记录
  13. insert into seller (name, product_num) values ('seller1', 1111);
  14. insert into seller (name, product_num) values ('seller2', 2222);
  15. insert into seller (name, product_num) values ('seller3', 3333);
复制代码
  1. # 建数据库
  2. CREATE DATABASE second_db;
  3. # 建表
  4. CREATE TABLE buyer(
  5.    id SERIAL PRIMARY KEY,
  6.    name VARCHAR NOT NULL,
  7.    order_num int NOT NULL
  8. );
  9. # 新增两条记录
  10. insert into buyer (name, order_num) values ('buyer1', 100);
  11. insert into buyer (name, order_num) values ('buyer2', 200);
复制代码
开发-创建子工程

  1.     <dependencies>
  2.         <dependency>
  3.             <groupId>io.quarkus</groupId>
  4.             <artifactId>quarkus-arc</artifactId>
  5.         </dependency>
  6.         
  7.         <dependency>
  8.             <groupId>io.quarkus</groupId>
  9.             <artifactId>quarkus-agroal</artifactId>
  10.         </dependency>
  11.         
  12.         <dependency>
  13.             <groupId>io.quarkus</groupId>
  14.             <artifactId>quarkus-hibernate-orm</artifactId>
  15.         </dependency>
  16.         
  17.         <dependency>
  18.             <groupId>io.quarkus</groupId>
  19.             <artifactId>quarkus-jdbc-postgresql</artifactId>
  20.         </dependency>
  21.         
  22.         <dependency>
  23.             <groupId>io.quarkus</groupId>
  24.             <artifactId>quarkus-jdbc-mysql</artifactId>
  25.         </dependency>
  26.         
  27.         <dependency>
  28.             <groupId>io.quarkus</groupId>
  29.             <artifactId>quarkus-junit5</artifactId>
  30.             <scope>test</scope>
  31.         </dependency>
  32.         <dependency>
  33.             <groupId>io.rest-assured</groupId>
  34.             <artifactId>rest-assured</artifactId>
  35.             <scope>test</scope>
  36.         </dependency>
  37.     </dependencies>
复制代码
开发-配置文件


  1. # first-db的配置,下面五个配置项在application.properties文件中
  2. quarkus.hibernate-orm.log.sql=true
  3. quarkus.datasource.db-kind=mysql
  4. quarkus.datasource.jdbc.max-size=8
  5. quarkus.datasource.jdbc.min-size=2
  6. quarkus.hibernate-orm.packages=com.bolingcavalry.multidb.entity.firstdb
  7. # first-db的配置,下面三个配置项在application-test.properties文件中,即test环境下fitst-db的数据库地址、账号、密码等信息
  8. quarkus.datasource.username=root
  9. quarkus.datasource.password=123456
  10. quarkus.datasource.jdbc.url=jdbc:mysql://192.168.50.43:3306/first_db
复制代码

  1. # second_db的配置,下面五个配置项在application.properties文件中
  2. quarkus.hibernate-orm.second_db.log.sql=true
  3. quarkus.datasource.second_db.db-kind=postgresql
  4. quarkus.datasource.second_db.jdbc.max-size=8
  5. quarkus.datasource.second_db.jdbc.min-size=2
  6. quarkus.hibernate-orm.second_db.datasource=second_db
  7. quarkus.hibernate-orm.second_db.packages=com.bolingcavalry.multidb.entity.seconddb
  8. # second_db的配置,下面三个配置项在application-test.properties文件中,即test环境下second_db的数据库地址、账号、密码等信息
  9. quarkus.datasource.second_db.username=quarkus
  10. quarkus.datasource.second_db.password=123456
  11. quarkus.datasource.second_db.jdbc.url=jdbc:postgresql://192.168.50.43:15432/second_db
复制代码
开发:编码

  1. package com.bolingcavalry.multidb.entity.firstdb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "seller")
  5. @NamedQuery(name = "Seller.findAll", query = "SELECT f FROM Seller f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  6. @Cacheable
  7. public class Seller {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Integer id;
  11.     @Column
  12.     private String name;
  13.     @Column(name = "product_num")
  14.     private int productNum;
  15.     public Integer getId() {
  16.         return id;
  17.     }
  18.     public void setId(Integer id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getProductNum() {
  28.         return productNum;
  29.     }
  30.     public void setProductNum(int productNum) {
  31.         this.productNum = productNum;
  32.     }
  33. }
复制代码
  1. package com.bolingcavalry.multidb.entity.seconddb;
  2. import javax.persistence.*;
  3. @Entity
  4. @Table(name = "buyer")
  5. @NamedQuery(name = "Buyer.findAll", query = "SELECT f FROM Buyer f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  6. @Cacheable
  7. public class Buyer {
  8.     @Id
  9.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  10.     private Integer id;
  11.     @Column
  12.     private String name;
  13.     @Column(name = "order_num")
  14.     private int orderNum;
  15.     public Integer getId() {
  16.         return id;
  17.     }
  18.     public void setId(Integer id) {
  19.         this.id = id;
  20.     }
  21.     public String getName() {
  22.         return name;
  23.     }
  24.     public void setName(String name) {
  25.         this.name = name;
  26.     }
  27.     public int getOrderNum() {
  28.         return orderNum;
  29.     }
  30.     public void setOrderNum(int orderNum) {
  31.         this.orderNum = orderNum;
  32.     }
  33. }
复制代码
  1. @ApplicationScoped
  2. public class SellerService {
  3.     @Inject
  4.     EntityManager entityManager;
  5.     public List<Seller> get() {
  6.         return entityManager.createNamedQuery("Seller.findAll", Seller.class)
  7.                 .getResultList();
  8.     }
  9.     public Seller getSingle(Integer id) {
  10.         return entityManager.find(Seller.class, id);
  11.     }
  12.     @Transactional
  13.     public void create(Seller seller) {
  14.         entityManager.persist(seller);
  15.     }
  16.     @Transactional
  17.     public void update(Integer id, Seller seller) {
  18.         Seller entity = entityManager.find(Seller.class, id);
  19.         if (null!=entity) {
  20.             entity.setName(seller.getName());
  21.         }
  22.     }
  23.     @Transactional
  24.     public void delete(Integer id) {
  25.         Seller entity = entityManager.getReference(Seller.class, id);
  26.         if (null!=entity) {
  27.             entityManager.remove(entity);
  28.         }
  29.     }
  30. }
复制代码
  1. package com.bolingcavalry.multidb.service;
  2. import com.bolingcavalry.multidb.entity.seconddb.Buyer;
  3. import io.quarkus.hibernate.orm.PersistenceUnit;
  4. import javax.enterprise.context.ApplicationScoped;
  5. import javax.inject.Inject;
  6. import javax.persistence.EntityManager;
  7. import javax.transaction.Transactional;
  8. import java.util.List;
  9. @ApplicationScoped
  10. public class BuyerService {
  11.     @Inject
  12.     @PersistenceUnit("second_db")
  13.     EntityManager entityManager;
  14.     public List<Buyer> get() {
  15.         return entityManager.createNamedQuery("Buyer.findAll", Buyer.class)
  16.                 .getResultList();
  17.     }
  18.     public Buyer getSingle(Integer id) {
  19.         return entityManager.find(Buyer.class, id);
  20.     }
  21.     @Transactional
  22.     public void create(Buyer buyer) {
  23.         entityManager.persist(buyer);
  24.     }
  25.     @Transactional
  26.     public void update(Integer id, Buyer buyer) {
  27.         Buyer entity = entityManager.find(Buyer.class, id);
  28.         if (null!=entity) {
  29.             entity.setName(buyer.getName());
  30.         }
  31.     }
  32.     @Transactional
  33.     public void delete(Integer id) {
  34.         Buyer entity = entityManager.getReference(Buyer.class, id);
  35.         if (null!=entity) {
  36.             entityManager.remove(entity);
  37.         }
  38.     }
  39. }
复制代码
开发-单元测试

  1. @QuarkusTest
  2. @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  3. public class MultiDBTest {
  4.     /**
  5.      * first_db的seller表中,初始记录数
  6.      */
  7.     private static final int FIRST_DB_EXIST_RECORDS_SIZE = 3;
  8.     /**
  9.      * second_db的buyer表中,初始记录数
  10.      */
  11.     private static final int SECOND_DB_EXIST_RECORDS_SIZE = 2;
  12.     /**
  13.      * import.sql中,第一条记录的id
  14.      */
  15.     private static final int EXIST_FIRST_ID = 1;
  16.     /**
  17.      * 在Fruit.java中,id字段的SequenceGenerator指定了initialValue等于10,
  18.      * 表示自增ID从10开始
  19.      */
  20.     private static final int ID_SEQUENCE_INIT_VALUE = 10;
  21.     @Inject
  22.     SellerService sellerService;
  23.     @Inject
  24.     BuyerService buyerService;
  25.     @Test
  26.     @DisplayName("list")
  27.     @Order(1)
  28.     public void testGet() {
  29.         List<Seller> sellerList = sellerService.get();
  30.         // 判定非空
  31.         Assertions.assertNotNull(sellerList);
  32.         // seller表初始化时新增了3条记录
  33.         Assertions.assertEquals(FIRST_DB_EXIST_RECORDS_SIZE, sellerList.size());
  34.         List<Buyer> buyerList = buyerService.get();
  35.         // 判定非空
  36.         Assertions.assertNotNull(buyerList);
  37.         // buyer表初始化时新增了2条记录
  38.         Assertions.assertEquals(SECOND_DB_EXIST_RECORDS_SIZE, buyerList.size());
  39.     }
  40.     @Test
  41.     @DisplayName("getSingle")
  42.     @Order(2)
  43.     public void testGetSingle() {
  44.         // 用第二条记录吧,第一条在执行testUpdate方法时被更改了
  45.         Seller seller = sellerService.getSingle(EXIST_FIRST_ID+1);
  46.         // 判定非空
  47.         Assertions.assertNotNull(seller);
  48.         // buyer表的第一条记录
  49.         Assertions.assertEquals("seller2", seller.getName());
  50.         // 用第二条记录吧,第一条在执行testUpdate方法时被更改了
  51.         Buyer buyer = buyerService.getSingle(EXIST_FIRST_ID+1);
  52.         // 判定非空
  53.         Assertions.assertNotNull(buyer);
  54.         // buyer表的第二条记录
  55.         Assertions.assertEquals("buyer2", buyer.getName());
  56.     }
  57.     @Test
  58.     @DisplayName("update")
  59.     @Order(3)
  60.     public void testUpdate() {
  61.         // 验证first_db的操作
  62.         String newName = LocalDateTime.now().toString();
  63.         Seller seller = new Seller();
  64.         seller.setName(newName);
  65.         // 更新数据库
  66.         sellerService.update(EXIST_FIRST_ID, seller);
  67.         Seller sellerFromDB = sellerService.getSingle(EXIST_FIRST_ID);
  68.         // 从数据库取出的对象,其名称应该等于修改的名称
  69.         Assertions.assertEquals(newName, sellerFromDB.getName());
  70.         // 验证second_db的操作
  71.         Buyer buyer = new Buyer();
  72.         buyer.setName(newName);
  73.         // 更新数据库
  74.         buyerService.update(EXIST_FIRST_ID, buyer);
  75.         Buyer buyerFromDB = buyerService.getSingle(EXIST_FIRST_ID);
  76.         // 从数据库取出的对象,其名称应该等于修改的名称
  77.         Assertions.assertEquals(newName, buyerFromDB.getName());
  78.     }
  79.     @Test
  80.     @DisplayName("create")
  81.     @Order(3)
  82.     public void testCreate() {
  83.         Seller seller = new Seller();
  84.         seller.setName("seller4");
  85.         sellerService.create(seller);
  86.         // 创建成功后,记录主键肯定是大于3的
  87.         Assertions.assertTrue(seller.getId()>FIRST_DB_EXIST_RECORDS_SIZE);
  88.         // 记录总数应该等于已有记录数+1
  89.         Assertions.assertEquals(FIRST_DB_EXIST_RECORDS_SIZE+1, sellerService.get().size());
  90.         Buyer buyer = new Buyer();
  91.         buyer.setName("buyer3");
  92.         buyerService.create(buyer);
  93.         // 创建成功后,记录主键肯定是大于3的
  94.         Assertions.assertTrue(buyer.getId()>SECOND_DB_EXIST_RECORDS_SIZE);
  95.         // 记录总数应该等于已有记录数+1
  96.         Assertions.assertEquals(SECOND_DB_EXIST_RECORDS_SIZE+1, buyerService.get().size());
  97.     }
  98.     @Test
  99.     @DisplayName("delete")
  100.     @Order(5)
  101.     public void testDelete() {
  102.         List<Seller> sellers = sellerService.get();
  103.         // 先记删除前的总数
  104.         int numBeforeDelete = sellers.size();
  105.         // 删除最后一条记录
  106.         sellerService.delete(sellers.get(numBeforeDelete-1).getId());
  107.         // 记录数应该应该等于删除前的数量减一
  108.         Assertions.assertEquals(numBeforeDelete-1, sellerService.get().size());
  109.         List<Buyer> buyers = buyerService.get();
  110.         // 先记删除前的总数
  111.         numBeforeDelete = buyers.size();
  112.         // 删除最后一条记录
  113.         buyerService.delete(buyers.get(numBeforeDelete-1).getId());
  114.         // 记录数应该应该等于删除前的数量减一
  115.         Assertions.assertEquals(numBeforeDelete-1, buyerService.get().size());
  116.     }
  117. }
复制代码
验证



源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4