Bean Searcher配合SpringBoot的使用详解

先吐槽一下,现在的Bean Searcher操作手册的指引弱的可怜…
对我这样的小白及其不友好

话不多说直入主题

1、首先肯定是得引入依赖

<dependency>
            <groupId>com.ejlchina</groupId>
            <artifactId>bean-searcher-boot-starter</artifactId>
            <version>${searcher.version}</version>
        </dependency>

2、再配置一下设置

bean-searcher:
  params:
    pagination:
      start: 1

其他的依赖、数据源啥的比较常用这里就不展出

3、然后就是创建实体类

由于我为了快速就用了之前使用MyBatis做持久化的一个项目,所以会有Mapper啥的,不过看官方文档和Demo上的例子,好像也没用到所以应该没影响

!!!为了直观我直接Copy源代码上来,可以先跳过这个源码直接看重点介绍

package com.so2.core.model.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import com.ejlchina.searcher.bean.BeanAware;
import com.ejlchina.searcher.bean.DbField;
import com.ejlchina.searcher.bean.SearchBean;
import lombok.Data;
/**
 1. 用户表
 2. @author Lynn
 3. @TableName user
 */
@TableName(value ="user")
@Data
@SearchBean( tables = "user")
public class User implements Serializable, BeanAware {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    @DbField("id")
    private Integer id;
    /**
     * 用户名
     */
    @DbField("name")
    private String name;
    /**
     * 用户 id
     */
    @DbField("userId")
    private Integer userid;
    /**
     * 用户邮箱
     */
    @DbField("email")
    private String email;
    /**
     * 用户密码
     */
    @DbField("password")
    private String password;
    /**
     * 用户是否被封禁, 0-未封禁,1-已封禁
     */
    @DbField
    private Byte delflag;
    /**
     * 用户权限, 0-游客, 1-普通用户, 2-会员用户, 3-管理员
     */
    @DbField("role")
    private Byte role;
    /**
     * 注册日期
     */
    @DbField("registerTime")
    private Date registertime;
    @Override
    public boolean equals(Object that) {
        if (this == that) {
            return true;
        }
        if (that == null) {
            return false;
        }
        if (getClass() != that.getClass()) {
            return false;
        }
        User other = (User) that;
        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
            && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName()))
            && (this.getUserid() == null ? other.getUserid() == null : this.getUserid().equals(other.getUserid()))
            && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail()))
            && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword()))
            && (this.getDelflag() == null ? other.getDelflag() == null : this.getDelflag().equals(other.getDelflag()))
            && (this.getRole() == null ? other.getRole() == null : this.getRole().equals(other.getRole()))
            && (this.getRegistertime() == null ? other.getRegistertime() == null : this.getRegistertime().equals(other.getRegistertime()));
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
        result = prime * result + ((getName() == null) ? 0 : getName().hashCode());
        result = prime * result + ((getUserid() == null) ? 0 : getUserid().hashCode());
        result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode());
        result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode());
        result = prime * result + ((getDelflag() == null) ? 0 : getDelflag().hashCode());
        result = prime * result + ((getRole() == null) ? 0 : getRole().hashCode());
        result = prime * result + ((getRegistertime() == null) ? 0 : getRegistertime().hashCode());
        return result;
    }
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", id=").append(id);
        sb.append(", name=").append(name);
        sb.append(", userid=").append(userid);
        sb.append(", email=").append(email);
        sb.append(", password=").append(password);
        sb.append(", delflag=").append(delflag);
        sb.append(", role=").append(role);
        sb.append(", registertime=").append(registertime);
        sb.append("]");
        return sb.toString();
    }
    @Override
    public void afterAssembly() {
        System.out.println("--------使用了afterAssembly方法----------");
    }
}

创建实体类需要注意几点

  1. 类,要在类名加上 @SearchBean( tables = “定义表名”) 注解,而且必须加上表名,我之前不加表名会报错,而且加上表名在进行多表查询时才能复用
  2. 实现接口,必须要实现 BeanAware或者ParamAware接口,重写的方法可以不做任何改动。
  3. 字段,必须要在需要得到响应的字段或查询的字段上加上**@DbField(“自定义字段名”)** 注解,而且必须指定字段名,且加上注解的字段必须 大于0 | 大于被查询数
  4. get set,加上LomBok的 @Data 注解,或使用idea的快速生成

4、最后就是编写Controller层

先粘上源码
同上,也可先跳过源码直接看注意事项

package com.so2.core.controller;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ejlchina.searcher.MapSearcher;
import com.ejlchina.searcher.SearchResult;
import com.ejlchina.searcher.Searcher;
import com.ejlchina.searcher.util.MapUtils;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.so2.core.service.impl.UserServiceImpl;
import com.so2.core.model.entity.User;
import com.so2.core.base.BaseResponse;
import com.so2.core.base.ResultUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.catalina.util.RequestUtil;
import org.apache.ibatis.util.MapUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 描述:测试类
 *
 * @author: Lynn
 * @date: 2021/12/3
 */
@Api(tags = "测试接口类")
@ApiSupport(author = "Lynn", order = 07)
@RestController
@RequestMapping("/test")
public class HealthController {
	//MyBatis
    @Resource
    private UserServiceImpl user;
	//注入MapSearcher
    @Autowired
    private MapSearcher mapSearcher;
//	先使用MyBatis方法做个对照组
//	提示:BaseResponse是我写的响应类,而ResultUtils是返回工具类,返回的结果包含了响应码、响应数据、控制台提示
//    千万别加这个,一旦加了就会报空指针异常
//    @ApiImplicitParam(name = "userName", value = "用户账号名", required = true)
    @ApiOperation(value = "通过用户账号名获取信息")
    @GetMapping("/getN")
    @ResponseBody
    public BaseResponse<List<User>> testGetUser(String userName){
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.like("name", userName);
        return ResultUtils.success(user.list(qw), "查找成功");
    }
//	这个方法比较多变,官方文档也有说明
    @ApiOperation(value = "通过新的Searcher方法来进行便捷查找")
    @ResponseBody
    @GetMapping("/searcherGet")
    public Object getForSearcher(HttpServletRequest request){
		//	可以在builder()后使用其他方法进行数据筛选
        return mapSearcher.search(User.class,
                MapUtils.builder()
                        .build());
    }
//	这个方法可以传入值进行动态查找
    @ApiOperation(value = "使用Searcher “动态“ 查找字段")
    @ResponseBody
    @GetMapping("/searcherGetName")
    public BaseResponse<Object> dynamicField(){
        Map<String, Object> map = new HashMap<>();
        map.put("name", "Lynn");
        return ResultUtils.success(mapSearcher.searchList(User.class, map), "------动态查询字段成功------");
    }

}

Controller层编写的注意事项

  1. 需要先注入MapSearcherBeanSearcher(官方文档那个提示构建构造器的步骤坑死我了,还以为要写一个单例Bean来进行配置)
  2. 看源码注释,哈哈
  3. (dog这个源码比较粗糙,看的出来我并没有对一些可能出现的异常、情况进行捕获。

看看我查询返回的数据

MyBatis查询

Bean Searcher查询

返回加了字段名字段的所有信息

查找字段名为name且值为Lynn的加了字段名字段的信息

结语

最后要说一句,现在网上的文章很多都是抄来抄去的,有互相抄的也有直接搬官方文档的,所以大家在学一样东西之前如果有官方文档官方示例一定要先去看,别问我为什么懂这个道理的…

最后附上Bean Searcher官方文档地址和示例的gitee仓库

官方文档地址:https://searcher.ejlchina.com/

官方Gitee仓库地址:git@gitee.com:ejlchina-zhxu/bean-searcher.git

到此这篇关于Bean Searcher配合SpringBoot的使用的文章就介绍到这了,更多相关Bean Searcher配合SpringBoot使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅析Bean Searcher 与 MyBatis Plus 区别介绍

    目录 区别一(基本) 区别二(高级查询) 1)使用 MyBatis Plus 查询: 2)使用 Bean Searcher 查询: 区别三(逻辑分组) 区别四(多表联查) 区别五(使用场景) 疑问 1)这貌似开放很大的检索能力,风险可控吗? 条件约束 排序约束 2)使用 Bean Searcher 后 Controller 的入参必须是 Map 类型? 3)前端乱传参数的话,存在 SQL 注入风险吗? 4)可以随意传参,会让用户获取本不该看到的数据吗? 总结 Bean Searcher 号称 任

  • Bean Searcher配合SpringBoot的使用详解

    先吐槽一下,现在的Bean Searcher操作手册的指引弱的可怜…对我这样的小白及其不友好 话不多说直入主题 1.首先肯定是得引入依赖 <dependency> <groupId>com.ejlchina</groupId> <artifactId>bean-searcher-boot-starter</artifactId> <version>${searcher.version}</version> </dep

  • SpringBoot bean查询加载顺序流程详解

    目录 背景 探索-源码 进一步思考 背景 SpringBoot bean 加载顺序如何查看,想看加载了哪些bean, 这些bean的加载顺序是什么? 实际加载顺序不受控制,但会有一些大的原则: 1.按照字母顺序加载(同一文件夹下按照字母数序:不同文件夹下,先按照文件夹命名的字母顺序加载)2.不同的bean声明方式不同的加载时机,顺序总结:@ComponentScan > @Import > @Bean   这里的ComponentScan指@ComponentScan及其子注解,Bean指的是

  • springboot集成es详解

    1.导入 maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-dataelasticsearch</artifactId> <dependency> 注意 保持版本一致 我用的是7.6.2版本的 <properties> <java.version>1.8</jav

  • Java SpringBoot 集成 Redis详解

    目录 1.概述 Redis是什么? Redis能该干什么? 特性 2.测试Redis 3.自定义redisTemplate 1.概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加

  • Java SpringBoot自定义starter详解

    目录 一.什么是SpringBoot starter机制 二.为什么要自定义starter ? 三.什么时候需要创建自定义starter? 四.自定义starter的开发流程(案例:为短信发送功能创建一个starter) 1.细节:命名规范 2.必须引入的依赖 3.编写相关属性类(XxxProperties):例如 SmsProperties.java 4.编写Starter项目的业务功能 5.编写自动配置类AutoConfig 6.编写spring.factories文件加载自动配置类 7.打

  • springboot与vue详解实现短信发送流程

    目录 一.前期工作 1.开启邮箱服务 2.导入依赖 3.配置application.yaml文件 二.实现流程 1.导入数据库 2.后端实现 编写实体类 编写工具类ResultVo 编写dao层接口 配置dao层接口的数据库操作 编写service层接口 编写service层的实现方法 实现controller层 Test代码 前端页面的实现 运行截图+sql图 总结 一.前期工作 1.开启邮箱服务 开启邮箱的POP3/SMTP服务(这里以qq邮箱为例,网易等都是一样的) 2.导入依赖 在spr

  • Spring Bean注册与注入实现方法详解

    目录 1. 逻辑上的 Bean 注册 2. XML 注册 Bean 到自建的库中 2.1 工厂方法 2.2 使用工厂方法和实例化工厂注册 Bean 3. XML 配合注解进行 Bean 注册 4. 使用注解注册 Bean 4.1 注解方式注册的必要条件 4.2 用到的注解 4.3 @Component注解注入 4.4 使用 @Bean 注解注册 5. 通过注解注入 Bean 6. 注入时的一个坑点 7. 获取 库中的对象 上接[Spring]spring核心思想——IOC和DI 上篇文章结尾简单

  • SpringBoot 统一异常处理详解

    代码结构 配置pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/

  • Java下SpringBoot创建定时任务详解

    序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了. 三.基于注解设定多线程定时任务 一.静态:基于注解 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响. 1.创建定时器 使用SpringBoo

  • SpringBoot任务之详解邮件任务

    01: 异步任务 02: 定时任务 一.SpringBoot--任务:邮件任务 1.1 添加依赖(增加邮件支持) pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 1.2 获取第三方授权码 1.2.1 登录QQ邮箱 1.2.2 点

随机推荐