MyBatis插入语句中三个关键属性的作用及使用场景解析
一、属性作用说明
属性 | 作用描述 | 代码示例 |
---|---|---|
parameterType="Orders" | 指定传入SQL语句的参数类型为Orders 类,用于指导MyBatis将Java对象属性映射到SQL占位符 | <insert id="insert" parameterType="Orders"> |
useGeneratedKeys="true" | 启用数据库自动生成的主键(如自增ID)回填功能,适用于支持主键自增的数据库(如MySQL) | useGeneratedKeys="true" |
keyProperty="id" | 定义将数据库生成的主键值回填到参数对象的id 属性中,使Java代码可直接获取生成的主键 | keyProperty="id" |
二、使用场景及示例
1. parameterType="Orders
"
-
场景:
当插入操作的参数是一个具体的Java对象(如Orders
实体类),且需要明确指定参数类型以避免MyBatis映射歧义时使用。 -
示例:
// Java代码调用Mapper接口 Orders order = new Orders(); order.setNumber("ORDER_202309"); order.setUserId(1001); // 其他字段赋值... orderMapper.insert(order); // 此处传入Orders对象
-
何时可省略:
若Mapper接口方法的参数类型已明确(如void insert(Orders order);
),MyBatis可自动推断类型,此时可省略parameterType
。
2. useGeneratedKeys="true"
+ keyProperty="id"
-
场景:
需要插入记录后立即获取数据库自动生成的主键值(如订单ID、用户ID等),常见于以下情况:- 主键为数据库自增字段(MySQL
AUTO_INCREMENT
) - 插入后需使用主键进行后续业务操作(如关联插入子表数据)
- 主键为数据库自增字段(MySQL
-
示例:
Orders order = new Orders(); order.setNumber("ORDER_202309"); // 设置其他字段... orderMapper.insert(order); // 执行插入 // 插入后自动回填主键到order对象的id属性 Long generatedId = order.getId(); // 直接获取生成的ID System.out.println("新订单ID:" + generatedId);
-
数据库兼容性:
数据库 是否支持 useGeneratedKeys
替代方案 MySQL ✅ 直接支持 无需额外配置 Oracle ❌ 不直接支持 使用 <selectKey>
查询序列值(如下示例)Oracle兼容写法:
<insert id="insert"> <selectKey keyProperty="id" resultType="Long" order="BEFORE"> SELECT order_seq.NEXTVAL FROM DUAL </selectKey> INSERT INTO orders (id, number, ...) VALUES (#{id}, #{number}, ...) </insert>
三、常见问题及解决方案
1. 插入后获取不到主键值
-
可能原因:
keyProperty
未正确指向对象的属性名(如对象实际属性为orderId
,但配置为id
)- 数据库不支持自增主键,但未配置替代方案(如Oracle未使用
<selectKey>
)
-
检查步骤:
- 确认数据库表主键是否为自增类型
- 检查
keyProperty
是否与Java对象的属性名完全一致 - 对于Oracle,改用
<selectKey>
标签手动获取序列值
2. 参数类型映射错误
-
错误现象:
There is no getter for property 'xxx' in 'class Orders'
-
解决方案:
- 检查
parameterType
是否与传入的Java对象类型一致 - 确认Java对象的字段名与SQL中的占位符
#{xxx}
匹配
- 检查
四、总结:何时使用这三个属性?
场景 | 需配置的属性 |
---|---|
插入参数为明确的Java对象 | parameterType="Orders" (可选) |
需要获取数据库自增主键(如MySQL) | useGeneratedKeys="true" + keyProperty="id" |
使用非自增主键(如Oracle序列、UUID) | 替换为<selectKey> 或程序生成主键 |