【问题标题】:How to populate object property with value generated by Mysql Trigger in MyBatis Insert如何在 MyBatis Insert 中使用 Mysql Trigger 生成的值填充对象属性
【发布时间】:2014-12-03 07:07:55
【问题描述】:

我无法从函数中取回值。它在表上进行插入,并且必须返回一个数字。数据插入正确,但返回的数字始终为空。

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。 有什么问题吗?

【问题讨论】:

  • #{id} 或任何其他值/元组在您的插入语句中是唯一的吗?那么你可以使用&lt;selectKey&gt;
  • 是的,是双唯一键,有id和orderNumber,id是AUTO_INCREMENT,orderNumber是语义序列

标签: java mysql sql spring mybatis


【解决方案1】:

问题不在于触发器,而在于如何让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> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2010-12-05
    • 2011-09-12
    • 2020-02-04
    相关资源
    最近更新 更多