关于前端:比-MyBatis-快了-100-倍

3次阅读

共计 3787 个字符,预计需要花费 10 分钟才能阅读完成。

比 MyBatis 效率快 100 倍的条件检索引擎,天生反对联表,使一行代码实现简单列表检索成为可能!

2 开源协定

应用 Apache-2.0 开源协定

3 界面展现

你的产品给你画了以上一张图,还附带了一些要求:

  • 检索后果分页展现
  • 能够按任意字段排序
  • 按检索条件统计某些字段值

这时候,后盾接口该怎么写???应用 Mybatis 或 Hibernate 写 100 行代码是不是还打不住?而应用 Bean Searcher,只需 一行代码 便可实现上述要求!!!

4 性能概述

  • 反对 实体多表映射
  • 反对 动静字段运算符
  • 反对 分组聚合 查问
  • 反对 Select | Where | From 子查问
  • 反对 实体类嵌入参数
  • 反对 字段转换器
  • 反对 Sql 拦截器
  • 反对 数据库 Dialect 扩大
  • 反对 多数据源 与 动静数据源
  • 反对 注解缺省 与 自定义
  • 反对 字段运算符 扩大
  • 等等

疾速开发

应用 Bean Searcher 能够极大节俭后端的简单列表检索接口的开发工夫

集成简略

能够和任意 Java Web 框架集成,如:SpringBoot、Grails、Jfinal 等

扩展性强

面向接口设计,用户可自定义扩大 Bean Searcher 中的任何组件

反对 注解缺省

约定优于配置,可省略注解,可复用原有域类,同时反对自定义注解

反对 多数据源

分库分表?在这里特地简略,辞别分库分表带来的代码熵值增高问题

反对 Select 指定字段

同一个实体类,可指定只 Select 其中的某些字段,或排除某些字段

反对 参数过滤器

反对增加多个参数过滤器,可自定义参数过滤规定

反对 字段转换器

反对增加多个字段转换器,可自定义数据库字段到实体类字段的转换规则

反对 SQL 拦截器

反对增加多个 SQL 拦截器,可自定义 SQL 生成规定

5 技术选型

  • 框架目标:只一行代码实现:多表联查分页搜寻任意字段组合过滤任意字段排序多字段统计
  • 架构图:

为什么用

这绝不是一个反复的轮子

尽管 增删改 是 hibernate 和 mybatis、data-jdbc 等等 ORM 的强项,但查问,特地是有 多条件、联表、分页、排序 的简单的列表查问,却始终是它们的弱项。

传统的 ORM 很难用较少的代码实现一个简单的列表检索,但 Bean Searcher 却在这方面下足了功夫,这些简单的查问,简直只用一行代码便能够解决。

  • 例如,这样的一个典型的需要:

后端须要写一个检索接口,而如果用传统的 ORM 来写,代码之简单是能够设想的。

而 Bean Searcher 却能够:

只一行代码实现以上性能

首先,你有一个实体类:

@SearchBean(tables="user u, role r", joinCnotallow="u.role_id = r.id", autoMapTo="u")

public class User{
  private long id;
  private String username;
  private int status;
  private int age;
  private String gender;
  private Date joinDate;
  private int roleId;
  @DbField("r.name")
  private String roleName;
  // Getters and setters...
} 而后你就能够用一行代码实现这个用户检索接口:
@RestController
@RequestMapping("/user")
public class UserController{

    @Autowired
    private BeanSearcher beanSearcher; // 注入 BeanSearcher 的检索器

    @GetMapping("/index")
    public SearchResult<User> index(HttpServletRequest request){
        // 这里只写一行代码
        return beanSearcher.search(User.class, MapUtils.flat(request.getParameterMap()), new String[]{ "age"});
    }

}

这一行代码实现了以下性能:

  • 多表联查
  • 分页搜寻
  • 组合过滤
  • 任意字段排序
  • 字段统计

例如,该接口反对如下申请:

  • GET: /user/index
  • 无参申请(默认分页):
  • {“dataList”: [ { “id”: 1, “username”: “Jack”, “status”: 1, “level”: 1, “age”: 25, “gender”: “Male”, “joinDate”: “2021-10-01”}, … // 默认返回 15 条数据 ], “totalCount”: 100, “summaries”: [2500 // age 字段统计] }
  • GET: /user/index? page=1 & size=10
  • 指定分页参数
  • GET: /user/index? status=1
  • 返回 status = 1 的用户
  • GET: /user/index? name=Jac & name-op=sw
  • 返回 name 已 Jac 结尾的用户
  • GET: /user/index? name=Jack & name-ic=true
  • 返回 name = Jack(疏忽大小写)的用户
  • GET: /user/index? sort=age & order=desc
  • 按字段 age 降序查问
  • GET: /user/index? notallow=username,age
  • 只检索 username 与 age 两个字段:
  • {“dataList”: [ { “username”: “Jack”, “age”: 25}, … ], “totalCount”: 100, “summaries”: [2500] }
  • GET: /user/index? selectExclude=joinDate
  • 检索时排除 joinDate 字段

参数构建器

Map<String, Object> params = MapUtils.builder()
        .selectExclude(User::getJoinDate) // 排除 joinDate 字段
        .field(User::getStatus, 1) // 过滤:status = 1
        .field(User::getName, "Jack").ic() // 过滤:name = 'Jack' (case ignored)
        .field(User::getAge, 20, 30).op(Opetator.Between) // 过滤:age between 20 and 30
        .orderBy(User::getAge, "asc") // 排序:年龄,从小到大
        .page(0, 15) // 分页:第 0 页, 每页 15 条
        .build();
List<User> users = beanSearcher.searchList(User.class, params);

疾速开发

应用 Bean Searcher 能够极大地节俭后端的简单列表检索接口的开发工夫!

  • 一般的简单列表查问只需一行代码
  • 单表检索可复用原有 Domain,无需定义 SearchBean

集成简略

能够和任意 Java Web 框架集成,如:SpringBoot、Spring MVC、Grails、Jfinal 等等。

Spring Boot 我的项目,增加依赖即集成结束:

implementation 'com.ejlchina:bean-searcher-boot-stater:3.6.0'

接着便可在 Controller 或 Service 里注入检索器:

**
 * 注入 Map 检索器,它检索进去的数据以 Map 对象出现
 */
@Autowired
private MapSearcher mapSearcher;

/**
 * 注入 Bean 检索器,它检索进去的数据以 泛型 对象出现
 */
@Autowired
private BeanSearcher beanSearcher;

其它框架,应用如下依赖:

implementation 'com.ejlchina:bean-searcher:3.6.0'

而后能够应用 SearcherBuilder 构建一个检索器:

DataSource dataSource = ... // 拿到利用的数据源

// DefaultSqlExecutor 也反对多数据源
SqlExecutor sqlExecutor = new DefaultSqlExecutor(dataSource);

// 构建 Map 检索器
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        .sqlExecutor(sqlExecutor)
        .build();

// 构建 Bean 检索器
BeanSearcher beanSearcher = SearcherBuilder.beanSearcher()
        .sqlExecutor(sqlExecutor)
        .build();

扩展性强

面向接口设计,用户可自定义扩大 Bean Searcher 中的任何组件!

比方你能够:

  • 自定义 FieldOp 来反对更多的字段运算符
  • 自定义 FieldConvertor 来反对任意的 非凡字段类型
  • 自定义 DbMapping 来实现自定义注解,或让 Bean Searcher 辨认其它 ORM 的注解
  • 自定义 ParamResolver 来反对其它模式的检索参数
  • 自定义 Dialect 来反对更多的数据库
  • 等等..
    欢送关注我的公众号:敲代码的老贾,回复“支付”赠送《Java 面试》材料,阿里,腾讯,字节,美团,饿了么等大厂
正文完
 0