DAO,最小的数据库表操作单元,避免写很复杂的jon子查询
- 业务流程处理,原则上不允许使用存储过程,因为调试维护复杂度增加,如果你要写,请提供信服的理由
- 自定义的数据操作类以Dao结尾,继承于mybatis生成的mapper类, 自定义model, 以xxBean结束
- mybatis传参规则 参数个数 <=3 使用mybatis方法参数注解 String checkPhoneisExist(@Param("phone") String phone, @Param("coordinatorId") String coordinatorId); 参数个数>3 要使用自定义的POJO类,禁止使用MAP来传参,提高代码的可读性List <coordinator> selectCoordinatorListByParams(CoordinatorQueryBean qryBean);
- 自定义mybatis映射文件xxxDao.xml 使用组合方式来定义结果集,优先使用此方式,看下面例子代码 使用继承方式定义resultMap, 要继承生成的resultMap,id要和类型同名,禁止这种名:BaseResultMap,下面例子代码 文件的sql要写注释,说明此条sql的业务目的 自定义sql片段的id命名要明确含义,禁止:Base_Column_List mybatis动态sql写法规范,禁止 where 1=1 and xxx此类写法,写法请参看数据库设计规范
1. 组合方式定义结果集resultmap,优先于继承方式一对一的组合方式 2. 继承方式定义结果集resultmap:观察 id, extends的写法<resultMap id="sysUserBean" type="com.nemo.model.sys.SysUserBean" extends="com.nemo.dao.SysUserMapper.BaseResultMap">
Service业务逻辑处理,责任要明确,代码要高内聚,代码框架设计
| service层要使用事务的方法要以insert, update, delete 开头,当方法执行发生运行时异常,spring事务代理才能正常工作 |
每个业务类只负责一个功能,总行数要在300行上下,每个业务方法在30行上下, 如果超标,考虑功代码重构拆分,不怕文件多,只怕类太大,方法太长,后人看不懂里面的业务逻辑, |
同类业务只能使用其自己的DAO,禁止使用别其它DAO,只能通过service方式调用, 如贷款信息包含有贷款人的信息,贷款的service只能使用借款人的service取信息,禁止直接使用借款人DAO查 |
| 定义service方式必须要声明抛出检查异常, f() throw OmegaException |
| 抛出的异常要定义明确的错误码与错误描述 |
| 代码禁止e.printStackTrace(); |
| 耗时业务如果使用异常方式,要记录失败,并提供失败补偿能力 |
| 必须要写单元测试 |
Controller不进行任何业务逻辑处理,主要责任是接收前端请求,并转发到后台服务处理,响应用户
| 一个方法代码最多在20行左右,业务逻辑代码要下沉到service |
| 使用swagger定义接口描述 |
| mapping url 名字要和方法名一样,有明确描述自身功能,禁止/list,ajaxlist之类命名 |
| 方法要指明支持的方法:POST GET |
| 记录入口参数日志 |
日志规范
| 原则上所有方法都要记录日志,除非有信服理由,禁止裸奔 |
日志工具使用slf4j, 日志器变量名统一小写log, 如:private Logger log = LoggerFactory.getLogger(LoanDeductPointController.class); |
记录日志代码风格:log.debug("贷款ID ={}, 扣分列表项ID={}", loanId, deductPointPkList); 禁止使用字符串拼接log.debug("贷款ID =" + loanId + ", 扣分列表项ID= deductPointPkList "); |
| 生产环境日志统一使用INFO级别 |
| 方法入口日志,出口日志使用INFO级别 |
| 业务逻辑代码日志基本使用DEBUG |
| 异常日志使用ERROR |
接入第三方服务规范
| 禁止在业务模块直接调用第三方服务接口,要按第三方服务类别归类,创建独立的代理系统提供能力给业务系统使用 |
| 如使用异步事件处理方式,必须记录失败信息,关键业务要邮件通知运维,并要提供失败补偿能力 |
枚举类定义
| 属性名称+ Enums 后缀,例如:XXXEnums,TradeTypeEnums, 都应该有一个code属性,用来表示实际的值或者存到数据库,不用name(), |
| 是否类型的枚举值,统一使用:YNEnums,值为Y或N,对应数据库类型用tinyint(1), |
| 数据库中有固定类型值的都应该用Enum, 对应新建java的XXXEnums. |
工具类定义
| 工具名称+ Utils 后缀,例如:CommUtils、MoneyUtils |
Reids Key命名规则
因为redis主要是做数据缓存,所以key的命名规则有两种:第一种是对应数据库数据缓存,使用第一种方式,其它使用第二种方式
| 方式一 | 表名:列主键:列名 |
| 方式二 | 模块名:业务功能:列名 |