聊聊最近火起的Bean Search

1,035 阅读2分钟

image.png

1:Bean Search是什么

官网解释:

专注高级查询的只读 ORM,天生支持联表,免 DTO/VO 转换,使一行代码实现复杂列表检索成为可能

这么说吧。其实就跟MyBatis,MyBatis-plus,hibernate差不多,都是一个根据条件去数据库查询的一个框架而已。只不过Bean Search相比来说更高级, 为什么说更高级呢?? 因为在使用MyBatis-plus时候,我们需要这样做


List<StudentEntity> studentEntityList = studentMapper.selectList(
                  new QueryWrapper<StudentEntity>().eq("name", "").orderByAsc(""));

查询条件需要我们自己去封装,我们还要创建对应的Mapper类。还要创建对应的Service等等

@Mapper
public interface StudentMapper extends BaseMapper<StudentEntity> {
}

但是使用Bean Search呢。就一行代码就搞定了,比如下面这样,不需要建什么Mapper类,也不用建Service了,更不需要使用QueryWrapper来拼接查询条件了

@RestController
@RequestMapping("/smsUser")
public class SmsUserController {


    @Autowired
    private MapSearcher mapSearcher;

    @GetMapping("/queryAll")
    public SearchResult<Map<String, Object>> queryAll(HttpServletRequest request) {
        SearchResult<Map<String, Object>> mapSearchResult =
                mapSearcher.search(SmsUser.class, MapUtils.flat(request.getParameterMap()));
        return mapSearchResult;
    }
}

2:SpringBoot整合Bean Search

2.1:加依赖

<dependency>
    <groupId>com.ejlchina</groupId>
    <artifactId>bean-searcher-boot-starter</artifactId>
    <version>3.6.3</version>
</dependency>

2.2:写配置

没有配置

2.3:使用

// 在Controller中直接注入即可
@Autowired
private MapSearcher mapSearcher;

@Autowired
private BeanSearcher beanSearcher;

3: 案例

准备User实体类

@Data
public class SmsUser implements Serializable {


    private Long id;
    private String username;
    private String password;
    private Integer status;
    private Integer isDel;
    private Date createdAt;
    private Date updatedAt;
}

创建一个Controller

@RestController
@RequestMapping("/smsUser")
public class SmsUserController {


    @Autowired
    private MapSearcher mapSearcher;

    @Autowired
    private BeanSearcher beanSearcher;


    @GetMapping("/query")
    public SearchResult<Map<String, Object>> query(HttpServletRequest request) {
        SearchResult<Map<String, Object>> mapSearchResult =
                mapSearcher.search(SmsUser.class, MapUtils.flat(request.getParameterMap()));
        return mapSearchResult;
    }
}

开始使用

  
    //  查询 username = "coco" and isDel = 0 limit 0,10
    @GetMapping("/queryAll")
    public SearchResult<Map<String, Object>> queryAll() {
        Map<String, Object> params = new HashMap<>();
        params.put("username", "coco");
        params.put("isDel", 0);
        params.put("page", 0);
        params.put("size",10);
        SearchResult<Map<String, Object>> mapSearchResult =
                mapSearcher.search(SmsUser.class, params);
        return mapSearchResult;
    }

- 模糊查询
 
  username like %coco% and isDel = 0 limit 0,10
  username-op = ct 代表的就是 username这个字段包含 coco的所有记录
  username-op = sw 代表的就是 username这个字段以coco开头的所有记录
  username-op = ew  代表的就是 username这个字段以coco结尾的所有记录
  
  @GetMapping("/queryAll")
  public SearchResult<Map<String, Object>> queryAll() {
    Map<String, Object> params = new HashMap<>();
    params.put("username", "coco");
    params.put("username-op", "ct");
    SearchResult<Map<String, Object>> mapSearchResult =
            mapSearcher.search(SmsUser.class, params);
    return mapSearchResult;
  }



- 分页查询

  page:当前第几页(从0开始,第一页 = 0)
  size:每页显示的数量
  
  @GetMapping("/queryAll")
  public SearchResult<Map<String, Object>> queryAll() {
    Map<String, Object> params = new HashMap<>();
    params.put("page", 0);
    params.put("size", 10);
    SearchResult<Map<String, Object>> mapSearchResult =
            mapSearcher.search(SmsUser.class, params);
    return mapSearchResult;
  }
  
  
// 多值查询

@GetMapping("/queryAll")
public SearchResult<Map<String, Object>> queryAll() {
    Map<String, Object> params = new HashMap<>();
    params.put("id-0", 1);
    params.put("id-1", 2);
    params.put("id-2", 3);
    params.put("id-op","mv");  // id有多个值
    SearchResult<Map<String, Object>> mapSearchResult =
            mapSearcher.search(SmsUser.class, params);
    return mapSearchResult;
}

更多的操作API在官网有详细的介绍: searcher.ejlchina.com/guide/lates…

3:我对Bean Search的感觉

我们可以发现,之所以可以通过一行代码就完成查询,但是条件都是要由前端同学传递过来的。对于后端同学来说确实是简化了开发,但是无疑给前端造成了更多的工作量。刚开始使用确实不是很熟悉,使用起来没有MyBatis-plus那么便捷,暂时的话没打算在新项目中使用。怕被前端同学围殴.