数据库:
1.表里记录createTime/updateTime/creator/updator
2.数据库自带插入时间和更新时间功能,create_time 自动插入,update_time 自动更新时间。貌似用项目传输时间更好,避免服务器和数据时间不统一等问题。
3.LEFT JOIN 关键字会从左表 (table_name1) 那里返回全部的行,即便在右表 (table_name2) 中没有匹配的行。
4.在mybatis配置文件中不能有parameterMap,应该是parameterType
5.SQL条件查询中:防止某些list为空,查询全部记录的问题
7.重要的数据。记录操做历史,操做人
8.统一经常使用数据库字段:命名,值(男女,是否删除)等。
9.使用datetime,不适用timestamp,时间由程序传过去,而不是使用数据库方法。
10.尽可能建立关联关系表,不要经过分隔符将多个数据存储在一个字段里。
11.尽可能采用单表查询,减小联合查询,下降数据库IO。
12.批量插入/更新时使用批量语句,不要循环插入。
13.多个表数据更新/插入时,必定要考虑是否须要事务。
14.查出来的数据通常要有排序,能够按主键或建立时间排序等
15.自动分页:经过分页拦截器进行分页操做,返回分页的封装对象。
16.不推荐使用外键。
17.修复valid脏数据的方法。现将值为0的数据设置为3,而后修复值为1的数据为0.再将值为3的数据统一改为
18.@Param("vo") 定义xml中属性名称
19.XML的SQL中,避免出现list的子项中的item名字,跟其余字段相同。
20.XML中判断list的值是否为null,是否为空集合。前端
代码:
1.对单独记录进行操做的时候,必定要验证当前记录的状态,避免误操做屡次单击。通常方法有两种,forupdate和redis。forupdate须要加过时时间。
2.某些字段惟一的(如手机号),在保存前必定要验证手机号是否存在,而且数据库字段设置字段惟一
3.事务处理:@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Exception.class, timeout = 10)
4.枚举:有获取列表的方法;获取code值尽可能简单,常比较,避免出错。
5.BeanMapper.copy():DozerBeanMapper dozer = new DozerBeanMapper(); dozer.map(source, destinationObject);
6.登陆时将信息缓存到redis中,退出登陆时,将登陆信息从redis中删除。
7.cookie登陆(App端携带header),拦截器去缓存中验证是否有登陆信息。
8.DTO对象以及返回对象,都须要实现Serializable接口。
9.dubbo 接口通常返回封装好的对象。方便之后修改结构,而不用修改接口参数。
10.提供前端接口返回值,通常是封装成一个对象。全部返回结果都封装在ResponseDTO T data(返回数据)/int rc(return code)/String msg(返回信息)
11.自动分页:经过分页拦截器进行分页操做,返回分页的封装对象。
12.经常使用公共类放到一个jar包里
13.通常为了避免破坏实体类和数据库表一一对应的接口,咱们会新建一个DTO(Data Transfer Object)做为先后端的传输对象。DTO实体类中加入一些冗余的字段。例如:cityName等。
14.经过spring配置加载一些properties文件,在java代码中经过 @Value("${oss.accessKeyId}")的形式直接注入属性值
<!-- 配置文件加载 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:server.properties</value>
</list>
</property>
</bean>
15.代码自动生成工具
16.Amber、postmain模拟测试工具
17.密码加密
18.工具类
19.枚举类
20.记录操做历史记录:例如记录一个状态的变迁历史
21.自定义异常,封装要返回的内容
22.经过ThreadLocal传递当前用户主键
23.详细的注释
24.经过继承,继承一些封装好的方法。例如:返回值 success("添加新用户成功",count);
25.经过日志文件,将日志记录内容,精确到方法的位置。
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%thread] %-5level %d{yyyy-MM-dd HH:mm:ss.SSS} %logger{5}.%M[%L] - %msg%n</pattern>
</encoder>
26.记录操做历史记录
27.编写默认回复给前台的代码,经过继承等方式,避免每次新写。
28.版本升级提示,换行。能够在文本中换行完毕后,直接粘贴进去
29.pom.xml某些依赖文件提示missing,可能须要加仓库地址
30.只作逻辑删除,不作物理删除,使用valid标识,默认0无效。
31.json格式传递复合对象(@RequestBody EmployeeDTO employeeDTO)
32.一个tomcat部署一个应用,部署到ROOT
33.指定堆内存大小配置-Xms512m –Xmx512m
34.内网dev/test全部tomcat打开远程调试端口
35.dubbo接口有变化时,须要升级api版本号,开发前提早约定版本号,deploy到maven私服。(目前内部系统不强制要求,但对外提供接口系统必须区分版本号)
36.远程调试功能
37.前端按钮被单击后,应该置灰,防止屡次点击。后端要验证是否重复提交。forupdate 或 redis
38.完善的注释
39.分布式系统事务,请求先落地,经过status标识请求状态,单一系统内保证事务。异常状态处理人工介入。
40.适当的冗余字段
41.改动原有接口时,必定要确保之前功能正常工做。修改数据库时,应该考虑对原代码的影响。
42.服务器部署环境:开发,测试,公测,生产
43.项目结构:app,web,erp
44.灰度上线:链接生产数据库,但只对内部人员提供服务
45.配置文件profile保存:aliyun,test,dev,dev1,dev2……
46.版本管理:master,dev,新功能,bug修复,上线打tag java
日志:
1.敏感数据打***,身份证/银行卡号/密码
2.统一使用slf4j+logback。线上日志统一 /home/car-league/logs/项目/info.log+error.log
3.未知异常记录堆栈信息方便调试;已知异常(自定义异常,密码错误等)记录异常信息便可。
4.日志记录,记录当前用户的主键,方便之后查看日志。记录全部入参和出参数。
5.日志编辑器:private static Logger logger = LoggerFactory.getLogger(EmployeeController.class);web