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

标题: quarkus数据库篇之一:比官方demo更简单的基础操作 [打印本页]

作者: 曹旭辉    时间: 2023-8-28 12:07
标题: quarkus数据库篇之一:比官方demo更简单的基础操作
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
关于《数据库篇》

本篇概览



环境和版本信息

源码下载

名称链接备注项目主页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. docker run \
  2. --name quarkus_test \
  3. -e POSTGRES_USER=quarkus \
  4. -e POSTGRES_PASSWORD=123456 \
  5. -e POSTGRES_DB=quarkus_test \
  6. -p 5432:5432 \
  7. -v /xxx:/var/lib/postgresql/data \
  8. postgres:13.3
复制代码

新建maven子工程basic-db

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <parent>
  6.         <artifactId>quarkus-tutorials</artifactId>
  7.         <groupId>com.bolingcavalry</groupId>
  8.         <version>1.0-SNAPSHOT</version>
  9.     </parent>
  10.     <modelVersion>4.0.0</modelVersion>
  11.     <artifactId>basic-db</artifactId>
  12.     <dependencies>
  13.         <dependency>
  14.             <groupId>io.quarkus</groupId>
  15.             <artifactId>quarkus-arc</artifactId>
  16.         </dependency>
  17.         
  18.         <dependency>
  19.             <groupId>io.quarkus</groupId>
  20.             <artifactId>quarkus-agroal</artifactId>
  21.         </dependency>
  22.         
  23.         <dependency>
  24.             <groupId>io.quarkus</groupId>
  25.             <artifactId>quarkus-hibernate-orm</artifactId>
  26.         </dependency>
  27.         
  28.         <dependency>
  29.             <groupId>io.quarkus</groupId>
  30.             <artifactId>quarkus-jdbc-postgresql</artifactId>
  31.         </dependency>
  32.         
  33.         <dependency>
  34.             <groupId>io.quarkus</groupId>
  35.             <artifactId>quarkus-junit5</artifactId>
  36.             <scope>test</scope>
  37.         </dependency>
  38.         <dependency>
  39.             <groupId>io.rest-assured</groupId>
  40.             <artifactId>rest-assured</artifactId>
  41.             <scope>test</scope>
  42.         </dependency>
  43.     </dependencies>
  44.     <build>
  45.         <plugins>
  46.             <plugin>
  47.                 <groupId>${quarkus.platform.group-id}</groupId>
  48.                 <artifactId>quarkus-maven-plugin</artifactId>
  49.                 <extensions>true</extensions>
  50.                 <executions>
  51.                     <execution>
  52.                         <goals>
  53.                             <goal>build</goal>
  54.                             <goal>generate-code</goal>
  55.                             <goal>generate-code-tests</goal>
  56.                         </goals>
  57.                     </execution>
  58.                 </executions>
  59.             </plugin>
  60.             <plugin>
  61.                 <artifactId>maven-compiler-plugin</artifactId>
  62.                 <configuration>
  63.                     <compilerArgs>
  64.                         <arg>-parameters</arg>
  65.                     </compilerArgs>
  66.                 </configuration>
  67.             </plugin>
  68.             <plugin>
  69.                 <artifactId>maven-surefire-plugin</artifactId>
  70.                 <configuration>
  71.                     <systemPropertyVariables>
  72.                         <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
  73.                         <maven.home>${maven.home}</maven.home>
  74.                     </systemPropertyVariables>
  75.                 </configuration>
  76.             </plugin>
  77.         </plugins>
  78.     </build>
  79. </project>
复制代码
配置文件

  1. quarkus.datasource.db-kind=postgresql
  2. quarkus.hibernate-orm.log.sql=true
  3. quarkus.datasource.jdbc.max-size=8
  4. quarkus.datasource.jdbc.min-size=2
复制代码
  1. quarkus.datasource.username=quarkus
  2. quarkus.datasource.password=123456
  3. quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.50.43:15432/quarkus_test
  4. quarkus.hibernate-orm.database.generation=drop-and-create
  5. quarkus.hibernate-orm.sql-load-script=import.sql
复制代码
取值含义none啥也不做create第一次启动会建表,之后启动不会再改动drop-and-create每一次启动应用的时候都删表(数据也没了),然后建表,再执行import.sql导入数据drop启动应用的时候删表,不删库update保留数据,升级表结构validate检查表结构与entity是否匹配


SQL文件

  1. INSERT INTO known_fruits(id, name) VALUES (1, 'Cherry');
  2. INSERT INTO known_fruits(id, name) VALUES (2, 'Apple');
  3. INSERT INTO known_fruits(id, name) VALUES (3, 'Banana');
复制代码
编码:实体类

  1. package com.bolingcavalry.db.entity;
  2. import javax.persistence.Cacheable;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.Id;
  7. import javax.persistence.NamedQuery;
  8. import javax.persistence.QueryHint;
  9. import javax.persistence.SequenceGenerator;
  10. import javax.persistence.Table;
  11. @Entity
  12. @Table(name = "known_fruits")
  13. @NamedQuery(name = "Fruits.findAll", query = "SELECT f FROM Fruit f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
  14. @Cacheable
  15. public class Fruit {
  16.     @Id
  17.     @SequenceGenerator(name = "fruitsSequence", sequenceName = "known_fruits_id_seq", allocationSize = 1, initialValue = 10)
  18.     @GeneratedValue(generator = "fruitsSequence")
  19.     private Integer id;
  20.     @Column(length = 40, unique = true)
  21.     private String name;
  22.     public Fruit() {
  23.     }
  24.     public Fruit(String name) {
  25.         this.name = name;
  26.     }
  27.     public Integer getId() {
  28.         return id;
  29.     }
  30.     public void setId(Integer id) {
  31.         this.id = id;
  32.     }
  33.     public String getName() {
  34.         return name;
  35.     }
  36.     public void setName(String name) {
  37.         this.name = name;
  38.     }
  39. }
复制代码
service层

  1. package com.bolingcavalry.db.service;
  2. import com.bolingcavalry.db.entity.Fruit;
  3. import javax.enterprise.context.ApplicationScoped;
  4. import javax.inject.Inject;
  5. import javax.persistence.EntityManager;
  6. import javax.transaction.Transactional;
  7. import java.util.List;
  8. @ApplicationScoped
  9. public class FruitService {
  10.     @Inject
  11.     EntityManager entityManager;
  12.     public List<Fruit> get() {
  13.         return entityManager.createNamedQuery("Fruits.findAll", Fruit.class)
  14.                 .getResultList();
  15.     }
  16.     public Fruit getSingle(Integer id) {
  17.         return entityManager.find(Fruit.class, id);
  18.     }
  19.     @Transactional
  20.     public void create(Fruit fruit) {
  21.         entityManager.persist(fruit);
  22.     }
  23.     @Transactional
  24.     public void update(Integer id, Fruit fruit) {
  25.         Fruit entity = entityManager.find(Fruit.class, id);
  26.         if (null!=entity) {
  27.             entity.setName(fruit.getName());
  28.         }
  29.     }
  30.     @Transactional
  31.     public void delete(Integer id) {
  32.         Fruit entity = entityManager.getReference(Fruit.class, id);
  33.         if (null!=entity) {
  34.             entityManager.remove(entity);
  35.         }
  36.     }
  37. }
复制代码
单元测试类

  1. package com.bolingcavalry;
  2. import com.bolingcavalry.db.entity.Fruit;
  3. import com.bolingcavalry.db.service.FruitService;
  4. import io.quarkus.test.junit.QuarkusTest;
  5. import org.junit.jupiter.api.*;
  6. import javax.inject.Inject;
  7. import java.util.List;
  8. @QuarkusTest
  9. @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  10. public class FruitServiceTest {
  11.     /**
  12.      * import.sql中导入的记录数量,这些是应用启动是导入的
  13.      */
  14.     private static final int EXIST_RECORDS_SIZE = 3;
  15.     /**
  16.      * import.sql中,第一条记录的id
  17.      */
  18.     private static final int EXIST_FIRST_ID = 1;
  19.     /**
  20.      * 在Fruit.java中,id字段的SequenceGenerator指定了initialValue等于10,
  21.      * 表示自增ID从10开始
  22.      */
  23.     private static final int ID_SEQUENCE_INIT_VALUE = 10;
  24.     @Inject
  25.     FruitService fruitService;
  26.     @Test
  27.     @DisplayName("list")
  28.     @Order(1)
  29.     public void testGet() {
  30.         List<Fruit> list = fruitService.get();
  31.         // 判定非空
  32.         Assertions.assertNotNull(list);
  33.         // import.sql中新增3条记录
  34.         Assertions.assertEquals(EXIST_RECORDS_SIZE, list.size());
  35.     }
  36.     @Test
  37.     @DisplayName("getSingle")
  38.     @Order(2)
  39.     public void testGetSingle() {
  40.         Fruit fruit = fruitService.getSingle(EXIST_FIRST_ID);
  41.         // 判定非空
  42.         Assertions.assertNotNull(fruit);
  43.         // import.sql中的第一条记录
  44.         Assertions.assertEquals("Cherry", fruit.getName());
  45.     }
  46.     @Test
  47.     @DisplayName("update")
  48.     @Order(3)
  49.     public void testUpdate() {
  50.         String newName = "ShanDongBigCherry";
  51.         fruitService.update(EXIST_FIRST_ID, new Fruit(newName));
  52.         Fruit fruit = fruitService.getSingle(EXIST_FIRST_ID);
  53.         // 从数据库取出的对象,其名称应该等于修改的名称
  54.         Assertions.assertEquals(newName, fruit.getName());
  55.     }
  56.     @Test
  57.     @DisplayName("create")
  58.     @Order(4)
  59.     public void testCreate() {
  60.         Fruit fruit = new Fruit("Orange");
  61.         fruitService.create(fruit);
  62.         // 由于是第一次新增,所以ID应该等于自增ID的起始值
  63.         Assertions.assertEquals(ID_SEQUENCE_INIT_VALUE, fruit.getId());
  64.         // 记录总数应该等于已有记录数+1
  65.         Assertions.assertEquals(EXIST_RECORDS_SIZE+1, fruitService.get().size());
  66.     }
  67.     @Test
  68.     @DisplayName("delete")
  69.     @Order(5)
  70.     public void testDelete() {
  71.         // 先记删除前的总数
  72.         int numBeforeDelete = fruitService.get().size();
  73.         // 删除第一条记录
  74.         fruitService.delete(EXIST_FIRST_ID);
  75.         // 记录数应该应该等于删除前的数量减一
  76.         Assertions.assertEquals(numBeforeDelete-1, fruitService.get().size());
  77.     }
  78. }
复制代码

IDEA的小坑




运行单元测试



欢迎关注博客园:程序员欣宸

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

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




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