繁体   English   中英

如何在MyBatis插入中使用Mysql触发器生成的值填充对象属性

[英]How to populate object property with value generated by Mysql Trigger in MyBatis Insert

我无法从函数取回值。 它在表上插入,并且必须返回数字。 数据已正确插入,但返回的数字始终为null。

Mysql的

create table driver_order (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  area_start varchar(200),
  area_end varchar(200),
  order_number varchar(200),
  create_user varchar(200),
  primary key (id)
);

DELIMITER $$
CREATE TRIGGER seq_driver_order_number BEFORE INSERT ON driver_order
FOR each ROW
BEGIN
    DECLARE seq_type INT(10);
    SET seq_type = getUserNo(NEW.create_user);
    SET NEW.order_number = getNextCommSequence("motor", seq_type);
END$$
DELIMITER ;

MyBatis的

<insert id="insertOrder" useGeneratedKeys="true" keyProperty="id" parameterType="DriverOrder">
    INSERT INTO 
    DRIVER_ORDER(ID,ORDER_NUMBER,AREA_START,AREA_END,CREATE_USER,CREATE_TIME) 
    VALUES
      (#{id},
       #{orderNumber,jdbcType=VARCHAR},
       #{areaStart,jdbcType=VARCHAR},
       #{areaEnd,jdbcType=VARCHAR},
       #{createUser,jdbcType=VARCHAR},
       now())
</insert>

返回对象的所有属性都具有正确的值,包括id,但order_number除外,其中TRIGGER设置的值返回null。 有什么不对?

问题不在于触发器,而是如何使mybatis获取在记录插入期间在mysql端生成的值。 从某种意义上讲,Mybatis是一种非常简单的工具,您无法为列映射指定属性,其他所有事情都会自动发生。

Mybatis的核心是sql查询,而不是像hibernate这样的属性到列的映射。 因此,mybatis仅执行查询,并简化了查询结果中的设置参数和构造对象。

但是,从版本3.2.6开始,您可以使用selectKey获取多个值并在要插入的对象中设置属性。 如果将此与last_insert_id()结合使用, 可以得到所需的内容。 对于您的情况,它是这样完成的:

<insert id="insertOrder" parameterType="DriverOrder">
  <selectKey keyProperty="id,orderNumber" keyColumn="ID,ORDER_NUMBER" order="AFTER" resultType="java.util.Map">
    SELECT ID,ORDER_NUMBER FROM DRIVER_ORDER where ID = last_insert_id()
  </selectKey>
  INSERT INTO 
   DRIVER_ORDER(ID,ORDER_NUMBER,AREA_START,AREA_END,CREATE_USER,CREATE_TIME) 
  VALUES
   (#{id},
    #{orderNumber,jdbcType=VARCHAR},
    #{areaStart,jdbcType=VARCHAR},
    #{areaEnd,jdbcType=VARCHAR},
    #{createUser,jdbcType=VARCHAR},
    now())
</insert> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM