1.接口出参
接口出参应为:状态码(responseCode)+状态信息(responseMsg)+业务数据(data),所有业务数据封装在data中,data可为集合或数组,入参与出参如下
参数名 | 类型 | 是否必须 | 说明 | |
入参 | 业务参数 | - | N | 业务相关字段 |
出参 | responseCode | String | Y | 状态码 |
responseMsg | String | Y | 状态信息 | |
data | Map/List | Y | 业务数据 |
参数名 | 类型 | 是否必须 | 说明 | |
data |
业务相关数据Key | - | Y | 此data中的数据为具体业务中需要返回的数据 |
2.注释
类,接口,方法(除了get/set方法,特别简单的方法,以及实现接口的方法)都必须写注释,说明类,接口,方法的作用,像下面这样:
类名前的注释@b@/**@b@* 调用系统提供的相关服务@b@* @b@* @author junni@b@* @b@*/@b@public class MopSAOImpl implements MopSAO, BeanFactoryAware {@b@ @b@接口名前的注释@b@/**@b@* 系统提供的相关服务@b@* @b@* @author junni@b@* @b@*/@b@public interface MopSAO extends SAO {@b@ @b@方法的注释@b@/**@b@* 查询Offer满立减红包@b@* @param param@b@* @return@b@* @throws Exception@b@*/@b@Map<String, Object> queryOfferRedBag(Map param) throws SAOException;
3 格式化代码,保持代码的整洁;
4 尽量使得方法完成功能单一,使得方法得到充分的复用;
5 类名,方法名,变量名要起得有意义,做到不用注释即可理解;
6日志打印,一般在方法进入和退出点都要打上日志,关键点也要打上日志;严禁使用System.out.println打印日志,只能使用Logger
7 ESA/Controller类里只注入Service,SAO,不允许注入DAO;
8 DAO一般是注入Service里,业务逻辑都在Service里实现;
9 ESA/Controller里只进行参数的赋值,接口的调用,不允许出现较多的业务逻辑;
10 使用DTO对象来作为访问数据库接口的入参和出参;
11 不要取得数据表里所有的字段,按需读取;
12 使用equals匹配内容常量在前,变量在后,避免变量为null时运行报错
13 字符串空值判断使用StringUtils.isBank()和StringUtils.isNotBank()
14 所有实体类要重写toString()
@Override@b@ public String toString() {@b@ try {@b@ return BeanUtils.describe(this).toString();@b@ } catch (Exception e) {@b@ @b@ }@b@ return "";@b@ }
15 SQL映射文件中使用预处理语句
所有参数外部传入,不要在sql中写死,数据获取使用#{},任何情况下禁止使用${}
16 除非业务逻辑要求,任何情况下严禁在循环体中调用数据库,批量插入语句:
<!-- 新增角色权限 -->@b@<insert id="addRolePower" parameterMap="backRolePowerAddDTO">@b@ INSERT INTO role_power@b@ (@b@ id,ROLE_ID,POWER_ID,created_by,created_Date@b@ )@b@ <foreach collection="batchAddRolePowerList" separator="union all"@b@ item="rolePowerSingle" index="index">@b@ select #{rolePowerSingle.id},#{rolePowerSingle.roleId},#{rolePowerSingle.powerId},#{rolePowerSingle.createdBy},#{rolePowerSingle.createdDate}@b@ from dual@b@ </foreach>@b@</insert>@b@@b@@b@<!-- IN 语句如下:-->@b@ <if test="targetList != null and targetList.size() != 0">@b@ NOTICE_TARGET IN@b@ <foreach collection="targetList" open="(" close=")"@b@ separator="," item="targetList">@b@ #{targetList}@b@ </foreach>@b@ </if>@b@@b@<!-- 如果业务逻辑要求循环调用数据库,需进行评估-->
17 接口命名按照组件和功能模块、具体业务功能分三级
18 字段命名要与数据库同步,特殊情况需与中文名意义相符,做到不看接口文档也可知其意
19事务管理在Services层实现类中通过注解 @Transactional/在配置文件中集中配置实现,不要配置到Controller层
20 Spring注解规范::
Controller层:@Controller
Service层: @Service
Dao层: @Repository
其他组件如Util等: @Component
如果要为交给spring管理的类指定名字要以驼峰命名的规范, service 和dao层指定名字的时要指定接口的名字不能带impl
20 Service是实现业务逻辑的地方,不要和前端controller有过分的紧耦合,所以一般不建议传入的参数里出现request,response等
21数据库中需要对即时时间进行计算或比较时等需要从java中传入,不要使用数据库自带时间
22接口查询、修改数据时,需做权限校验,避免出现越权操作
23接口form中所有字段均需用String格式接收,如果用其他格式,若匹配失败会直接把异常抛到responseMsg中
{"responseCode":"900103","responseMsg":"Failed to conve.lang.NumberFormatException"}
24后台异常返回,“responseCode”和“responseMsg”这两个字段的值定义在静态常量类里,
25代码编写过程中要注意整理代码结构,提高其可读性,一般一个方法不要超过30行,如有特殊原因,需保证代码结构清晰,条例清楚,方便阅读
26全局变量规范:领域简称(大写)+应用简称(大写)+组件简称+业务功能码