首页 > 其他分享 >MyBatis插入语句中三个关键属性的作用及使用场景解析

MyBatis插入语句中三个关键属性的作用及使用场景解析

时间:2025-01-31 18:29:24浏览次数:9  
标签:语句 Java id Orders 主键 MyBatis 解析 order 属性

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
    • 插入后需使用主键进行后续业务操作(如关联插入子表数据)
  • 示例

    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>
  • 检查步骤

    1. 确认数据库表主键是否为自增类型
    2. 检查keyProperty是否与Java对象的属性名完全一致
    3. 对于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>或程序生成主键

标签:语句,Java,id,Orders,主键,MyBatis,解析,order,属性
From: https://blog.csdn.net/aa1046615739/article/details/145400720

相关文章