数据和sql产生的bug
1、脏数据或者场景考虑不全面引发的生产问题
就是一个简单的查询过滤接口,但是在生产环境却报了错,代码大致如下
if(board.getName() == null || board.getName() ==""){
iterator.remove();
}
if(board.getPbiCode() == null || board.getPbiCode() == ""){
iterator.remove();
}
很简洁的逻辑,就是使用迭代器移除不符合要求的对象,开发后测试没有什么问题,但是在联调时却发现,这个报错了。
其原因就在于迭代器移除了2次,而测试代码告诉我们迭代器时不能移除多次的,这和List,Map,Set对象容器有这个本质的区别
改成这样就不会报错了:
if (board.getName() == null || board.getName() == "") {
iterator.remove();
} else if (board.getPbiCode() == null || board.getPbiCode() == "") {
iterator.remove();
} // 加了一个else,增加了代码的健壮性。
这个问题原因在于走了两次if分支,迭代器不支持对象的二次移除,这是由于没有弄清楚数据的取值情况。
在查看数据库是否有脏数据时,大体是两个表的查询。但是我老是想到子查询,查询出来的是一条记录,感觉写不出来这个sql。但是同事提醒了我,使用join查询,就可以联合两张表,查看是否存在数据缺失的问题了。同事的提醒,让我觉得我自己的mysql书白看了,竟然简单的sql使用都不会。还有一次就是where后面拼接的多个and的情况,我感觉写不出来,但是人家很快就写出来了。这说明sql是一个很具有实践性的技术,要不断实践才能掌握。
总结实际开发中,如何少写bug?
大部分可能是由于没有考虑边界输入的问题,比如数组,绝大多数是非空的,但是也有可能为空,那么就应该考虑这种情况。
很多时候,是数据不符合业务需求,然后就报错,这是没问题的。要区别程序本身引发的bug和数据引发的bug。
2、mybatis中,数据类型产生的bug
<select id="getFaultListPage" parameterType="com.domain.FaultQueryBean"
resultType="com.vo.FaultVo">
SELECT
mf.SHE_ID sheId,
mf.CODE,
mfi.IMPLEMENT_PROCESS implementProcess
FROM
mm_fault mf
WHERE
mf.MARK_FOR_DELETE = 0
<if test="bean.isSyncQis != null">
AND mf.is_sync_qis = #{bean.isSyncQis}
</if>
ORDER BY mf.ID DESC
</select>
如上的sql值,is_sync_qis是基本类型boolean,不是包装类型Boolean,那么传不传值,其都为true, 就会用到判断条件。如果没有传值,其默认值是false,就会选不出什么数据。
java中,在包装的Boolean,有null取值,就相当于三元类型,不止有false或者true值,有点无赖了。
3、 mysql中current_time on update的坑
当update整个dao实体对象时,又没有将该对象中的updateTime字段设置为null或new date();
update time不会更新为最新时间
这是我在定位问题发现的,很隐蔽
日进有功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
2018-05-17 重装win7,win10,Ubuntu