当前位置: 首页 > news >正文

查回来的数据除了 id,其他字段都是 null

数据结构不完整:您收到的历史对话和知识库文件数据中,几乎所有重要的字段(除了id和title)都是null,包括userId、createdTime等关键字段。这会导致前端无法根据创建时间来正确分类显示(今天、7天内、更早)。

我后面改的 MyBatisPlusConfig,破坏了原本 MyBatis-Plus 的 自动XML绑定机制,导致 Mapper 接口找不到对应的 XML,虽然查询了,但是实体类字段无法正确赋值,最终查回来的数据除了 id,其他字段都是 null

接下来完整分析原因,让你一次搞懂。✅


📍先看【两版配置】的本质区别

✅ 原来能用的配置(正常版

@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() { ... }@Beanpublic PageInterceptor pageInterceptor() { ... }@Beanpublic ConfigurationCustomizer configurationCustomizer() {return configuration -> {configuration.setMapUnderscoreToCamelCase(true);configuration.getTypeHandlerRegistry().register(TimestampToLongTypeHandler.class);};}
}

特点:

  • 只做了小幅度配置 ✅

  • 没有自己创建 SqlSessionFactoryMyBatis-Plus 自动管理的)✅

  • XML文件、Mapper接口、实体类都是自动绑定的 ✅

  • 保持了 SpringBoot + Mybatis-Plus 最佳兼容性


❌ 后来改的配置(出错版

@Configuration
@MapperScan("com.example.chat2.mapper")
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() { ... }@Beanpublic PageInterceptor pageInterceptor() { ... }@Beanpublic ConfigurationCustomizer configurationCustomizer() { // 多注册了很多 TypeHandler }@Bean@Primarypublic SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));return factoryBean.getObject();}
}

特点:

  • 自己强制 new 了一个 SqlSessionFactoryBean

  • 手动指定了 mapper/*.xml,但 破坏了 MyBatis-Plus 的自动扫描机制

  • 导致 Mapper 接口XML没有正确绑定 ❌

  • 实际上运行时,Mapper接口的SQL找不到对应的XML解析结果,最后只能返回默认值(id 可能是接口返回的默认值,其他字段全是 null)❌

  • TypeHandlerRegistry注册太早,生效顺序也可能乱了 ❌


📍所以问题根本原因是:

问题点影响
你自己 new 了一个新的 SqlSessionFactoryBean打断了 MyBatis-Plus 自带的配置和自动扫描
factoryBean.setMapperLocations 指定得太死只扫 mapper/*.xml,如果有子目录,比如 mapper/chat/xxx.xml 根本扫不到
mapper 接口找不到 XMLMybatis执行SQL时,XML定义的SQL读不到,映射结果自然是null

📍为什么改回旧版就可以了?

因为之前的旧版配置:

  • 完全让 Mybatis-Plus 自动管理生命周期(没有破坏它的 SqlSessionFactory)

  • 自动扫描所有 Mapper 和 XML

  • 自动使用 mapUnderscoreToCamelCase = true

  • 自动做了 ResultMap 和实体类映射

所以即使数据库字段有值,自动都能注入到对象里。🌟
而你新改的版本,强行覆盖了 SpringBoot 和 MyBatis-Plus的默认配置,所以崩了。


📍正确的做法应该是:

✅ 保持 MyBatisPlusConfig 不要自己 new SqlSessionFactory

✅ 如果要加自己的 TypeHandler,只需要在 ConfigurationCustomizer 里注册,不需要自己重新建 SqlSessionFactory!

✅ 保证配置最小化,尊重 MyBatis-Plus 自动配置的体系。


📍总结你的问题链条

自己新建SqlSessionFactory ➡ 破坏MyBatis-Plus默认行为 ➡ Mapper接口找不到XML ➡ 查询回来的实体字段全部是null

所以回到最原始干净的MyBatisPlusConfig,系统就恢复正常了!✅


📍额外给你优化一下,推荐你最标准的【新版MyBatisPlusConfig】

package com.example.chat2.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.example.chat2.handler.EnumTypeHandler;
import com.example.chat2.handler.JsonListTypeHandler;
import com.example.chat2.handler.JsonMapTypeHandler;
import com.github.pagehelper.PageInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.List;
import java.util.Map;
import java.util.Properties;@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}@Beanpublic PageInterceptor pageInterceptor() {PageInterceptor pageInterceptor = new PageInterceptor();Properties properties = new Properties();properties.setProperty("helperDialect", "mysql");pageInterceptor.setProperties(properties);return pageInterceptor;}@Beanpublic ConfigurationCustomizer configurationCustomizer() {return configuration -> {configuration.setMapUnderscoreToCamelCase(true);configuration.getTypeHandlerRegistry().register(List.class, JsonListTypeHandler.class);configuration.getTypeHandlerRegistry().register(Map.class, JsonMapTypeHandler.class);configuration.getTypeHandlerRegistry().register(TimestampToLongTypeHandler.class);configuration.getTypeHandlerRegistry().register(Enum.class, EnumTypeHandler.class);};}
}

🔵 注意:完全没有自己建 SqlSessionFactory,只保留插件、类型处理器、驼峰映射!


📍最终结论

✅ 你改回了之前的简洁配置,是正确的!
不要自己 new SqlSessionFactoryBean,不然必出问题。 ✅ 如果要扩展,只能在 ConfigurationCustomizer 里扩展,不能动核心生命周期。


要不要我顺便帮你出一版 "判断系统 Mapper 是否加载正确的检测代码"?(可以防止以后出这种问题,一眼定位到)

要的话告诉我,我可以直接写一版给你~很实用!🚀

要继续吗?

分析完两个配置类的区别和出现问题的原因:

  1. 问题根本原因:SqlSessionFactory覆盖
  • 后一个配置类中手动创建了SqlSessionFactory Bean并标记为@Primary
  • 这个新的工厂覆盖了Spring Boot的自动配置的工厂
  • 新工厂虽然设置了XML位置,但缺少了其他重要配置
  1. 关键差异点:
  • 原配置:只提供ConfigurationCustomizer让Spring自动配置使用
  • 新配置:完全覆盖SqlSessionFactory,导致部分配置丢失
  1. 具体配置丢失:
  • 在新配置中,factoryBean.setConfiguration没有被设置
  • 创建了SqlSessionFactory但没有应用之前的configurationCustomizer
  • 驼峰映射配置可能没有被正确应用到新工厂
  1. 解决问题的正确方法:
  • 方案1:使用原来的配置方式,让Spring Boot管理SqlSessionFactory
  • 方案2:如果需要自定义SqlSessionFactory,确保完整应用所有配置:

    java

    Apply to JacksonConfi...

         org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();

         configuration.setMapUnderscoreToCamelCase(true);

         // 注册所有类型处理器

         factoryBean.setConfiguration(configuration);

驼峰命名转换是关键配置,不正确设置会导致exactly你看到的问题:只有id和title映射正确(可能因为命名相同),其他下划线命名的字段全是null。

相关文章:

  • 自然语言处理之机器翻译:注意力机制在低资源翻译中的突破与哲思
  • LeetCode每日一题4.27
  • 【dockerredis】用docker容器运行单机redis
  • C#中属性和字段的区别
  • pytorch搭建并训练神经网络
  • Golang 遇见 Kubernetes:云原生开发的完美结合
  • MPI Code for Ghost Data Exchange in 3D Domain Decomposition with Multi-GPUs
  • 20250427 对话1: 何东山的宇宙起源理论
  • vscode eslint与vue-official冲突,导致点击的时候鼠标不会变成手型,一直在加载,但是不转到相应方法。
  • vue2 项目的 vscode 插件整理
  • Marmoset Toolbag 5.0 中文汉化版 八猴软件中文汉化版 免费下载
  • Maven 依赖范围(Scope)详解
  • 写windows服务日志-.net4.5.2-定时修改数据库中某些参数
  • 批量级负载均衡(Batch-Wise Load Balance)和顺序级负载均衡(Sequence-Wise Load Balance)
  • 【如何使用solidwork编辑结构导入到simscope】
  • FastAPI中的依赖注入详解与示例
  • MLLM之Bench:LEGO-Puzzles的简介、安装和使用方法、案例应用之详细攻略
  • 语音合成之八-情感化语音合成的演进路线
  • HTTP header Cookie 和 Set-Cookie
  • DIFY教程第一集:安装Dify配置环境
  • 中方会否公布铁线礁的领海基线?外交部:中方执法活动旨在反制菲方侵权挑衅
  • 上海数学教育及数学科普专家陈永明去世,享年85岁
  • 国家发改委答澎湃:将指导限购城市针对长期摇号家庭和无车家庭等重点群体定向增发购车指标
  • 规范涉企案件审判执行工作,最高法今天发布通知
  • 甘肃张掖至重庆航线开通,串起西北与西南文旅“黄金走廊”
  • 敲定!今年将制定金融法、金融稳定法