一个简单的Quarkus CRUD入门

一个简单的Quarkus CRUD入门

介绍

Quarkus是一个由Red Hat开源的 Java 微服务框架,前面已经简单尝试过web服务构建(一个简单的Quarkus web服务入门),现在来试试实现数据操作。

本示例项目代码已上传github,地址:https://github.com/mrKyleWang/quarkus-demo

测试表准备

CREATE TABLE `user` (
    `id`        BIGINT(20)   NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `name`      VARCHAR(100) NOT NULL COMMENT '姓名',
    `phone`     VARCHAR(20)  NOT NULL COMMENT '手机号',
    `create_time` DATETIME     NOT NULL COMMENT '创建时间',
    `update_time` DATETIME     NOT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户表';

构建项目

1. pom文件

注意,这里使用的是最新发行版本1.7.2.Final,要求:jdk 8 or 11+、maven 3.6.2+,可根据环境使用低版本quarkus


<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0modelVersion>
    <groupId>com.examplegroupId>
    <artifactId>quarkus-demoartifactId>
    <version>1.0-SNAPSHOTversion>

    <properties>
        <quarkus.version>1.7.2.Finalquarkus.version>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>io.quarkusgroupId>
            <artifactId>quarkus-resteasy-jacksonartifactId>
        dependency>
        
		
        <dependency>
            <groupId>io.quarkusgroupId>
            <artifactId>quarkus-hibernate-orm-panacheartifactId>
        dependency>

        
        <dependency>
            <groupId>io.quarkusgroupId>
            <artifactId>quarkus-jdbc-mysqlartifactId>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.quarkusgroupId>
                <artifactId>quarkus-bomartifactId>
                <version>${quarkus.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>io.quarkusgroupId>
                <artifactId>quarkus-maven-pluginartifactId>
                <version>${quarkus.version}version>
                <executions>
                    <execution>
                        <goals>
                            <goal>buildgoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

2. 应用配置

application.properties文件

# http服务端口
quarkus.http.port=8082
# url根路径
quarkus.http.root-path=/

# mysql数据源配置
quarkus.datasource.jdbc.url=jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8
quarkus.datasource.username=root
quarkus.datasource.password=rootpass
quarkus.datasource.db-kind=mysql

3. 实体类声明

@Entity(name = "user")
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;

    private String phone;

    @CreationTimestamp
    private Date createTime;

    @UpdateTimestamp
    private Date updateTime;
}

注意,这里实体类里属性都是使用驼峰命名,而表里字段的是蛇形(下划线)命名,那么存在一个映射的过程,而Hibernate原生未提供这么一个映射器,因此我们需要实现一个自定义命名策略,否则就会因为字段不存在而执行SQL失败。映射实现参考:
Quarkus使用Hibernate ORM自定义命名策略(表、字段命名映射)

4. dao声明

只需要声明一个实现PanacheRepository接口的Bean,即可使用接口提供的一系列默认方法来操作数据:

@ApplicationScoped
public class UserRepository implements PanacheRepository<User> {
}

5. service声明

这里我们添加4个方法,包含了增删改查4类操作:

@ApplicationScoped
public class UserService {

    @Inject
    UserRepository userRepository;

    /**
     * 查询所有用户
     */
    public List<User> getAll() {
        return userRepository.listAll();
    }

    /**
     * 通过手机号查询用户
     */
    public User getByPhone(String phone) {
        return userRepository.find("phone", phone).firstResult();
    }

    /**
     * 保存用户 (事务操作)
     */
    @Transactional
    public User saveUser(User user) {
        // 通过手机号查询,如果存在则更新name,否则新增
        User persistUser = getByPhone(user.getPhone());
        if (persistUser == null) {
            userRepository.persist(user);
        } else {
            // 更新name
            persistUser.setName(user.getName());
        }
        return persistUser;
    }

    /**
     * 通过id删除用户
     */
    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

注意,其中增、删、查操作都是使用dao的方法,但这里update操作可以直接通过设置对象属性实现,上面代码中由于从dao查出的persistUser对象是一个持久态的对象,通过setName()方法更新对象属性即可同步更新映射的表字段。

6. 接口声明(略)

这里可以直接参考前文:一个简单的Quarkus web服务入门

你可能感兴趣的:(hibernate,quarkus,java后端技术实践)