当前位置:首页 > 技术 > 正文内容

生产环境常见数据与SQL相关问题解析

访客 技术 2026年6月22日 6

一、迭代器使用不当引发的并发修改异常

在处理集合过滤时,使用迭代器遍历并移除不符合条件的对象是常见操作。但若逻辑判断中存在多个独立的 remove() 调用,可能触发 ConcurrentModificationException

原始代码如下:

if (board.getName() == null || board.getName().isEmpty()) {
    iterator.remove();
}
if (board.getPbiCode() == null || board.getPbiCode().isEmpty()) {
    iterator.remove();
}

问题在于:当一个对象同时满足两个条件时,iterator.remove() 被调用两次,而迭代器仅允许一次删除操作,导致运行时异常。

正确做法是使用 else if 避免重复删除:

if (board.getName() == null || board.getName().isEmpty()) {
    iterator.remove();
} else if (board.getPbiCode() == null || board.getPbiCode().isEmpty()) {
    iterator.remove();
}

此外,应始终检查输入数据的完整性,尤其是来自数据库的字段是否包含空值或非法值,避免因脏数据导致逻辑错误。

二、SQL查询设计中的实践误区

在排查数据缺失问题时,曾误以为必须使用子查询才能关联两张表,实际上通过 JOIN 可以高效完成多表联合查询。

例如,要确认某类数据是否存在缺失,可直接写:

SELECT t1.*, t2.status
FROM table_a t1
LEFT JOIN table_b t2 ON t1.id = t2.ref_id
WHERE t2.id IS NULL;

这能快速定位关联缺失的数据。同时,在复杂 WHERE 条件拼接时,应避免过度依赖字符串拼接,建议使用 MyBatis 动态 SQL 标签(如 <if>)提高可读性和安全性。

三、MyBatis 中布尔类型参数的陷阱

当传入的参数为基本类型 boolean 时,其默认值为 false,即使未显式赋值也会参与条件判断。

例如:

<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>

isSyncQisboolean,则无论是否传参,都会被当作 false 处理,可能导致查询结果为空。推荐使用包装类型 Boolean,支持 null 值,从而实现更灵活的条件控制。

四、MySQL 的 ON UPDATE CURRENT_TIMESTAMP 使用隐患

在实体类中定义了时间字段,并配置了 ON UPDATE CURRENT_TIMESTAMP,但在更新对象时未主动设置该字段为 null 或新实例,会导致数据库时间未更新。

示例:

// 错误做法
entity.setUpdateTime(new Date()); // 未清空原值,可能被忽略
// 正确做法
entity.setUpdateTime(null); // 强制触发数据库自动更新
// 或者
entity.setUpdateTime(new Date()); // 显式更新,确保持久化

若不显式重置时间字段,某些持久层框架可能跳过该字段的更新,导致时间戳未同步。

标签: JavaMyBatis

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。