DoydoQuery v2
首页GitHub
简体中文
简体中文
  • 项目介绍
  • 快速上手
  • 基础用法
    • 增删查改接口
    • 中间表访问接口
    • 数据库方言
    • 分表增删查改
    • 打印SQL日志
  • 实体对象映射
    • 实体对象
    • 关联实体
  • 查询对象映射
    • 查询对象构建
    • 谓词后缀字段
    • 逻辑后缀字段
    • 子查询字段
    • ER关系字段
    • 自定义字段
    • 分页对象
  • 聚合查询
    • 视图对象
    • Having对象
    • 外连接
  • 相关资源
    • 文章
      • 从ORM到OQM:一种基于对象的SQL语句构造方案
由 GitBook 提供支持
在本页
  • 初始化工程
  • 初始化数据
  • 创建业务类
  • 测试验证

这有帮助吗?

快速上手

上一页项目介绍下一页增删查改接口

最后更新于2个月前

这有帮助吗?

本教程将通过为如下角色表构建RESTful服务的完整过程,帮助您快速上手DoytoQuery框架。

id
role_name
role_code
valid

1

admin

ADMIN

true

2

vip

VIP

true

3

vip2

VIP2

true

4

vip3

VIP3

true

5

guest

GUEST

true

示例代码请访问。

初始化工程

1. 在 上初始化工程,添加以下4个依赖:

  • Lombok

  • Spring Web

  • Validation

  • HyperSQL Database

2. 引入DoytoQuery

在pom.xml中添加如下依赖:

<dependencies>
    <dependency>
        <groupId>win.doyto</groupId>
        <artifactId>doyto-query-jdbc</artifactId>
        <version>${doyto-query.version}</version>
    </dependency>
    <dependency>
        <groupId>win.doyto</groupId>
        <artifactId>doyto-query-web</artifactId>
        <version>${doyto-query.version}</version>
    </dependency>
    <dependency>
        <groupId>win.doyto</groupId>
        <artifactId>doyto-query-dialect</artifactId>
        <version>${doyto-query.version}</version>
    </dependency>
    ...
</dependencies>

3. 添加默认Web配置

DemoApplication需要继承win.doyto.query.web.WebMvcConfigurerAdapter

package win.doyto.query.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import win.doyto.query.web.WebMvcConfigurerAdapter;

@SpringBootApplication
public class DemoApplication extends WebMvcConfigurerAdapter {

    public static void main(String[] args) {
        SpringApplication.run(DoytoQueryDemoApplication.class, args);
    }

}

4. 配置分页插件

doyto:
  query:
    config:
      dialect: win.doyto.query.dialect.HSQLDBDialect
      map-camel-case-to-underscore: true

初始化数据

在src/main/resources下创建schema.sql:

SET DATABASE SQL SYNTAX MYS TRUE;

drop table t_role if exists;
create table t_role
(
    id        bigint generated by default as identity (start with 1) primary key,
    role_name VARCHAR(100) not null,
    role_code VARCHAR(100) not null,
    valid     boolean DEFAULT TRUE
);

INSERT INTO t_role (role_name, role_code) VALUES ('admin', 'ADMIN');
INSERT INTO t_role (role_name, role_code) VALUES ('vip', 'VIP');
INSERT INTO t_role (role_name, role_code) VALUES ('vip2', 'VIP2');
INSERT INTO t_role (role_name, role_code) VALUES ('vip3', 'VIP3');
INSERT INTO t_role (role_name, role_code) VALUES ('guest', 'GUEST');

创建业务类

在packagewin.doyto.query.demo.module.role下,创建以下三个类:

  • RoleEntity,用于映射表字段

package win.doyto.query.demo.module.role;

import lombok.Getter;
import lombok.Setter;
import win.doyto.query.entity.AbstractPersistable;
import win.doyto.query.validation.CreateGroup;

import javax.persistence.Table;
import javax.validation.constraints.NotNull;

@Getter
@Setter
@Table(name = "t_role")
public class RoleEntity extends AbstractPersistable<Integer> {

    @NotNull(groups = CreateGroup.class)
    private String roleName;

    @NotNull(groups = CreateGroup.class)
    private String roleCode;

    private Boolean valid;
}
  • RoleQuery,用于生成查询语句

package win.doyto.query.demo.module.role;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import win.doyto.query.core.PageQuery;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class RoleQuery extends PageQuery {
    private String roleNameLike;
}
  • RoleController,用于提供CRUD功能和RESTful接口

package win.doyto.query.demo.module.role;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import win.doyto.query.web.controller.AbstractEIQController;

@RestController
@RequestMapping("role")
public class RoleController extends AbstractEIQController<RoleEntity, Integer, RoleQuery> {
}

测试验证

只需以上三个类就完成了整个RESTful服务的开发,接下来我们一起验证一下效果。

将org.springframework.web.servlet.mvc.method.annotation包的日志等级设置为trace,启动DemoApplication,可以看到/role/路径下已经有GET, PUT, PATCH等方法了:

s.w.s.m.m.a.RequestMappingHandlerMapping : 
	w.d.q.d.m.r.RoleController:
	{POST [/role]}: add(List)
	{PUT [/role/{id}]}: update(Serializable,Object)
	{GET [/role]}: paging(PageQuery)
	{GET [/role/{id}]}: getById(Serializable)
	{DELETE [/role/{id}]}: deleteById(Serializable)
	{PATCH [/role/{id}]}: patch(Serializable,Object)

然后通过curl访问一下分页查询接口:

curl 'http://localhost:8080/role/?roleNameLike=vip&pageNumber=2&pageSize=2&sort=id,desc'

{
  "code": 0,
  "message": "ok",
  "data": {
    "list": [
      {
        "id": 2,
        "roleName": "vip",
        "roleCode": "VIP",
        "valid": true
      }
    ],
    "total": 3
  },
  "success": true
}

可以看到我们使用roleNameLike=vip过滤出3条数据id=[2,3,4]``,再根据id倒序排列并通过pageNumber=2和pageSize=2`查询出了第二页id为2的记录。

再通过单元测试来验证一下:

@Test
@Rollback
void patchRole() throws Exception {
    RequestBuilder requestBuilder = patch("/role/2")
        .content("{\"roleName\":\"new role\"}")
        .contentType(MediaType.APPLICATION_JSON);
    performAndExpectSuccess(requestBuilder);
    performAndExpectSuccess(get("/role/2"))
            .andExpect(jsonPath("$.data.roleName").value("new role"))
    ;
}

DoytoQuery默认提供的是MySQL的分页插件,而本demo使用的数据库是,所以我们这里需要引入doyto-query-dialect,然后在spring的application.yaml文件里配置使用。另外这里列名是小写加下划线的格式,这里同时配置一下map-camel-case-to-underscore为true,表示将驼峰形式的字段名映射为下划线形式的列名:

更多查询字段的用法请参考。

完整的测试用例请查看。

Github
Spring Initializer
HSQLDB
查询对象字段后缀汇总
这里