MyBatis 默认的 update 操作对 null 属性的处理方式

背景

本文将介绍三个开发过程中的小技术点:

  1. Vue 组件传递对象时,根据是否会修改原对象内容,决定是直接使用,还是用副本;
  2. Spring 容器托管的实体 Bean 名称的基本规则;
  3. MyBatis 默认的 update 操作对 null 属性的处理方式。

Vue 子组件中使用属性的副本

Vue 前端开发过程中,父组件引用某个子组件时,可以直接传递对象属性给子组件。如果子组件只是引用数据,而不对数据进行修改,这个用法没问题。

如果子组件需要修改该数据,且有"确定"、"取消"按钮来决定是否保存数据,就不能直接用父组件传来的数据,因为"取消"操作不应该修改父组件的数据。

正确的方法是,在子组件中使用副本接收父组件的数据,放入自己独立的属性中,本组件引用自己的数据:

javascript 复制代码
const copyArray = JSON.parse(JSON.stringify(data))

结论:Vue 是基于数据驱动的,而数据又是以对象呈现的,组件直接对对象操作时,引用地址相同,所以需要注意全局引用过程中数据的一致性。

Spring 托管的 Bean 名称生成规则

基于 Spring 容器的开发过程中,习惯了各种 @Autowired 自动注入后,如果有某些普通类,例如自定义的定时任务,webmagic 的落地处理类等,需要获取 Spring 托管的实体类,怎么办呢?

答案是自定义一个 @Component 注解标识的工具类,从 SpringContext 获取实例。

被 @Service 或 @Component 自动扫描的类,通过 getBean 获取时,它的 beanName 是什么呢?

Spring 存储 Bean 实例到容器时,名称命名的规则有两点需要了解:

  1. 常规类,类名首字母小写;例如 UserService ,对应 userService
  2. 非常规类,比如 ABCUserService ,以超过两个大写字母开头的类。与类名一致,对应 ABCUserService。

MyBatis 默认的 update 操作

MyBatis 的 BaseMapper 类封装了增删改查等常用方法,update 的方法需要注意的一点是,传入实体的某个属性为 null 时,它会将数据库中该实体对应的表的字段更新为 null 吗?

结论是:不会

如果需要根据实体的属性值,严格更新数据库,那么需要自定义 update 方法。不排除开发中有这种需求,即需要将某列修改为 null ,此时默认方法就不满足需求。

最后,总结 MyBatis 框架使用默认配置能正确开发的两个前提:

  1. 数据库表字段多单词间用 "_" 连接,对应实体属性符合驼峰命名规则;
  2. 数据库表字段中没有数据库的保留关键字,因为它不会处理转义。例如 MySQL 的 option 是一个保留关键字,MyBatis 自动操作有该列名的表时,会发生 SQL 语法错误。
相关推荐
福大大架构师每日一题2 分钟前
agno v2.8.7 发布:顾问模型、精准路线、调度能力全面升级,10项关键修复一次看懂
java·开发语言·数据库
Patrick在香港9 小时前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术9 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫9 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话9 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
还是鼠鼠10 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
计算机小白一个11 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
sunburn-12 小时前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea
vx-程序开发12 小时前
springboot农产品运输服务平台---附源码75498
java·javascript·spring boot·python·eclipse·django·php
zzh___zzh13 小时前
SQL 窗口函数 ROW_NUMBER、RANK、DENSE_RANK 常用方法笔记
java