首页 > 编程知识 正文

java分页查询原理思路,java语言代码大全

时间:2023-05-04 00:41:09 阅读:172669 作者:4630

这次参照蚂蚁的代码层次规格和命名规格进行整理

类命名:

1.web层类名:以Controller结尾

2.tr类名:以Facade结尾

3 .服务类名:以Manager/ManagerImpl结尾

4 .网关类名:以FrontImpl结尾

5 .抽象类名:以Abstract或Base开头

6 .异常类名:以Exception结尾

7 .测试类名:以Test结尾

8 .枚举类名:以Enum结尾

POJO命名:

1 .查询对象: xxxQuery (寻呼查询对象,仅用于dao查询数据库) ) )。

2 .数据对象: xxxDO (仅用于映射到数据库表的类、dao和manager层) )。

3 .数据交叉APP传输对象: xxxDTO (也可以用作返回调用方的模型对象) ) )。

4 .数据传输对象: xxxbo (在manager/service层APP中生成的受信任对象。 包括数据的信任信息,可以用其他方法调用) )。

5 .展示对象: xxxVO (需要向前端展示,数据脱敏) ) )。

6 .数据接收对象:xxxMethodQuery(web层请不要使用@requestBody接收参数。 如果web层中的条目大于三个参数,则强制使用xxxmethodquery对象接收参数,并使用bean validate机制验证该条目。 ) ) ) ) ) )。

方法命名:

1 .以Dao层方法命名约定find/query/count/insert/delete/update为前缀

2 .为服务层方法命名约定find/query/count/create/remove/modify添加前缀

3 .以3.Controller层方法的命名约定detail/query/count/create/remove/modify为前缀

接口类名和方法名映射规则:

1、类名上的映射为了避免机具回收等混淆业务发生之前已经发生/api/task映射,在/api/task/device发生之前/api/recycle/devicer

2、方法名称映射到类名,映射到/api/recycle/devicer的方法名称在devicer或devicer查询或更新操作中不能直接为create、query

参数命名:

1 .对成员变量、局部变量使用驼峰匹配表达式命名,不能使用“_”或特殊字符

2 .常量、枚举用“_”拆分,每个单词大写

2 .布尔型变量不能以is开头。 否则,框架分析将导致序列化错误

注意:

POJO转换:使用BeanUtils转换简单对象,并使用模型映射器转换复杂对象

*建议使用lombok ` @ data `/` @ getter `/` @ setter `提高效率

* VO向外部输出,无法列举。 可以有复杂的对象

* BO有枚举,其中可以有List、复杂的对象

* DTO没有列举,可以带List

* DO和数据库字段是一一对应的。 (在mservice和openmoitor中,此对象由dalgen生成,不允许更改) )。

分层职责:

1 .控制器层只进行参数的基本检查,业务逻辑下沉到服务层。 请遵循数据要求方式

2 .控制器严禁直接调用DAO层

3 .控制器层异常传递到框架打印

4.web请求方式应该遵循rest风格,

取得数据:GET

保存数据:POST

修正数据:PUT

删除数据:删除

5.Service尽量避免使用try{}catch{},如果需要使用try{}catch{},会“消化”捕获的异常,严禁向上层抛掷异常

6.Service层,简单接口的添加、编辑和删除不使用事务,查询不使用事务,使用编程式事务尽量减小事务粒度,提高接口性能

7.dao层尽量不返回多个表数据。 如果需要的场景,请定制ListDO模型以接收查询的数据

集合的注意事项:

1 .数组转换集

Arrays.asList ) )将数组转换为集合时,与修改集合相关的方法不可用。 其add/remove/clear抛出UnsupportedOperationException异常

此方法表示适配器模式,只需转换接口,后台数据仍为数组

2 .建议使用entrySet,而不是2.keySet。 keyset实际上转移到Iterator对象,从HashMap中检索与key对应的value,而entrySet只遍历了一次,因此对于jdk8,请使用map.foolue

each方法
3.Set集合存储的对象,该对象必须重写hashCode和equals方法,因为Set集合存储的是不重复的对象,是依靠hashCode和equals方法来保证的
 

代码格式:

1.左小括号和字符串之间不出现空格;同样,右小括号和字符串之间也不出现空格,如:方法 findUser(name)2.if/for/while/switch/do 等保留字与括号之间都必须加空格 ,如:if (){}3.任何二元、三元运算符的左右两边都需要加一个空格,如+,-,*,/,=,&&,||等的前后都加一个空格, 如:String name = "dlddc"4.tab缩进采用4个空格 idea中请勿勾选Use tab character,eclipse中,必须勾选insert spaces for tabs5.注释的双斜线与内容之间有且只有一个空格6.单行字符数限制不超过120个,超出需换行,换行时遵循如下规则(1)第二行相对第一行缩进4个空格,从第三行开始,不需要继续缩进(2)运算符与下文一起换行(3)方法调用的点符号与下文一起换行(4)方法调用时,多个参数,需要换行时,在逗号后进行(5)在括号前不要换行7.方法定义参数在定义和传入时,多个参数逗号后必须加空格8.获取单例对象需保证线程安全9.线程资源必须由线程池创建,线程不允许Executors创建,必须由ThreadPoolExecutor创建说明:Executors返回的线程池的弊端,FixedThreadPool、SingleThreadPool允许的请求队列长度为Integer.MAX_VALUE可能会堆积大量的请求,造成OOM;CachedThreadPool、ScheduledThreadPool允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量的线程,造成OOM10.当自动生成的更新sql,注意是否有bigint类型,如果有,则更新的时候注意会默认0将原有的数据覆盖了,此时需要特别注意,已经出现好几次这样的情况了
 

注释规约:
类,类中的方法必须加注释,使用javadoc规范,类注释需要记录创建人、创建时间;IDEA中可以使用Alt+Insert选择生成类注释或方法注释

日志规约:
1.禁止使用System及Throwable.printStackTrace的方式输出日志信息,必须用Logger替代。
2.对于日志的打印,任何情况下都不允许因日志错误导致业务失败。
3.日志的打印要根据具体场景,打印到指定位置,格式如下
private static final Logger logger = LoggerFactory.getLogger(LoggerNamesConstants.DYNAMIC_DEVICEMTN_DEGEST);
4.错误日志必须打印最大级别的错误信息
LoggerUtil.error(e, logger, "devicemtn DevicemtnTaskProcessFrontImpl editProcessSchema error. errorMessage: {0}", e.getMessage());
5.所有错误日志必须输出到common-error.log中。目前线上所有的错误日志会自动生成报告,限期安排人员分析与解决。

异常规约:

【强制】Java 类库中定义的可以通过预检查方式规避的RuntimeException异常不应该通过catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException等等。
说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,不得不通过catch NumberFormatException来实现。
正例:if (obj != null) {...}
反例:try { obj.method() } catch (NullPointerException e) {…}

【强制】异常不要用来做流程控制,条件控制。
说明:异常设计的初衷是解决程序运行中的各种意外情况,且异常的处理效率比条件判断方式要低很多。

【强制】catch时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的catch尽可能进行区分异常类型,再做对应的异常处理。
说明:对大段代码进行try-catch,使程序无法根据不同的异常做出正确的应激反应,也不利于定位问题,这是一种不负责任的表现。
正例:用户注册的场景中,如果用户输入非法字符,或用户名称已存在,或输入密码过于简单,在程序上作出分门别类的判断,并提示给用户。

【强制】捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。
反例:会员角标问题排查

【强制】事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。

【强制】finally块必须对资源对象、流对象进行关闭,有异常也要做try-catch。
说明:如果JDK7,可以使用try-with-resources方式。

【强制】不要在finally块中使用return。
说明:finally块中的return返回后方法结束执行,不会再执行try块中的return语句。

【强制】捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。
说明:如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。

【推荐】方法的返回值可以为null,不强制返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回null值。
说明:本规约明确防止NPE是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败,运行时异常等场景返回null的情况。

【推荐】防止NPE,是程序员的基本修养,注意NPE产生的场景:
 1) 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。
  反例:public int f(){ return Integer对象},如果为null,自动解箱抛NPE。
 2) 数据库的查询结果可能为null。
 3) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。
 4) 远程调用返回对象时,一律要求空指针判断,防止NPE。
 5) 对于session中获取的数据,建议进行NPE检查,避免空指针。
 6) 级联调用obj.getA().getB().getC();易产生NPE。
  反例:“一拍档客户”的返回值从空对象变成了null,导致线上故障,NPE无小事。

【推荐】对于公司外的http/api开放接口必须使用“错误码”;跨应用间HSF调用优先考虑使用Result方式,封装isSuccess()方法、“错误码”、“错误简短信息”;而应用内部推荐异常抛出。
说明:关于HSF方法返回方式使用Result方式的理由:
 1)中间件平台基本上使用ResultDTO来封装,由于中间件的普及,本身就有标准的引导含义。
 2)使用抛异常返回方式,调用方如果没有捕获到就会产生运行时错误。
 3)如果不加栈信息,只是new自定义异常,加入自己的理解的error message,对于调用端解决问题的帮助不会太多。如果加了栈信息,在频繁调用出错的情况下,数据序列化和传输的性能损耗也是问题。

【推荐】定义时区分unchecked / checked 异常,避免直接使用RuntimeException抛出,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常。推荐业界或者集团已定义过的自定义异常,如:DAOException / ServiceException等。

【参考】避免出现重复的代码(Don’t Repeat Yourself),即DRY原则。
说明:随意复制和粘贴代码,必然会导致代码的重复,在以后需要修改时,需要修改所有的副本,容易遗漏。必要时抽取共性方法,或者抽象公共类,甚至是共用模块。
正例:一个类中有多个public方法,都需要进行数行相同的参数校验操作,这个时候请抽取:

private boolean checkParam(DTO dto) { ...}

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。