[英]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.