mybatisplus无主键表insert出现Class must not null报错

MyBatis | Insert null 错误,Column xxx cannot be null,即使数据库DDL里写了DEFAULT ‘‘ 属性之前检查它是否为null,如果是null,那么你可以设置它为默认值(在这种情况下,是空字符串)。如果在 xml 文件里处理,也可以在null时直接不插入改字段,使用DDL里的DEFAULT逻辑。(在这种情况下,是null),而不是省略了这个值(在这种情况下,数据库才会使用默认值)。块,这可能会使你的SQL映射文件变得相当复杂,特别是当你有很多字段需要处理时。为null的情况下使用默认值,你需要在Java代码中实现这个逻辑。在MyBatis的XML映射文件中使用的插入语句显然是在为。 阅读详情

项目中用到pgsql+mybatisplus

insert数据报错

在调试过程中发现:

走到审计代码

entityClass为null,
entityClass是取自tableInfo的值

找到设置tableInfo的clazz字段的地方

com.baomidou.mybatisplus.core.toolkit.TableInfoHelper有一个initTableInfo方法

	public synchronized static TableInfo initTableInfo(MapperBuilderAssistant builderAssistant, Class<?> clazz) {
		TableInfo tableInfo = TABLE_INFO_CACHE.get(clazz);
		if (tableInfo != null) {
			if (builderAssistant != null) {
				tableInfo.setConfigMark(builderAssistant.getConfiguration());
			}
			return tableInfo;
		}

		/* 没有获取到缓存信息,则初始化 */
		tableInfo = new TableInfo();
		GlobalConfig globalConfig;
		if (null != builderAssistant) {
			tableInfo.setCurrentNamespace(builderAssistant.getCurrentNamespace());
			tableInfo.setConfigMark(builderAssistant.getConfiguration());
			tableInfo.setUnderCamel(builderAssistant.getConfiguration().isMapUnderscoreToCamelCase());
			globalConfig = GlobalConfigUtils.getGlobalConfig(builderAssistant.getConfiguration());
		} else {
			// 兼容测试场景
			globalConfig = GlobalConfigUtils.defaults();
		}

		/* 初始化表名相关 */
		initTableName(clazz, globalConfig, tableInfo);

		/* 初始化字段相关 */
		initTableFields(clazz, globalConfig, tableInfo);

		/* 放入缓存 */
		TABLE_INFO_CACHE.put(clazz, tableInfo);

		/* 缓存 Lambda 映射关系 */
		LambdaUtils.createCache(clazz, tableInfo);
		return tableInfo;
	}

在初始化字段的时候,会通过是否有主键,如果有主键,会设置tableInfo的一些属性,而其中一个属性就是clazz,但是由于这张表没有设置主键,没有id字段,导致clazz属性为null

	/**
	 * <p>
	 * 初始化 表主键,表字段
	 * </p>
	 *
	 * @param clazz        实体类
	 * @param globalConfig 全局配置
	 * @param tableInfo    数据库表反射信息
	 */
	public static void initTableFields(Class<?> clazz, GlobalConfig globalConfig, TableInfo tableInfo) {
		/* 数据库全局配置 */
		GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
		List<Field> list = getAllFields(clazz);
		// 标记是否读取到主键
		boolean isReadPK = false;
		// 是否存在 @TableId 注解
		boolean existTableId = isExistTableId(list);
		boolean existId = isExistId(list);

		List<TableFieldInfo> fieldList = new ArrayList<>();
		for (Field field : list) {
			/*
			 * 主键ID 初始化
			 */
			if (!isReadPK) {
				if (existTableId) {
					isReadPK = initTableIdWithAnnotation(dbConfig, tableInfo, field, clazz);
				} else if (existId) {
					isReadPK = initIdWithAnnotation(dbConfig, tableInfo, field, clazz);
				} else {
					isReadPK = initTableIdWithoutAnnotation(dbConfig, tableInfo, field, clazz);
				}
				if (isReadPK) {
					continue;
				}
			}

			boolean existColumn = isExistColumn(field);


			/* 有 @TableField 注解的字段初始化 */
			if (initTableFieldWithAnnotation(dbConfig, tableInfo, fieldList, field, clazz)) {
				continue;
			}

			if (existColumn) {
                /* 获取注解属性,自定义字段 */
                Column column = field.getAnnotation(Column.class);
                String columnName = field.getName();
                if (StringUtils.isNotEmpty(column.name())) {
                    columnName = column.name();
                }
                initColumnFieldWithAnnotation(dbConfig, tableInfo, fieldList, field, clazz, columnName);
			} else {
                /* 无 @TableField/@Column 注解的字段初始化 */
			    initColumnFieldWithAnnotation(dbConfig, tableInfo, fieldList, field, clazz, field.getName());
            }

			/* 无 @TableField 注解的字段初始化 */
			//fieldList.add(new TableFieldInfo(dbConfig, tableInfo, field));
		}

		/* 检查逻辑删除字段只能有最多一个 */
		Assert.isTrue(fieldList.parallelStream().filter(TableFieldInfo::isLogicDelete).count() < 2L,
			String.format("annotation of @TableLogic can't more than one in class : %s.", clazz.getName()));

		/* 字段列表 */
		tableInfo.setFieldList(fieldList);

		/* 未发现主键注解,提示警告信息 */
		if (StringUtils.isEmpty(tableInfo.getKeyColumn())) {
			logger.warn(String.format("Warn: Could not find @TableId in Class: %s.", clazz.getName()));
		}
	}
	/**
	 * <p>
	 * 主键属性初始化
	 * </p>
	 *
	 * @param tableInfo 表信息
	 * @param field     字段
	 * @param clazz     实体类
	 * @return true 继续下一个属性判断,返回 continue;
	 */
	private static boolean initTableIdWithoutAnnotation(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo,
		Field field, Class<?> clazz) {
		String column = field.getName();
		if (dbConfig.isCapitalMode()) {
			column = column.toUpperCase();
		}
		if (DEFAULT_ID_NAME.equalsIgnoreCase(column)) {//表中没有id字段,这里根本没执行
			if (StringUtils.isEmpty(tableInfo.getKeyColumn())) {
				tableInfo.setKeyRelated(checkRelated(tableInfo.isUnderCamel(), field.getName(), column))
					.setIdType(dbConfig.getIdType()).setKeyColumn(column).setKeyProperty(field.getName())
					.setClazz(field.getDeclaringClass());
				return true;
			} else {
				throwExceptionId(clazz);
			}
		}
		return false;
	}

解决办法:使用注解@TableId设置entity中的一个唯一性值为主键

 

springboot整合mybatis-plus,及结果集null值、空值判断 1、添加jar包 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.baomidou</groupId&gt 阅读详情

相关推荐

MySQL NOT NULL字段无默认值报错解决方案

关系型数据库通过NOT NULL约束确保数据完整性,当字段被定义为NOT NULL且无默认值时,INSERT操作必须显式提供值。MySQL的sql_mode参数(如STRICT_TRANS_TABLES)会严格校验这类约束,这是生产环境推荐配置。在ORM框架如MyBatisPlus中,自动填充机制需要与数据库约束配合,常见的@TableField注解和MetaObjectHandler配置不当会导致'Field doesn't have a default value'报错。合理设置DEFAULT值、检查S

weixin_34284188的博客 349

mybatis plus 开发过程中遇到的问题

本文主要记录本人使用 mybatis plus 开发过程中碰到的问题,以及解决方案,此文将会不定期更新 ## 以下 mybatis plus 统一简称 mp 一、使用 mp 生成代码时 1、使用 saveOrUpdateBatch 或者 saveBatch 等新增修改方法时 MybatisPlusException: error: can not execute. because can not find column for id from entity 原因:不能执行。因为无法从实体中找到id列 .

wxw1997a的博客 7836

MySQL严格模式与字段默认值问题解决方案

在数据库开发中,MySQL的严格模式(sql_mode)是一个重要的配置参数,它控制着服务器对SQL语法的校验严格程度。当启用STRICT_TRANS_TABLES等严格模式时,MySQL会强制检查NOT NULL字段是否具有默认值或显式赋值,否则会抛出'Field doesn't have a default value'错误。这一机制能有效避免数据不一致问题,但在使用MyBatisPlus等ORM框架时,由于自动映射机制可能导致字段遗漏,该问题尤为常见。解决方案包括调整表结构设计、合理配置ORM字段策略

weixin_33957648的博客 366

记录使用mybatis-plus时遇到的错误

在mybatis-plus中,由于extends BaseMapper,因此我们是不需要手动写sql语句的,因此我们不会遇到语法错误,但是我们可能会遇到下面列举的错误: (1)org.springframework.jdbc.BadSqlGrammarException:Cause: java.sql.SQLSyntaxErrorException 出现该异常的原因:数据库中我们设置的字段名称和数据库中的关键字名称重名,需要更改与数据库中关键字重名的字段名称。 MySQL 关键字和保留字汇总(MySQL

julac的博客 8589

MyBatis/MyBatis-Plus Invalid bound statement 报错全解析与排查指南

在Java持久层开发中,ORM框架通过将对象与数据库表进行映射,简化了数据操作。其核心原理在于建立接口方法与SQL语句之间的绑定关系,这极大地提升了开发效率并保证了类型安全。MyBatis作为一款广泛使用的半自动化ORM框架,其技术价值在于提供了灵活的SQL编写能力和细致的映射控制。在实际应用场景中,开发者常会遇到SQL映射绑定失败的问题,具体表现为“Invalid bound statement (not found)”错误。这一问题尤其在涉及**Maven资源过滤**和**多数据源配置**时频繁出现。本

weixin_34111790的博客 436

string input must not be null解决办法

出现这个错误,是因为我代码中用了Jsoup来解析html 代码如下: Document doc = Jsoup.parse(content); 如果content为null,就会报这个错误,所以在传入参数前,必须判定content不为null

u011734144的专栏 2万+

全网最强MyBatisPlus教程 | 万字长文爆肝MyBatisPlus

MyBatisPlus是基于MyBatis的增强工具,旨在简化开发和提高效率。文章介绍了基于SpringBoot整合MyBatisPlus的入门案例,包括创建数据库、配置依赖、编写实体类和Dao接口等步骤。MyBatisPlus通过继承BaseMapper接口,无需编写SQL即可实现标准CRUD操作,大幅简化开发流程。同时还介绍了MyBatisPlus的官方文档和定位,强调其作为MyBatis的增强工具而非替代品的角色。文中包含详细的操作步骤和配置示例,适合初学者快速上手使用MyBatisPlus。

qq_45832461的博客 2309

基于SpringBoot和MyBatisPlus的农场管理系统设计与实现

SpringBoot作为Java后端开发的轻量级框架,以其自动配置和快速部署能力,成为企业级应用的主流选择;MyBatisPlus则通过增强CRUD与条件构造器,大幅简化了数据持久层开发。在智慧农业与农业物联网的实践中,如何将土壤墒情监测、智能灌溉、农资追溯等业务转化为可执行的系统,是传统农场数字化转型的核心。一个基于SpringBoot和MyBatisPlus构建的农场管理系统,正是这一需求的典型方案。它整合了种植计划管理、传感器数据采集去重、灌溉规则决策、农资使用追踪等模块,采用单体应用架构应对中小规模

weixin_34408717的博客 481

MyBatisPlus自动填充原理与高可用实战指南

自动填充是保障数据库元数据一致性的核心机制,其本质是在MyBatis执行链的参数解析阶段,通过MetaObjectHandler对实体字段进行动态赋值。它并非简单注解配置,而是涉及SQL生成裁剪、字段生命周期控制及上下文感知等底层逻辑。技术价值在于统一管理 createTime、updateTime、createBy、updateBy 等审计字段,避免手动 set 导致的时间错乱与操作人丢失。广泛应用于中后台系统、多租户SaaS、金融合规场景及DDD聚合根持久化。本文深入解析 strictInsertFil

weixin_34129696的博客 823

SpringBoot+MybatisPlus构建企业级后台系统:从架构设计到实战优化

企业级后台管理系统是现代软件开发的基石,其核心在于通过清晰的分层架构实现业务逻辑与数据访问的解耦,保障系统的可维护性与可扩展性。SpringBoot作为Java领域主流的快速开发框架,通过“约定大于配置”的理念和丰富的Starter依赖,极大地简化了Web应用的初始搭建与集成复杂度。MybatisPlus作为MyBatis的增强工具,在保留SQL灵活性的同时,通过通用CRUD封装、强大的条件构造器和代码生成器,显著提升了数据持久层的开发效率。这一技术组合的价值在于,能够帮助开发团队快速响应业务需求变化,构建

weixin_34293246的博客 416

SpringBoot+MybatisPlus实战:从零搭建智慧校园管理系统

在Java企业级应用开发中,SpringBoot以其‘约定大于配置’的理念,通过自动配置和起步依赖,极大地简化了项目初始化和部署流程,成为构建微服务和Web应用的首选框架。其核心价值在于提升开发效率、降低配置复杂度,并内嵌服务器以实现快速部署。MybatisPlus作为MyBatis的增强工具,通过强大的CRUD封装、Lambda条件构造器和代码生成器,进一步减少了数据库操作的样板代码,特别适用于需要快速迭代的业务系统。结合MySQL等关系型数据库,这套技术栈广泛应用于后台管理系统、电商平台等数据驱动型场景

weixin_33874713的博客 334

MyBatisPlus核心价值与12式效率提升实战

MyBatisPlus作为MyBatis的增强工具,通过非侵入式设计显著提升开发效率。其核心原理在于扩展MyBatis基础功能,提供智能化CRUD操作、Lambda表达式链式调用等特性,使单表操作效率提升300%以上。在技术价值层面,MP完美平衡了灵活性与开发效率,尤其适合企业级应用开发。典型应用场景包括多租户系统、高性能批量处理、数据权限控制等。通过动态表名处理器、逻辑删除深度配置等12种实战技巧,开发者可以充分发挥MP在SAAS系统、大数据处理等领域的优势。结合MyBatis-Mate组件和dynami

weixin_33895516的博客 388

Lattice FPGA 开发工具Diamond使用流程总结——工具使用

本文介绍了一般的Diamond开发流程,包括工程创建、文件输入、IP使用、约束、管脚分配、和布线布局等流程

weixin_41895751的博客 2万+

MyBatisPlus mybatis-plus-join

一、MyBatis Plus 介绍 MyBatis Plus是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 MyBatis Plus 的核心功能有:支持通用的 CRUD、代码生成器与条件构造器。 通用 CRUD:定义好 Mapper 接口后,只需要继承BaseMapper<T>接口即可获得通用的增删改查功能,无需编写任何接口方法与配置文件 条件构造器:通过EntityWrapper<T>(实体包装.....

hudeyong926的专栏 1万+

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍_nbiot ntn

你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!” />你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!

2401_83703866的博客 3166

从波形图到参数调优:一次无感BLDC电机启动失败的深度解析

本文深入解析无感BLDC电机启动失败案例,通过波形分析揭示参数不匹配和IPM保护机制触发等关键问题。详细探讨了过零点检测、PWM周期设置及强拖参数调优的底层逻辑,并分享IPM模块保护机制与实战调优技巧,最终实现99.98%的启动成功率。

weixin_29182481的博客 820

SpringBoot+MyBatisPlus 从零搭建简易博客系统实战教程

本教程详细介绍了基于SpringBoot 3.5.10和MyBatisPlus 3.5.5构建简易博客系统的完整开发流程。项目采用前后端分离架构,实现了用户注册登录、博客CRUD等核心功能,并包含JWT认证、密码加密、统一异常处理等企业级开发实践。教程从数据库设计、框架搭建开始,逐步完成持久层、业务层和控制层开发,最终实现了一个包含6个页面的完整博客系统。项目结构清晰规范,适合Java后端初学者作为第一个实战项目,为后续学习分布式系统打下基础。

m0_66687213的博客 635

Flutter UI代码生成实战:Cursor与MCP的企业级规范适配

本文探讨了在企业级Flutter项目中,如何通过配置Cursor Rules与定制Figma MCP工具,为AI代码生成设定严格的开发规范。该方法解决了AI生成代码与现有项目架构、命名约定及资源引用规范脱节的核心痛点,实现了从Figma设计稿到高质量、可维护Flutter UI代码的自动化流程,显著提升团队协作效率与代码一致性。

http9protocoller的博客 280

SpringBoot+MybatisPlus多模块系统构建实战

在中大型企业级Java应用中,模块化架构是应对业务复杂度增长、团队协作规模扩大和系统可维护性下降的核心手段。其本质是通过限界上下文划分业务边界,借助Maven多模块实现编译隔离与依赖管控,并依托MybatisPlus的跨模块实体复用、全局填充机制与Mapper扫描优化,保障数据访问层的一致性与可扩展性。该架构显著提升独立开发、测试、部署效率,支撑灰度发布与弹性扩缩容,广泛应用于PaaS/SaaS平台、微服务中台及高并发业务系统。本文以真实云平台‘蓝鲸云’为案例,详解从模块划分铁律、领域模型设计到CI/CD按

weixin_34116110的博客 364

【已解决】如何在服务器中下载huggingface模型,解决huggingface无法连接

在服务器上使用huggingface模型时,如果直接指定模型名称,用AutoTokenizer.from_pretrained(“model_name”),可能会由于网络原因会报错 Failed to connect to huggingface.co port 443 after 75018 ms: Operation time out因此我们需要下载模型到服务器上,得到模型本地的路径model_dir,再通过AutoTokenizer.from_pretrained(model_dir)方式来使用。

a61022706的博客 4万+

Apollo control模块横向控制原理及核心代码逐行解析

看完这篇文章,你会对apollo横向控制有一个整体的概念

weixin_39199083的博客 2万+

Spring Boot + MyBatis-Plus多表关联实战:海贼王角色库重构

数据库表设计是后端系统稳定性的基石。随着业务扩展,单表堆叠大量字段往往导致数据冗余、查询低效,而通过多表关联建模能有效解决这类痛点。在实际开发中,借助Spring Boot的快速集成能力与MyBatis-Plus的简洁ORM特性,开发者可以高效完成多表CRUD、分页查询及统一异常处理等工程化实现。这种设计思路尤其适用于资料站、角色库等需要结构化数据展示的场景。本文以“海贼王”主题项目为例,详细演示如何将一张包含角色、海贼团、能力等大字段的单表,重构为海贼团表、角色表、能力表三张关联表,并配合MySQL完成数

weixin_33898876的博客 464

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

TDengine与SpringBoot集成的三大断层及实战解法

TDengine作为专为时间序列优化的高性能数据库,其核心设计与传统关系型数据库存在本质差异。理解其非标准JDBC协议、时序特化SQL语义以及无状态连接模型,是实现稳定集成的前提。本文围绕License校验失败、MyBatis分页失效、MyBatisPlus批量写入异常等高频问题,深入剖析协议层、语义层与生命周期层的结构性断层,并提供驱动注册、SQL重写、TypeHandler定制、SqlInjector替换等可落地的工程化解决方案。内容覆盖TDengine JDBC驱动本质、LIMIT/SLIMIT分页逻

weixin_34292402的博客 485

AndroidKiller之APK 编译失败,无法继续下一步签名【BUG解决】【App反向解析】

文章目录项目场景:问题描述原因分析:解决方案:BUG解决 项目场景: AndroidKiller: 在反向解析APP包时报错:APK 编译失败,无法继续下一步签名。 网上很多方法都是无效的哈,我追究原因发现,这个bug的出现大部分情况都是因为Apktool的问题。 此方法:百分之百解决此bug! 错误如下: 问题描述 APK 编译失败,无法继续下一步签名! 原因分析: Apktool版本不适配的问题,现在的技术更新换代太快,我们安装AndroidKiller的时候,有时候不是官方渠道的话,他的版本是非常

一键难忘的博客 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Jackson处理和mybatis的xml转换问题

javaType (java.util.List) : jdbcType (null) combination.错误解决方案

2302_77162052的博客 215

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: java8 stream并发处理分批操作
下一篇: 博客摘录「 MySQL不区分大小写设置」2023年10月31日
codelady
博客等级 码龄11年 26粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值