一个简单的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
<?xml version="1.0"?>
<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.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>quarkus-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<quarkus.version>1.7.2.Final</quarkus.version>
</properties>
<dependencies>
<!-- 实现Rest web服务依赖 -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<!-- hibernate依赖 -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<!-- mysql驱动依赖 -->
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-mysql</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-bom</artifactId>
<version>${quarkus.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
<goals>
<goal>build</goal>
</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服务入门