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的命名规则有两种:第一种是对应数据库数据缓存,使用第一种方式,其它使用第二种方式
方式一 | 表名:列主键:列名 |
方式二 | 模块名:业务功能:列名 |