我是怎样简化开源系统中的接口的开发的?

上次写了一篇文章;

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,相信大家都看得懂,这里就不一一列说了。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYpdMoDP' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片