倚楼听风雨
淡看江湖路

阿里巴巴Java开发手册第五章-ORM映射篇

1.[强制] 在表查询中,一律不要使用*作为查询的字段列表,需要哪些字段必须明确写明。

说明:

  • 增加查询分析器解析成本。
  • 增减字段容易与resultMap配置不一致。

老四附言:

mysql查询中,人家说的很对,尽量不要使用*号作为字段列表,因为这样话增加比较大的开销(尤其表的字段很多的时候),所以在查询的时候想查什么一个个的字段写出来是最好的,在项目中,当一个请求设计到多次查询请求的时候如果你写的都是*性能会很差,或者说相对比较差。

2.[强制] POJO类的布尔属性不能加is,而数据库字段必须加is_,要求在resultMap中进行字段与属性之间的映射。

说明:参见定义POJO类以及数据库字段定义规定,在<resultMap>中增加映射是必须的。在MyBatis Generator生成的代码中,需要进行对应的修改。

老四附言:

附上关于POJO的定义规则: POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型Boolean isDeleted;的属性,它的方法也是isDeleted(),RPC框架在反向解析的时候,误以为对应的属性名称是deleted,导致属性获取不到,进而抛出异常。

关于MyBatis Generator,他是帮助生成基础的POJO映射mybaitis文件的插件,具体可以参考一下插件的中文介绍,里面已经很详细了。地址:《MyBatis Generator(MBG)》。

3.[强制] 不要用resultClass当返回参数,即使所有类属性名与数据库字段一一对应,也需要定义;反过来,每一个表也必然有一个与之对应。

说明:配置映射关系,使字段与DO类解耦,方便维护。

老四附言:

老四现在的项目中其实现在就是犯了这个错误,并且现在很难改正过来。说起来都是泪。这里普及一下POJO中的DO/DTO/BO/VO/PO相关概念。其实这些东西都是为了适配应用分层涉及到的POJO而划分出来的,关于应用分层,你可以参考这篇《阿里巴巴Java开发手册第六章-应用分层篇》。

  • PO(Persistent Object) 持久对象,数据;就是DAO层操作的对象
  • BO(Business object) 业务对象,封装对象、复杂对象 ,里面可能包含多个类;你可以当做service层(业务层)需要使用的
  • DTO( Data Transfer Object) 传输对象,前端调用时传输;
  • VO(View Object) 表现对象,前端界面展示。专门用来表现数据内容的,你可以理解为springmvc中model传输的那个对象,你可能会问它与DTO是什么区别,举个例子: 当对象中有个status字段,它不需要展示在前端中,但是数据传输的时候需要用它来对前端用户做验证,验证用户状态是否正常,这个时候用到的就是DTO,但是他不负责展示给用户,这么说吧 controller接受DTO,发送VO
  • DO(Domain Object) 领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。其实它一般也是和数据库中的表对应,更严谨一些

 

4.[强制] sql.xml配置参数使用:#{},#param#,不要使用${},此种方式容易出现SQL注入。

老四附言:
用过mybatis的应该都知道这个规矩。

5.[强制] iBATIS自带的queryForList(String statementName,int start,int size) 不推荐使用。

说明:其实现方式是在数据库取到statementName对应的SQL语句的所有记录,再通过subList取start,size的子集合。
正例:

嗯~~~~~~老四没用过ibatis。。。

6.[强制] 不允许直接拿HashMap与Hashtable作为查询结果集的输出。

说明:resultClass=”Hashtable”会置入字段名和属性值,但是值的类型不可控。

老四附言:
浅析一下hashmap与hashtable的区别:

  • HashMap允许key和value为null,而HashTable不允许。
  • HashTable是同步的,而HashMap不是。所以HashMap适合单线程环境,HashTable适合多线程环境。也就是hashMap不是线程安全的
  • 在Java1.4中引入了LinkedHashMap,HashMap的一个子类,假如你想要遍历顺序,你很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。
  • HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。
  • HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。
7.[强制] 更新数据表记录时,必须同时更新记录对应的gmt_modified 字段值为当前时间。

老四附言:

在所有表中都添加gmt_create、gmt_modified字段,都是datetime类型。gmt_create表示记录创建时间,gmt_modified表示最近修改时间,如果记录没有修改,gmt_create和gmt_modified一致。那么,这两个字段可以做什么用呢?可以方便统计每天对某个表做了多少次的DML(Data Manipulation Language,数据操纵语言)。另一种统计方式可以通过binlog。

8.[推荐] 不要写一个大而全的数据更新接口。传入为 POJO 类,不管是不是自己的目标更新字段,都进行update table set c1=value1,c2=value2,c3=value3; 这是不对的。执行 SQL时,不要更新无改动的字段,一是易出错;二是效率低;三是增加binlog存储。

老四附言:

说的太对了,老四现在的项目就是这样的,框架搭建导致的,所以现在遇到这个情况的时候多半都会尽量去避免这个问题。

9.[参考] @Transactional事务不要滥用。事务会影响数据库的QPS(服务器在一秒的时间内处理了多少个请求),另外使用事务的地方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎回滚、消息补偿、统计修正等。

老四附言:

孤尽说的对。

10.[参考] <isEqual>中的compareValue是与属性值对比的常量,一般是数字,表示相等时带上此条件; <isNotEmpty>表示不为空且不为 null 时执行; <isNotNull>表示不为 null值时执行。

老四附言:

这是不是也是ibatis中的支持的?没搞过!

更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请赞助盒烟钱,点我去赞助。抱拳。

赞(7) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » 阿里巴巴Java开发手册第五章-ORM映射篇

开始你的表演 抢沙发

觉得文章有用就打赏一下老四,鼓励我更好的创作

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册