开发中遇到的一些坑

数据库(MySQL):

1、主键类型一致,涉及到外键的字段类型需要参考主键类型,不要这个表主键是int,在外键中就成了varchar。


2、在设计数据库字段类型的时候,注意类型范围,比如说数据库字段类型为Int,那么这个字段存放的数据范围就为int类型范围,超出范围就会报错。

所以int(11),有可能就会报错,int(12)就失去意义了

顺便记录下:
tinyint 的范围是-128~127;
int的范围是-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型数据(所有数字),存储大小为4个字节;
bigint的范围是 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节;
smallint unsigned的范围是 –2^15(2^15表示2的15次幂) 到2^15 – 1,即 –32768 到 32767;
smallint 的范围是 0 到 2^16 – 1,即 0 到 65535,存储的字节是2个字节。

 

3、DATE_FORMAT(start_date, '%Y-%m-%d') in (:dateStr)

     DATE_FORMAT(start_date, '%Y-%m-%d') in (?)

in查询中,如果拼接的是字符串,比如dateStr = "'2018-05-07','2018-05-06','2018-05-05','2018-05-04'";

在Navicat客户端上执行sql没得问题,但是通过jpa查询结果为空。

DATE_FORMAT(start_date, '%Y-%m-%d') in ("'2018-05-07','2018-05-06','2018-05-05','2018-05-04'");很可能原因就是in查询里面的字符串默认添加了双引号“”导出查询为空。

这是一个很隐形的坑,sql单独执行没得问题,但是程序中查询就是为空。

FIND_IN_SET(DATE_FORMAT(start_date, '%Y-%m-%d'),"2018-05-07,2018-05-06,2018-05-05,2018-05-04");能解决这个问题。FIND_IN_SET是mysql的函数。

FIND_IN_SET(DATE_FORMAT(start_date, '%Y-%m-%d'),:dateStr);

注意:FIND_IN_SET的第二个参数:"2018-05-07,2018-05-06,2018-05-05,2018-05-04"或者‘2018-05-07,2018-05-06,2018-05-05,2018-05-04’,而不是'2018-05-07','2018-05-06','2018-05-05','2018-05-04'。

 

Java开发:

1、String.equals()
equals方法的参数,也要String类型,不是String类型,也不报错,但是返回就是false;


2、对象拷贝:
ConvertUtils.register(new DateConverter(null), java.util.Date.class);
BeanUtils.copyProperties(ompPostQueryListBean,bbsPostRespDto);
copyProperties方法两个对象拷贝,必须保证字段名称和类型一致。不一致也不会发生拷贝。
遇到空的日期类型,装换报错。

还有一个对象拷贝方法:

PropertyUtils.copyProperties(userInfo, userInfoBak);
涉及到对象的深拷贝问题

mybatis操作Oracle数据库遇到一种错误:

error code [17004]; 无效的列类型;  

是因为你传入的参数的字段为null对象无法获取对应的jdbcType类型,而报的错误。

需要在SQL语句中的对象加上对应的jdbcType就可以了。

 

3、函数方法功能一定要简单,单一。

一个函数只做一件事情。写好注释,方便其他人调用。别一个函数界限不明确。谁都可以用,谁都不可用。那就尴尬了。

4、JSONObject对象,如果对象是null,转为json就是{}。所以对于json对象不能用 jsonobject != null进行判断。因为{}!=null永远为ture。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章