Mybatis Plus中的实体属性命名造成的bug

在使用MybatisPlus进行数据库操作时,若实体类属性采用短横线命名,会导致数据库返回值无法正确赋值,进而使实体get方法返回null。解决办法是将属性名改为lowerCamel式。

在使用MybatisPlus构造实体属性时,属性的命名不能使用数据库中的短横线分割命名,而应该修改为lowerCamel式,否则会出现数据库能返回值,但是不能赋值到实体的情况,从而导致调用实体属性的get方法返回null。

<think> 我们正在解决GaussDB与MyBatis-Plus集成时,`map-underscore-to-camel-case`配置未生效的问题。根据引用内容,该配置通常用于将数据库字段的下划线命名自动转换为Java实体类的驼峰命名。以下是可能的原因和解决方案: ### 问题分析 1. **配置位置错误**:在同时使用MyBatisMyBatis-Plus的项目中,配置可能被放置在错误的配置项下。 2. **配置冲突**:MyBatis原生配置与MyBatis-Plus配置同时存在时,可能产生冲突(引用[2]中提到配置失效问题)。 3. **GaussDB特性**:GaussDB可能对字段名的大小写处理有特殊规则(如默认大写),导致转换不匹配。 4. **MyBatis-Plus版本兼容性**:某些版本可能存在配置载问题。 ### 解决方案 #### 1. 确认配置位置(关键) 在MyBatis-Plus项目中,应使用`mybatis-plus.configuration`作为配置前缀,而非`mybatis.configuration`。参考引用[4]的配置示例: ```yaml mybatis-plus: configuration: # 开启驼峰转换 map-underscore-to-camel-case: true # 其他配置... ``` #### 2. 排除GaussDB大小写敏感问题 GaussDB默认将未双引号的标识符(表名、字段名)转换为大写。解决方案: - **方案A**:在SQL语句中使用双引号包裹字段名(需修改Mapper XML): ```xml SELECT "user_name" FROM "user_table" ``` - **方案B**:在GaussDB中配置大小写不敏感(需数据库权限): ```sql SET case_sensitive_parameter = off; ``` #### 3. 检查配置覆盖 若同时存在MyBatis原生配置,确保优先级顺序(Spring Boot中`mybatis-plus.configuration`优先级高于`mybatis.configuration`)。建议删除重复配置: ```yaml # 错误示例(冲突) mybatis: configuration: map-underscore-to-camel-case: false # 会被覆盖 mybatis-plus: configuration: map-underscore-to-camel-case: true # 最终生效 ``` #### 4. 实体类注解覆盖(验证) 检查实体类是否使用了`@TableField`注解强制指定字段映射,这会覆盖全局配置: ```java public class User { @TableField(value = "user_name") // 强制映射到user_name字段 private String userName; } ``` #### 5. 升级MyBatis-Plus版本 某些旧版本(如<3.4.0)存在驼峰配置失效的Bug。建议升级至最新稳定版: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.6</version> <!-- 当前最新稳定版 --> </dependency> ``` ### 验证步骤 1. 打印生效配置: ```java @SpringBootTest public class ConfigTest { @Autowired private SqlSessionFactory sqlSessionFactory; @Test void showConfig() { Configuration config = sqlSessionFactory.getConfiguration(); System.out.println("驼峰转换状态:" + config.isMapUnderscoreToCamelCase()); } } ``` 2. 查看SQL日志(需开启日志): ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 观察执行的SQL是否包含正确转换的字段名。 ### 附录:GaussDB适配建议 | 场景 | 解决方案 | 优缺点 | |---------------------|---------------------------------------|-------------------------| | 全大写字段名 | 配置`map-underscore-to-camel-case: true` | 需确保字段名均为小写下划线 | | 大小写混合字段名 | 使用`@TableField`注解逐一定义 | 精准但繁琐 | | 全小写字段名 | 无需额外配置 | 最简单 | > **注意**:若字段名全大写(如`USER_NAME`),开启驼峰转换后,MyBatis-Plus会将其转换为`userName`(小驼峰),但实体字段通常首字母小写,此时需确认实体字段命名是否匹配[^3]。 --- §§相关问题§§ 1. 如何解决GaussDB中大小写敏感导致的MyBatis-Plus映射失败问题? 2. MyBatis-Plus的`@TableField`注解在字段映射中的优先级规则是什么? 3. 如何验证MyBatis-Plus的所有生效配置项? 4. GaussDB与MySQL在MyBatis-Plus配置上有哪些差异需要注意? 5. 实体字段名与数据库字段名不同时有哪几种映射方案? </think> ### 解决 GaussDB 中 MyBatis-Plus 驼峰命名配置失效问题 在 GaussDB 与 MyBatis-Plus 集成时,`map-underscore-to-camel-case` 配置未生效通常由以下原因引起: #### 一、核心解决方案 1. **正确配置位置**(关键) 确保驼峰配置在 MyBatis-Plus 专属配置项下(参考引用[4]): ```yaml mybatis-plus: configuration: # 开启驼峰命名映射 map-underscore-to-camel-case: true # GaussDB 特殊配置 object-wrapper-factory: com.baomidou.mybatisplus.extension.MybatisMapWrapperFactory ``` 2. **排除配置冲突** 删除 MyBatis 原生配置(引用[2]中提到的冲突问题): ```yaml # ❌ 删除此配置 mybatis: configuration: map-underscore-to-camel-case: false ``` #### 二、GaussDB 特殊处理 由于 GaussDB 的标识符默认**区分大小写**且**自动转大写**: ```sql CREATE TABLE user_info ( -- GaussDB 实际存储为 "USER_INFO" "user_id" INT PRIMARY KEY, -- 带引号保持小写 user_name VARCHAR(50) -- 存储为 "USER_NAME" ); ``` 1. **解决方案 A**:强制小写映射 ```xml <!-- Mapper XML --> <select id="getUser" resultType="User"> SELECT "user_id" AS userId, -- 别名强制小写 "user_name" AS userName FROM "user_info" </select> ``` 2. **解决方案 B**:全局配置(推荐) ```yaml spring: datasource: url: jdbc:postgresql://host:port/db?lowerCaseTableNames=true ``` #### 三、验证配置生效 1. 检查最终配置 ```java @Test void checkConfiguration() { Configuration config = sqlSessionFactory.getConfiguration(); System.out.println("驼峰转换状态: " + config.isMapUnderscoreToCamelCase()); // 应输出 true } ``` 2. 测试日志输出 ```sql -- 观察日志中字段名是否转换 DEBUG ==> Parameters: 1(Integer) DEBUG <== Total: 1 DEBUG Columns: USER_ID(是否转为userId) ``` #### 四、其他影响因素排查 | 原因 | 解决方案 | |---------------------|----------------------------------| | 实体类注解覆盖 | 移除 `@TableField(value = "USER_NAME")` | | 版本兼容问题 | 升级 MyBatis-Plus ≥ 3.4.0 | | 懒载冲突 | 关闭无关配置(参考引用[5]) | | 字段大小写不一致 | 使用 `@TableField(exist=false)` 忽略非常规字段 | > **最佳实践**:生产环境建议采用 **方案B(全局小写配置)** + **MyBatis-Plus 驼峰配置** 双重保障[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值