springboot 批量更新_一个基于Spring Boot的API、RESTful API项目骨架

作者:简单的土豆

www.jianshu.com/p/99fcead32d35

前言

最近使用Spring Boot 配合 MyBatis 、通用Mapper插件、PageHelper分页插件 连做了几个中小型API项目,做下来觉得这套框架、工具搭配起来开发这种项目确实非常舒服,团队的反响也不错。在项目搭建和开发的过程中也总结了一些小经验,与大家分享一下。

在开发一个API项目之前,搭建项目、引入依赖、配置框架这些基础活自然不用多说,通常为了加快项目的开发进度(早点回家)还需要封装一些常用的类和工具,比如统一的响应结果封装、统一的异常处理、接口签名认证、基础的增删改差方法封装、基础代码生成工具等等,有了这些项目才能开工。

然而,下次再做类似的项目上述那些步骤可能还要搞一遍,虽然通常是拿过来改改,但是还是比较浪费时间。所以,可以利用面向对象抽象、封装的思想,抽取这类项目的共同之处封装成了一个种子项目(估计大部分公司都会有很多类似的种子项目),这样的话下次再开发类似的项目直接在该种子项目上迭代就可以了,减少无意义的重复工作。

在相关项目上线之后,我花了点时间对该种子项目做了一些精简,并且已经把该项目分享到GitHub上面了,如果你正准备做类似项目的话,可以去克隆下来试试。

项目地址&使用文档:https://github.com/lihengming/spring-boot-api-project-seed 。

如果在使用中发现问题或者有什么好建议的话欢迎提issue或pr一起来完善它。

特征&提供

最佳实践的项目结构、配置文件、精简的POM

4133d7dea2fb9c9802ba5666afe691dd.png

注:使用代码生成器生成代码后会创建model、dao、service、web等包。

统一响应结果封装及生成工具

e7248bae34417611161c623102dd1e3c.png

统一异常处理

cf63117b440555525019265691bbb614.png

常用基础方法抽象封装

public interface Service {    void save(T model);//持久化    void save(List models);//批量持久化    void deleteById(Integer id);//通过主鍵刪除    void deleteByIds(String ids);//批量刪除 eg:ids -> “1,2,3,4”    void update(T model);//更新    T findById(Integer id);//通过ID查找    T findBy(String fieldName, Object value) throws TooManyResultsException; //通过Model中某个成员变量名称(非数据表中column的名称)查找,value需符合unique约束    List findByIds(String ids);//通过多个ID查找//eg:ids -> “1,2,3,4”    List findByCondition(Condition condition);//根据条件查找    List findAll();//获取所有}

提供代码生成器来生成基础代码

public abstract class CodeGenerator {   ...    public static void main(String[] args) {        genCode("输入表名");    }    public static void genCode(String... tableNames) {        for (String tableName : tableNames) {            //根据需求生成,不需要的注掉,模板有问题的话可以自己修改。            genModelAndMapper(tableName);            genService(tableName);            genController(tableName);        }    }  ...}

CodeGenerator 可根据表名生成对应的Model、Mapper、MapperXML、Service、ServiceImpl、Controller(默认提供POST和RESTful两套Controller模板,根据需要在 genController(tableName)方法中自己选择,默认是纯POST的),代码模板可根据实际项目的需求来定制,以便渐少重复劳动。

由于每个公司业务都不太一样,所以只提供了一些简单的通用方法模板,主要是提供一个思路来减少重复代码的编写。在我们公司的实际使用中,其实根据业务的抽象编写了大量的代码模板。扩展:优秀的代码都是如何分层的?

提供简单的接口签名认证

public void addInterceptors(InterceptorRegistry registry) {    //接口签名认证拦截器,该签名认证比较简单,实际项目中可以使用Json Web Token或其他更好的方式替代。    if (!"dev".equals(env)) { //开发环境忽略签名认证        registry.addInterceptor(new HandlerInterceptorAdapter() {            @Override            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {                //验证签名                boolean pass = validateSign(request);                if (pass) {                    return true;                } else {                    logger.warn("签名认证失败,请求接口:{},请求IP:{},请求参数:{}",                            request.getRequestURI(), getIpAddress(request), JSON.toJSONString(request.getParameterMap()));                    Result result = new Result();                    result.setCode(ResultCode.UNAUTHORIZED).setMessage("签名认证失败");                    responseResult(response, result);                    return false;                }            }        });    }}
/** * 一个简单的签名认证,规则: * 1. 将请求参数按ascii码排序 * 2. 拼接为a=value&b=value...这样的字符串(不包含sign) * 3. 混合密钥(secret)进行md5获得签名,与请求的签名进行比较 */private boolean validateSign(HttpServletRequest request) {        String requestSign = request.getParameter("sign");//获得请求签名,如sign=19e907700db7ad91318424a97c54ed57        if (StringUtils.isEmpty(requestSign)) {            return false;        }        List keys = new ArrayList(request.getParameterMap().keySet());        keys.remove("sign");//排除sign参数        Collections.sort(keys);//排序        StringBuilder sb = new StringBuilder();        for (String key : keys) {            sb.append(key).append("=").append(request.getParameter(key)).append("&");//拼接字符串        }        String linkString = sb.toString();        linkString = StringUtils.substring(linkString, 0, linkString.length() - 1);//去除最后一个'&'        String secret = "Potato";//密钥,自己修改        String sign = DigestUtils.md5Hex(linkString + secret);//混合密钥md5        return StringUtils.equals(sign, requestSign);//比较}

集成MyBatis、通用Mapper插件、PageHelper分页插件,实现单表业务零SQL

使用Druid Spring Boot Starter 集成Druid数据库连接池与监控

使用FastJsonHttpMessageConverter,提高JSON序列化速度

技术选型&文档

Spring Boot:https://www.jianshu.com/p/1a9fd8936bd8MyBatis:http://www.mybatis.org/mybatis-3/zh/index.htmlMyBatisb通用Mapper插件:https://mapperhelper.github.io/docs/MyBatis PageHelper分页插件:https://pagehelper.github.io/Druid Spring Boot Starter:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter/Fastjson:https://github.com/Alibaba/fastjson/wiki/%E9%A6%96%E9%A1%B5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值