【强制】
Object
的
equals
方法容易抛空指针异常,应使用常量或确定有值的对象来调用
equals
。
正例:
"
test
"
.equals(object);
反例:
object.equals(
"
test
"
);
说明:
推荐使用
java
.
util
.
Objects
#
equals
(
JDK
7
引入的工具类
)
7.
【强制】所有的相同类型的包装类对象之间
值的比较
,全部使用
equals
方法比较。
说明:
对于
Integer var
= ?
在
-128
至
127
范围内的赋值,
Integer
对象是在
IntegerCache
.
cache
产生,会复用已有对象,这个区间内的
Integer
值可以直接使用
==
进行
判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,
推荐使用
equals
方法进行判断。
说明:
count(
*
)
会统计值为
NULL
的行,而
count(
列名
)
不会统计此列为
NULL
值的行
1.
【强制】不要使用
count(
列名
)
或
count(
常量
)
来替代
count(
*
)
,
count(
*
)
是
SQL
92
定义的
标准统计行数的语法,跟数据库无关,跟
NULL
和非
NULL
无关。
说明:
count(
*
)
会统计值为
NULL
的行,而
count(
列名
)
不会统计此列为
NULL
值的行。
2.
【强制】
count(distinct col)
计算该列除
NULL
之外的不重复行数,注意
count(distinct
col
1,
col
2
)
如果其中一列全为
NULL
,那么即使另一列有不同的值,也返回为
0
。
3.
【强制】当某一列的值全是
NULL
时,
count(col)
的返回结果为
0
,但
sum(col)
的返回结果为
NULL
,因此使用
sum()
时需注意
NPE
问题。
正例:
可以使用如下方式来避免
sum
的
NPE
问题:
SELECT IF(ISNULL(SUM(g))
,0,
SUM(g))
FROM table;
4.
【强制】使用
ISNULL()
来判断是否为
NULL
值。
说明:
NULL
与任何值的直接比较都为
NULL
。
1
)
NULL<>NULL
的返回结果是
NULL
,而不是
false
。
2
)
NULL=NULL
的返回结果是
NULL
,而不是
true
。
3
)
NULL<>1
的返回结果是
NULL
,而不是
true
。
5.
【强制】在代码中写分页查询逻辑时,若
count
为
0
应直接返回,避免执行后面的分页语句。
6.
【强制】不得使用外键与级联,一切外键概念必须在应用层解决。
说明:
以学生和成绩的关系为例,学生表中的
student
_
id
是主键,那么成绩表中的
student
_
id
则为外键。如果更新学生表中的
student
_
id
,同时触发成绩表中的
student
_
id
更新,即为
级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群
;
级联更新是强阻
塞,存在数据库更新风暴的风险
;
外键影响数据库的插入速度。
7.
【强制】禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
8.
【强制】数据订正(特别是删除、修改记录操作)时,要先
select
,避免出现误删除,确认
无误才能执行更新语句。
9.
【推荐】
in
操作能避免则避免,若实在避免不了,需要仔细评估
in
后边的集合元素数量,控
制在
1000
个之内。
10.
【参考】如果有国际化需要,所有的字符存储与表示,均以
utf
-8
编码,注意字符统计函数
的区别。
说明:
SELECT LENGTH(
"
轻松工作
"
)
;
返回为
12
SELECT CHARACTER
_
LENGTH(
"
轻松工作
"
)
;
返回为
4
如果需要存储表情,那么选择
utf8mb
4
来进行存储,注意它与
utf
-8
编码的区别。
11.
【参考】
TRUNCATE TABLE
比
DELETE
速度快,且使用的系统和事务日志资源少,但
TRUNCATE
无事务且不触发
trigger
,有可能造成事故,故不建议在开发代码中使用此语句。
说明:
TRUNCATE TABLE
在功能上与不带
WHERE
子句的
DELETE
语句相同。
(
四
)ORM
映射
1.
【强制】在表查询中,一律不要使用
*
作为查询的字段列表,需要哪些字段必须明确写明。
说明:
1
)
增加查询分析器解析成本。
2
)
增减字段容易与
resultMap
配置不一致。
3
)无用字
段增加网络消耗,尤其是
text
类型的字段。
2.
【强制】
POJO
类的布尔属性不能加
is
,而数据库字段必须加
is
_
,要求在
resultMap
中进行
字段与属性之间的映射。
说明:
参见定义
POJO
类以及数据库字段定义规定,在
<resultMap>
中
增加映射,是必须的。
在
MyBatis Generator
生成的代码中,需要进行对应的修改。
3.
【强制】不要用
resultClass
当返回参数,即使所有类属性名与数据库字段一一对应,也需
要定义
;
反过来,每一个表也必然有一个
POJO
类与之对应。
说明:
配置映射关系,使字段与
DO
类解耦,方便维护。
4.
【强制】
sql.
xml
配置参数使用:
#{}
,
#
param
#
不要使用
${}
此种方式容易出现
SQL
注入。
5.
【强制】
iBATIS
自带的
queryForList(String statementName
,
int start
,
int size)
不推
荐使用。
说明:
其实现方式是在数据库取到
statementName
对应的
SQL
语句的所有记录,再通过
subList
取
start
,
size
的子集合。
正例:
Map<String, Object> map = new HashMap<>();
map.put("start", start);
map.put("size", size);
6.
【强制】不允许直接拿
HashMap
与
Hashtable
作为查询结果集的输出。
说明:
resultClass=”Hashtable”
,会置入字段名和属性值,但是值的类型不可控。