You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MyBatis插入用selectKey时报错‘unsupported return type: java.lang.String’解决方法

问题修复方案

错误原因

MyBatis的<insert>标签对应的DAO方法默认返回受影响的行数(int类型),你将DAO方法的返回类型设为String,直接导致了类型不匹配的错误。<selectKey>的作用是把生成的主键值注入到传入的Order对象的orderCode属性中,并非让<insert>方法直接返回该字符串。

修复方案

方案一:遵循MyBatis规范(推荐)

  1. 修改DAO接口方法返回类型
    将DAO方法的返回类型改为int:
    int makeNewOrder(Order order);
    
  2. 获取生成的orderCode
    调用方法时,传入Order对象,执行插入后直接从对象中获取生成的主键:
    Order order = new Order();
    order.setStoreCode("xxx");
    // 执行插入操作
    int affectedRows = orderDao.makeNewOrder(order);
    // 从对象中取出生成的订单编号
    String orderCode = order.getOrderCode();
    

方案二:强制让DAO返回String类型(不推荐,破坏规范)

如果一定要让DAO方法直接返回生成的orderCode,可以拆分为两步操作:

  1. 先通过<select>标签生成并获取主键
  2. 再执行插入操作

XML配置示例:

<select id="generateOrderCode" resultType="java.lang.String">
    select to_char(sysdate, 'yyyymmdd') || order_seq.nextval || #{storeCode} from dual
</select>

<insert id="makeNewOrder" parameterType="Order">
    insert into
        orders 
        (orderCode
         , storeCode
         <if test="memberId != null"> , memberId </if>
         , orderState)
    values
        ( #{orderCode}
        , #{storeCode}
        <if test="memberId != null"> , #{memberId} </if>
        , 'apply')
</insert>

DAO接口:

String generateOrderCode(String storeCode);
int makeNewOrder(Order order);

调用逻辑:

String storeCode = "xxx";
// 先生成订单编号
String orderCode = orderDao.generateOrderCode(storeCode);
Order order = new Order();
order.setOrderCode(orderCode);
order.setStoreCode(storeCode);
// 其他属性赋值
orderDao.makeNewOrder(order);

额外注意事项

  • 确保Order类中存在orderCode的setter方法,否则MyBatis无法将生成的主键值注入到对象中。
  • 你原本的<selectKey>配置本身是正确的(resultType="java.lang.String"、keyProperty="orderCode"、order="BEFORE"),无需修改这部分。

内容的提问来源于stack exchange,提问作者Mizue Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:52:43