MyBatis 进行数据库操作时

简介: 在使用 MyBatis 进行数据库操作时,若 `INSERT` 语句省略字段名,则需确保实体类属性顺序与表结构字段顺序完全一致。此时,参数值会按顺序传递给数据库,与属性名或字段名无关。而查询操作基于字段名与属性名的映射关系,需保证名称一致。因此,插入操作依赖顺序,查询操作依赖映射。

insert理解:

省略了字段名

VALUES 的顺序必须与表结构完全一致。

  • MyBatis 行为:当 INSERT 语句省略字段列表时,MyBatis 会按 实体类属性的顺序(而非名称)将参数值传递给数据库。
  • 数据库行为:数据库会按 表结构的字段顺序 依次接收值,与实体类属性名无关。


  • 省略了字段名,要求实体类属性的顺序与表结构的字段顺序保持一致,按照顺序插入

2. 实体类属性顺序与表结构字段顺序匹配

  • 你的实体类属性顺序(id, name, no, gender, ...)与表结构的字段顺序(id, name, no, gender, ...)完全一致
  • 因此,即使属性名与字段名不一致(如 idCard 对应 id_card),值的传递顺序仍然正确,数据库能够正确匹配

插入操作与查询操作的本质区别

查询基于映射,因此要保证,实体类属性的名字  与  表结构的字段名 保持一致

插入基于顺序

  • 插入操作(INSERT
    SQL 中的字段顺序需与参数值顺序严格一致(如INSERT INTO table (id, name) VALUES (#{id}, #{name})),这是因为插入时需要按顺序填充字段值。
  • 例如:用户之前的插入语句VALUES(null,#{name},#{no},...)中,参数顺序必须与表字段顺序一致,否则会报错(如 “列数不匹配”)。
  • 查询操作(SELECT
    映射的目标是将结果集的 “字段名 - 值” 映射到对象的 “属性名 - 值”,因此必须基于名称关联,而非顺序。

总结:SQL 中字段名 = #{属性名}的含义

部分

含义

a_ge

数据库表中的实际字段名,必须与表结构一致。

#{age}

从实体类中获取的属性名,通过反射机制读取student.getAge()

的值。

两者之间的映射关系可以通过以下方式建立:

  1. 显式 SQL 映射(如a_ge = #{age})。
  2. 全局驼峰配置a_ge age)。
  3. 注解映射@Result@TableField)。


相关文章
|
1月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
1月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
1月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
1月前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
1月前
|
XML Java Maven
@Bean`注解的使用方法及其作用
本文介绍了Spring框架中`@Bean`注解的使用方法及其作用,包括如何将第三方类库加入Spring容器,配置类与`@Configuration`的配合使用,以及通过`@ConditionalOnClass`、`@ConditionalOnMissingBean`等条件注解控制Bean的加载。同时讲解了Maven父子模块间的依赖关系及配置方式,帮助开发者更好地管理项目结构与依赖注入。
|
1月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
1月前
|
存储 缓存 Linux
CPU上下文切换的原理及其在系统调用和进程切换中的应用
本内容深入解析了CPU上下文切换的原理及其在系统调用和进程切换中的应用。详细说明了CPU寄存器、程序计数器在任务切换中的作用,以及系统调用与进程上下文切换的区别。同时探讨了上下文切换带来的性能开销,涉及TLB和虚拟内存管理机制,帮助理解操作系统如何高效调度进程。
|
1月前
|
消息中间件 网络性能优化
了解MQ
消息堆积处理核心在于平衡生产与消费速度,可通过限流生产、优化消费者处理能力及异步机制缓解。RabbitMQ通过持久化、确认机制保障消息可靠性,MQTT则依赖QoS等级确保传输。延迟消息常用死信队列实现,而幂等性可通过唯一ID避免重复消费。MQ广泛用于异步处理、系统解耦及分布式事务等场景。
|
1月前
|
存储 SQL 关系型数据库
mysql理解
本文介绍了MySQL查询语句的书写顺序与执行顺序的区别,多表查询的实现方式,包括内连接、外连接的使用与差异,以及CHAR与VARCHAR字段类型的异同点,帮助开发者更好地理解和优化SQL查询。