MyBatis插入用selectKey时报错‘unsupported return type: java.lang.String’解决方法
问题修复方案
错误原因
MyBatis的<insert>标签对应的DAO方法默认返回受影响的行数(int类型),你将DAO方法的返回类型设为String,直接导致了类型不匹配的错误。<selectKey>的作用是把生成的主键值注入到传入的Order对象的orderCode属性中,并非让<insert>方法直接返回该字符串。
修复方案
方案一:遵循MyBatis规范(推荐)
- 修改DAO接口方法返回类型
将DAO方法的返回类型改为int:int makeNewOrder(Order order); - 获取生成的orderCode
调用方法时,传入Order对象,执行插入后直接从对象中获取生成的主键:Order order = new Order(); order.setStoreCode("xxx"); // 执行插入操作 int affectedRows = orderDao.makeNewOrder(order); // 从对象中取出生成的订单编号 String orderCode = order.getOrderCode();
方案二:强制让DAO返回String类型(不推荐,破坏规范)
如果一定要让DAO方法直接返回生成的orderCode,可以拆分为两步操作:
- 先通过
<select>标签生成并获取主键 - 再执行插入操作
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
相关产品推荐
相关产品推荐

