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 中字段名 = #{属性名}
的含义
部分 |
含义 |
|
数据库表中的实际字段名,必须与表结构一致。 |
|
从实体类中获取的属性名,通过反射机制读取 的值。 |
两者之间的映射关系可以通过以下方式建立:
- 显式 SQL 映射(如
a_ge = #{age}
)。 - 全局驼峰配置(
a_ge
→age
)。 - 注解映射(
@Result
或@TableField
)。