上次写了一篇文章;
MybatisPlus不好用,帅小伙一气之下写了个MybatisPlusPro
首先我们来回顾一下”MybatisPlusPro“
public class BaseController<S extends IService<E>, E> {
@Autowired
protected S baseService;
@ApiOperation("增")
@PostMapping("/insert")
public ResponseUtils insert(@RequestBody E entity) {
if (baseService.save(entity)) {
return ResponseUtils.success("添加成功");
}
return ResponseUtils.msg("添加失败");
}
@ApiOperation("删")
@PostMapping("/deleteById")
public ResponseUtils delete(@RequestBody List<Integer> ids) {
baseService.removeByIds(ids);
return ResponseUtils.success("添加成功");
}
@ApiOperation("改")
@PostMapping("/updateById")
public ResponseUtils updateById(@RequestBody E entity) {
baseService.updateById(entity);
return ResponseUtils.success("添加成功");
}
@ApiOperation("查")
@GetMapping("/getById")
public ResponseUtils getById(@RequestParam Integer id) {
return ResponseUtils.success(baseService.getById(id));
}
@ApiOperation("存")
@PostMapping("/save")
public ResponseUtils save(@RequestBody E entity) {
baseService.saveOrUpdate(entity);
return ResponseUtils.success("添加成功");
}
@ApiOperation("list查")
@PostMapping("/list")
public ResponseUtils list(@RequestBody E entity) {
QueryWrapper<E> queryWrapper = ApprenticeUtil.getQueryWrapper(entity);
List<E> list = baseService.list(queryWrapper);
return ResponseUtils.success(list);
}
@ApiOperation("page查")
@PostMapping("/page")
public ResponseUtils page(@RequestBody PageParamDto<E> pageParamDto) {
//限制条件
if (pageParamDto.getPage() < 1) {
pageParamDto.setPage(1);
}
if (pageParamDto.getSize() > 100) {
pageParamDto.setSize(100);
}
E params = pageParamDto.getParams();
QueryWrapper<E> queryWrapper;
if (params != null) {
queryWrapper = new QueryWrapper<>(params);
} else {
queryWrapper = new QueryWrapper<>();
}
Page<E> page = new Page<>(pageParamDto.getPage(), pageParamDto.getSize());
//升序
String asc = pageParamDto.getAsc();
if (!ObjectUtils.isEmpty(asc) && !"null".equals(asc)) {
String[] split = asc.split(",");
queryWrapper.orderByAsc(split);
}
//降序
String desc = pageParamDto.getDesc();
if (!ObjectUtils.isEmpty(desc) && !"null".equals(desc)) {
String[] split = desc.split(",");
queryWrapper.orderByDesc(split);
}
Page<E> ePage = baseService.page(page, queryWrapper);
return ResponseUtils.success(ePage);
}
@ApiOperation("获取数量")
@PostMapping("/count")
public ResponseUtils count(@RequestBody E entity) {
QueryWrapper<E> queryWrapper = ApprenticeUtil.getQueryWrapper(entity);
long count = baseService.count(queryWrapper);
return ResponseUtils.success(count);
}
}
这个就是师徒系统中用到的核心组件之一,他实现的思想就是java的继承的特性,只要写了一个基础的接口类,然后去继承这个共用类,就可以实现最基础的增删改查,例如像下面这样:
这样就能继承自basecontroller的八个方法,我们也可以在子类中重写这个方法:
这也是用到了java特性中的重写来实现这样的行为,这样我们不仅仅是单独的继承basecontroller的方
法,还可以对他进行动态的扩充,这样就实现了类的多样性。
说好了她的用法,现在我们来细说一下这里面复杂的方法:
第一个,list查,要知道传进来泛型的字段,那我们肯定是要通过反射获取里面的字段的,这是唯一的方法,所以我把这个抽取成一个公共的方法,下面我们进去方法里面看一下:
首先第一步,是获取本身类的字段,第二行就是如果该类是子类,则需要获取父类里面的字段,第三行就是把他们里面的字段全部做一个集合,用于下一步的处理。
接着就是构建QueryWrapper,就是mybatisplus里面的查询类,通过遍历的方法依次赋值给查询类
接着就是
//忽略final字段
if (Modifier.isFinal(field.getModifiers())) {
continue;
}
设置字段的安全属性,使他可以拿到他的字段值+
field.setAccessible(true);
接着就是拿取字段值的操作了:
Object obj = field.get(entity);
if (!ObjectUtils.isEmpty(obj)) {
String name = ApprenticeUtil.humpToLine(field.getName());
eQueryWrapper.eq(name, obj);
}
这就是list查
的方法详解
接下来我们来看page查
page查之前我们来看我们的包装类是什么样子的:
要想page查,那肯定是需要我们的page和size属性,这类似就是我们sql语句中limit的里面两个参数。asc和desc字段就是根据传进来的字段进行升序和降序
//限制条件
if (pageParamDto.getPage() < 1) {
pageParamDto.setPage(1);
}
if (pageParamDto.getSize() > 100) {
pageParamDto.setSize(100);
}
为了防止前端传过来的数据过大,这里我们给他们限制好最大的查询参数。
下面就是和list查差不多的操作,只不过简化了父类的字段:
E params = pageParamDto.getParams();
QueryWrapper<E> queryWrapper;
if (params != null) {
queryWrapper = new QueryWrapper<>(params);
} else {
queryWrapper = new QueryWrapper<>();
}
组合page:
Page<E> page = new Page<>(pageParamDto.getPage(), pageParamDto.getSize());
升序,降序
//升序
String asc = pageParamDto.getAsc();
if (!ObjectUtils.isEmpty(asc) && !"null".equals(asc)) {
String[] split = asc.split(",");
queryWrapper.orderByAsc(split);
}
//降序
String desc = pageParamDto.getDesc();
if (!ObjectUtils.isEmpty(desc) && !"null".equals(desc)) {
String[] split = desc.split(",");
queryWrapper.orderByDesc(split);
}
这里给大家举个例子,例如说我要依据学生成绩和数学成绩升序,我前端传过来的参数应该是这样的:
{
”asc“:“score,mathscore”
}
这样后端就能进行分割取数了。
最后我们直接放到mybatisplus里面去查就行了:
Page<E> ePage = baseService.page(page, queryWrapper);
return ResponseUtils.success(ePage);
剩余的一些增删改查都是封装的mybatisplus里面的api,相信大家都看得懂,这里就不一一列说了。