首页 > 其他分享 >Quarkus系列——快速入门(一)

Quarkus系列——快速入门(一)

时间:2023-04-03 23:02:45浏览次数:30  
标签:CODE 系列 入门 BaseResponse return Quarkus import com public

介绍

Quarkus在日常开发中是可以替代SpringBoot的。

Quarkus是 Red Hat为GraalVM 和 HotSpot 量身定制用程序。特点是启动超快,内存极低,并且在容器编排平台(如Kubernetes)中提供了近乎即时的向上扩展和高密度的内存利用率。并且基于GraalVM,为我们提供了编译成native程序的能力。如果你觉得SpringBoot的启动速度太慢了内存占用率太高了,那么可以在日常开发中尝试一下Quarkus,也许会给你不一样的体验。我将通过一系列的教程,来介绍如何使用Quarkus。

准备

本文将用Quarkus快速实现一个CRUD操作。

项目创建

可以通过IDEA快速来创建一个Quarkus的项目。

我们先选择如下依赖,resteasy 相当于springmvc,openapi相当于swagger。这里还差一个mybatisplus的依赖,我们一会在pom里面再添加。

项目结构如下

我们在pom中再添加一下mybatisplus跟lombok的依赖

   	<dependency>
            <groupId>io.quarkiverse.mybatis</groupId>
            <artifactId>quarkus-mybatis-plus</artifactId>
            <version>1.0.3</version>
        </dependency>
	<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
            <scope>provided</scope>
        </dependency>

添加mysql的配置

quarkus.datasource.db-kind=mysql
quarkus.datasource.password=root
quarkus.datasource.username=root
quarkus.datasource.jdbc.url=jdbc:mysql://localhost/test

创建一张user表

CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL,
  `address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

再创建一个user的实体类

package com.billetsdoux.entity;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_user")
public class User {

    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;

    private String address;

    private Integer age;

    private String password;
}

repository层的如下

package com.billetsdoux.repository;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.billetsdoux.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserRepository  extends BaseMapper<User> {
}

service层如下,查询单个,分页查询,更新,删除,新增操作

package com.billetsdoux.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.billetsdoux.entity.User;
import com.billetsdoux.repository.UserRepository;

import javax.inject.Inject;
import javax.inject.Singleton;

@Singleton
public class UserService {

    @Inject
    UserRepository userRepository;

    public User findById(Long id){
        return userRepository.selectById(id);
    }

    public Page<User> list(String name,String address,Integer age,Integer pageNo,Integer pageSize){

        Page<User> page = userRepository.selectPage(new Page<>(pageNo, pageSize), new QueryWrapper<User>()
                .eq(StringUtils.isNotBlank(name), "name", name)
                .eq(StringUtils.isNotBlank(address), "address", address)
                .eq(null!=age, "age", age));

        return page;


    }


    public boolean insert(User user){

        return userRepository.insert(user)>0;

    }

    public boolean update(User user){

        return userRepository.updateById(user) > 0;
    }

    public boolean delete(Long id){
        return userRepository.deleteById(id) > 0;
    }

}



controller层

package com.billetsdoux.controller;

import com.billetsdoux.entity.User;
import com.billetsdoux.service.UserService;
import com.billetsdoux.util.BaseResponse;

import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;

@Path("/user")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class UserController {
    @Inject
    UserService userService;

    @GET
    @Path("/search/{id}")

    public User searchById(@PathParam("id") Long id){

        return userService.findById(id);
    }

    @GET
    @Path("/list")
    public BaseResponse<List<User>> list(@QueryParam("name") String name,
                                        @QueryParam("address") String address,
                                        @QueryParam("age") Integer age,
                                        @QueryParam("pageNo") Integer pageNo,
                                        @QueryParam("pageSize") Integer pageSize
                           ){

        return BaseResponse.success(userService.list(name, address, age, pageNo, pageSize).getRecords());
    }

    @POST
    @Path("/add")
    public BaseResponse addUser(User user){

        return userService.insert(user) ? BaseResponse.success() : BaseResponse.error();
    }

    @DELETE
    @Path("/delete/{id}")
    public BaseResponse delete(@PathParam("id") Long id){

        return userService.delete(id) ? BaseResponse.success() : BaseResponse.error();
    }

    @PUT
    @Path("/update")
    public BaseResponse updateUser(User user){
        return userService.update(user) ? BaseResponse.success() : BaseResponse.error();
    }
}

新增了一个BaseResponse

package com.billetsdoux.util;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class BaseResponse<T> {

    private static final int CODE_SUCCESS = 200;

    private static final int CODE_FAIL = 500;

    private static final int CODE_ERROR = 500;

    private static final int CODE_NO_LOGIN = 300;

    private int code;

    private String msg;

    private T data;

    public BaseResponse(int code, String msg, T data) {
        this.setCode(code);
        this.setMsg(msg);
        this.setData(data);
    }

    public static <T> BaseResponse<T> success() {
        return new BaseResponse<T>(CODE_SUCCESS, "success", null);
    }
    public static <T> BaseResponse<T> success(String message) {
        return new BaseResponse<T>(CODE_SUCCESS, message, null);
    }
    public static <T> BaseResponse<T> success(T data) {
        return new BaseResponse<T>(CODE_SUCCESS, "success", data);
    }
    public static <T> BaseResponse<T> success(String message, T data) {
        return new BaseResponse<T>(CODE_SUCCESS, message, data);
    }

    public static <T> BaseResponse<T> error() {
        return new BaseResponse<T>(CODE_ERROR, "fail", null);
    }
    public static <T> BaseResponse<T> error(String message) {
        return new BaseResponse<T>(CODE_ERROR, message, null);
    }
    public static <T> BaseResponse<T> error(T data) {
        return new BaseResponse<T>(CODE_ERROR, "fail", data);
    }
    public static <T> BaseResponse<T> error(String message, T data) {
        return new BaseResponse<T>(CODE_ERROR, message, data);
    }

    public static <T> BaseResponse<T> badrequest() {
        return new BaseResponse<T>(CODE_FAIL, "no identifier arguments", null);
    }
    public static <T> BaseResponse<T> badrequest(String message) {
        return new BaseResponse<T>(CODE_FAIL, message, null);
    }
    public static <T> BaseResponse<T> badrequest(T data) {
        return new BaseResponse<T>(CODE_FAIL, "no identifier arguments", data);
    }
    public static <T> BaseResponse<T> badrequest(String message, T data) {
        return new BaseResponse<T>(CODE_FAIL, message, data);
    }

    public static <T> BaseResponse<T> noLogin(String message) {
        return new BaseResponse<T>(CODE_NO_LOGIN, message, null);
    }


}

简单的crud的代码就只有这些,然后我们去页面上测试一下。

页面测试

由于它没有main方法作为入口,所以我们需要在命令行之行如下命令启动项目。

./mvnw compile quarkus:dev

第一次启动的时候会去下载一些插件所以会花费点时间,等启动好了,访问 localhost:8080/q/swagger-ui 进入swagger页面

我们先添加一条数据

再查询一下刚添加的数据

更新一下

至此,我们用quarkus+mybatisplus完成了基础的crud操作。

native

前面我们说过了Quarkus的一个优势是借助GraalVM可以将我们的代码打包成native code 所以我们来打包一下。

执行

./mvnw package -Pnative

等待编译,这个编译的时间会比较久一点。

编译成功后我们进入target文件夹中可以看到编译后的可执行的文件,直接运行它就可以了。

可以看到我们的应用程序很快就启动完成了


标签:CODE,系列,入门,BaseResponse,return,Quarkus,import,com,public
From: https://www.cnblogs.com/loveletters/p/QuarkusQuickStart.html

相关文章

  • yolo系列模型结构图
    yolo系列模型结构图:             ......
  • RxJS 系列 – Mathematical and Aggregate Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperatorsUtilityOperatorsConditionalandBooleanOperators这篇继续介绍 MathematicalandAggregateOperators 参......
  • RxJS 系列 – Conditional and Boolean Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperatorsUtilityOperators这篇继续介绍 ConditionalandBooleanOperators 参考Docs– ConditionalandBooleanOp......
  • Flask快速入门day02(1、CBV使用及源码分析,2、模板用法,3、请求与响应的基本用法,4、sessi
    目录Flask框架一、CBV分析1、CBV编写视图类方法二、CBV源码分析1、CBV源码问题2、补充问题3、总结三、模板1、py文件2、html页面四、请求与响应1、request常用方法2、response常用方法五、session及源码分析1、session的基本使用2、session源码分析六、闪现七、请求扩展Flask框......
  • 【第27天】SQL进阶-查询优化- performance_schema系列实战三:锁问题排查(表级锁)(SQL 小虚
    回城传送–》《32天SQL筑基》文章目录零、前言一、什么是表级锁二、什么时候适合加表级锁三、实战演练3.1数据准备(如果已有数据可跳过此操作)3.2开启第一个会话,执行显式加表级锁3.3开启第二个会话,对该表执行update更新3.4开启第三个会话,查询线程信息3.5分析3.6释放第一个会话......
  • ChatGPT 通识入门
    最近网络上对于ChatGPT的讨论热潮不断地膨胀,一个势必给整个人类社会带来新变革的科技和工具产生了。这个新的工具能够识别自然语言并能够理解上下文的语境,并能够具备人类思维的模型。但是ChatGPT到底是一个什么样的东西,能够给我们普通人或者特定工作岗位的人员带来什么样的帮......
  • Service Mesh之Istio基础入门
    技术背景分布式服务治理所谓分布式服务治理就是对服务不断增长的复杂度的管控和管理;管控及管理包含网络拓扑变动、网络延时、通信安全、API网关、服务注册和发现、服务熔断容错、服务超时重试、服务部署、数据调用、分布式链路追踪等等;服务治理历程第一代......
  • Python3内置函数之G系列
    1、getattr()getattr()函数是Python内置函数之一,用于获取一个对象的指定属性值。2、globals()globals()是Python内置函数之一,用于返回当前全局作用域中所有变量的字典。这个字典包含了所有已定义的全局变量,键为变量名,值为对应的值。可以通过修改这个字典中的变量来更新全......
  • RxJS 系列 – Utility Operators
    前言前几篇介绍过了 CreationOperatorsFilteringOperatorsJoinCreationOperatorsErrorHandlingOperatorsTransformationOperatorsJoinOperators这篇继续介绍 UtilityOperators 参考Docs–UtilityOperators  Tap ......
  • Python3内置函数之E系列
    1、enumerate()在Python中,enumerate()是一个内置函数,用于将一个可迭代对象转换为一个枚举对象,该对象包含每个元素的索引和对应的值。enumerate()函数返回的是一个由元组组成的迭代器,每个元组包含两个元素,第一个元素是元素的索引,第二个元素是元素的值。 2、eval()在Python中,e......