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那么便捷,暂时的话没打算在新项目中使用。怕被前端同学围殴.