Mybatis insert之后把主键返回给实体类

本文探讨了在MyBatis中使用Oracle序列与MySQL自增ID作为主键生成策略的方法。通过具体示例展示了如何在插入记录前为Oracle设置ID值,并比较了MySQL的简化实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  <insert id="insert" parameterType="cn.haiwaigo.sws.domain.ImportBondOrder" >
  <selectKey resultType="java.math.BigDecimal" keyProperty="id" order="BEFORE">
              select IMPORT_BOND_ORDER_SEQ.nextval as id from dual
    </selectKey>  
    insert into TB_IMPORT_BOND_ORDER (ID, ORDER_TYPE, ORDER_NO, 
      EBP_CODE, EBP_NAME, EBC_CODE, 
      EBC_NAME, GOODS_VALUE, FREIGHT, 
      DISCOUNT, TAX_TOTAL, ACTURAL_PAID, 
      CURRENCY, BUYER_REG_NO, BUYER_NAME, 
      BUYER_ID_TYPE, BUYER_ID_NUMBER, PAY_CODE, 
      PAY_NAME, PAY_TRANSACTION_ID, BATCH_NUMBERS, 
      CONSIGNEE, CONSIGNEE_TELEPHONE, CONSIGNEE_ADDRESS, 
      CONSIGNEE_DITRICT, NOTE, APP_STATUS, 
      ACTIVE, CREATE_DATE, APP_TYPE, 
      LAST_STATUS, TRANSPORT_CODE, TRANSPORT_NAME, 
      VERSION_ID, APP_TIME, FLAG, 
      PROVINCE, CITY, AREA, 
      LOGISTICS_CODE, LOGISTICS_NAME)
    values (#{id,jdbcType=DECIMAL}, #{orderType,jdbcType=VARCHAR}, #{orderNo,jdbcType=VARCHAR}, 
      #{ebpCode,jdbcType=VARCHAR}, #{ebpName,jdbcType=VARCHAR}, #{ebcCode,jdbcType=VARCHAR}, 
      #{ebcName,jdbcType=VARCHAR}, #{goodsValue,jdbcType=DECIMAL}, #{freight,jdbcType=DECIMAL}, 
      #{discount,jdbcType=DECIMAL}, #{taxTotal,jdbcType=DECIMAL}, #{acturalPaid,jdbcType=DECIMAL}, 
      #{currency,jdbcType=VARCHAR}, #{buyerRegNo,jdbcType=VARCHAR}, #{buyerName,jdbcType=VARCHAR}, 
      #{buyerIdType,jdbcType=VARCHAR}, #{buyerIdNumber,jdbcType=VARCHAR}, #{payCode,jdbcType=VARCHAR}, 
      #{payName,jdbcType=VARCHAR}, #{payTransactionId,jdbcType=VARCHAR}, #{batchNumbers,jdbcType=VARCHAR}, 
      #{consignee,jdbcType=VARCHAR}, #{consigneeTelephone,jdbcType=VARCHAR}, #{consigneeAddress,jdbcType=VARCHAR}, 
      #{consigneeDitrict,jdbcType=VARCHAR}, #{note,jdbcType=VARCHAR}, #{appStatus,jdbcType=DECIMAL}, 
      #{active,jdbcType=DECIMAL}, #{createDate,jdbcType=TIMESTAMP}, #{appType,jdbcType=DECIMAL}, 
      #{lastStatus,jdbcType=DECIMAL}, #{transportCode,jdbcType=VARCHAR}, #{transportName,jdbcType=VARCHAR}, 
      #{versionId,jdbcType=DECIMAL}, #{appTime,jdbcType=TIMESTAMP}, #{flag,jdbcType=VARCHAR}, 
      #{province,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{area,jdbcType=VARCHAR}, 
      #{logisticsCode,jdbcType=VARCHAR}, #{logisticsName,jdbcType=VARCHAR})
  </insert>


其中关键是下面这句,其中利用oracle序列当做ID存储在insert之前就给id赋值了

 <selectKey resultType="java.math.BigDecimal" keyProperty="id" order="BEFORE">
              select IMPORT_BOND_ORDER_SEQ.nextval as id from dual
    </selectKey>
mysql做法就没这么复杂,因为其ID实自增长的 只需要
<insert id="insert" parameterType="cn.haiwaigo.sws.domain.ImportBondOrder"  useGeneratedKeys="true" keyProperty="id" >
<insert>

### 使用 TkMyBatis 的 `insertSelective` 方法插入数据并返回生成的主键 ID 对于 MySQL 和 PostgreSQL,在使用 MyBatis 或其扩展库 tk-MyBatis 进行数据库操作时,可以通过配置特定选项来确保插入记录后能够自动获取由数据库生成的主键值。 当目标数据库为 MySQL 时,可以利用 `useGeneratedKeys`, `keyProperty` 及 `keyColumn` 参数配合 `@Options` 注解完成此功能[^2]。然而针对 PostgreSQL,则需注意由于其实现机制的不同——即通过序列(sequence) 来管理自增值的情况特殊处理方式[^3]。 具体来说: #### 配置 Mapper XML 文件 如果选择基于XML定义SQL映射语句的方式,则应在相应的 `<insert>` 节点内加入如下属性: ```xml <insert id="insertSelective" useGeneratedKeys="true" keyProperty="id"> <!-- SQL INSERT statement here --> </insert> ``` #### Java代码示例 而在Java端调用该方法前无需额外设置主键策略注解(特别是在PostgreSQL环境下),只需保证实体类中标记了 `@Id` 即可。下面给出一段完整的例子展示如何执行插入操作以及访问新产生的ID: ```java // 假设有一个名为User的POJO类,其中包含'id'作为主键字段,并已标注 @Id public class User { private Long id; // other fields... } // Service层逻辑 @Service public class UserService { @Autowired private UserMapper userMapper; public void addUser(User user){ int result = userMapper.insertSelective(user); if(result < 1){ throw new RuntimeException("Insert failed."); } System.out.println("Newly inserted record's ID is:" + user.getId()); } } ``` 上述代码片段展示了如何在服务层中调用 `insertSelective()` 方法并向控制台打印刚插入的数据项所对应的唯一标识符。需要注意的是,这里假设使用的持久化接口已经继承自 `BaseMapper<T>` 接口所提供的默认行为[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值