设为首页 加入收藏

TOP

quarkus数据库篇之一:比官方demo更简单的基础操作(三)
2023-08-26 21:11:08 】 浏览:92
Tags:quarkus demo 简单的
的JPA元信息,是应用与数据库表映射的关键
  • 实体类Fruit.java如下,有几处要注意的地方稍后会提到
  • package com.bolingcavalry.db.entity;
    
    import javax.persistence.Cacheable;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.NamedQuery;
    import javax.persistence.QueryHint;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "known_fruits")
    @NamedQuery(name = "Fruits.findAll", query = "SELECT f FROM Fruit f ORDER BY f.name", hints = @QueryHint(name = "org.hibernate.cacheable", value = "true"))
    @Cacheable
    public class Fruit {
    
        @Id
        @SequenceGenerator(name = "fruitsSequence", sequenceName = "known_fruits_id_seq", allocationSize = 1, initialValue = 10)
        @GeneratedValue(generator = "fruitsSequence")
        private Integer id;
    
        @Column(length = 40, unique = true)
        private String name;
    
        public Fruit() {
        }
    
        public Fruit(String name) {
            this.name = name;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 上述代码有以下几处要注意的
    1. 注解Table确定了表名known_fruits
    2. 增加了一个自定义SQL,名为Fruits.findAll,后面会用到
    3. 注解SequenceGenerator定义了known_fruits的自增主键的信息,初始值是10,也就是说通过当前应用新增的第一条记录,ID等于10
    4. known_fruits表只有两个字段:id和name

    service层

    • 为known_fruits表的操作增加一个服务类,用于上层的调用(所谓上层是指web接口、gRPC接口、消息消费入口等)
    • 服务类名为FruitService.java,为了省事儿就直接用class,不写interface了,代码如下,增删改查服务其实就是EntityManager的基本操作,这就不赘述了:
    package com.bolingcavalry.db.service;
    
    import com.bolingcavalry.db.entity.Fruit;
    import javax.enterprise.context.ApplicationScoped;
    import javax.inject.Inject;
    import javax.persistence.EntityManager;
    import javax.transaction.Transactional;
    import java.util.List;
    
    @ApplicationScoped
    public class FruitService {
        @Inject
        EntityManager entityManager;
    
        public List<Fruit> get() {
            return entityManager.createNamedQuery("Fruits.findAll", Fruit.class)
                    .getResultList();
        }
    
        public Fruit getSingle(Integer id) {
            return entityManager.find(Fruit.class, id);
        }
    
        @Transactional
        public void create(Fruit fruit) {
            entityManager.persist(fruit);
        }
    
        @Transactional
        public void update(Integer id, Fruit fruit) {
            Fruit entity = entityManager.find(Fruit.class, id);
    
            if (null!=entity) {
                entity.setName(fruit.getName());
            }
        }
    
        @Transactional
        public void delete(Integer id) {
            Fruit entity = entityManager.getReference(Fruit.class, id);
    
            if (null!=entity) {
                entityManager.remove(entity);
            }
        }
    }
    
    • 代码写到这里其实已经完成了,当前工程已经有了数据库增删改查的能力,至于上层如何使用(是web调用、gRPC调用、消费消息),那并非本篇的重点,您可以根据自己需要随意添加
    • 为了验证服务类功能正常,接下来会写一个单元测试类 ,调用FruitService的各API并验证数据是否符合预期

    单元测试类

    • 单元测试类只有一个,位置在quarkus-tutorials/basic-db/src/test/java,这是符合maven规范的测试类位置
    • FruitServiceTest源码如下,有几处要注意的地方稍后会提到
    package com.bolingcavalry;
    
    import com.bolingcavalry.db.entity.Fruit;
    import com.bolingcavalry.db.service.FruitService;
    import io.quarkus.test.junit.QuarkusTest;
    import org.junit.jupiter.api.*;
    
    import javax.inject.Inject;
    import java.util.List;
    
    @QuarkusTest
    @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
    publi
    首页 上一页 1 2 3 4 下一页 尾页 3/4/4
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇聊聊JDK1.0到JDK20的那些事儿 下一篇Nacos源码 (3) 注册中心

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目