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

Java 如何在MyBatis Insert中使用Mysql触发器生成的值填充对象属性,java,mysql,sql,spring,mybatis,Java,Mysql,Sql,Spring,Mybatis,我无法从函数中获取值。它在表上进行插入,并且必须返回一个数字。数据插入正确,但返回的数字始终为空 Mysql Mybatis <insert id="insertOrder" useGeneratedKeys="true" keyProperty="id" parameterType="DriverOrder"> INSERT INTO DRIVER_ORDER(ID,ORDER_NUMBER,AREA_START,AREA_END,CREATE_USER,CREA

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

Mysql

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>
返回对象所有属性都具有正确的值include id,除了触发集值为return null的order_number。
有什么问题吗?

问题不在于触发器,而在于如何使mybatis在插入记录时获得mysql端生成的值。Mybatis是一个相当简单的工具,因为您不能指定属性到列的映射,其他一切都是自动进行的

Mybatis的核心是sql查询,而不是像hibernate中那样的属性到列的映射。所以mybatis只执行查询,并简化了从查询结果设置参数和构造对象的过程

不过,从3.2.6版开始,您可以使用selectKey在插入的对象中获取多个值并设置属性。如果你把这个和你能得到你需要的结合起来。对于您的案例,它是这样做的:

<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> 

{id}或任何其他值/元组在insert语句中是唯一的吗?然后您可以使用。是的,是双唯一键,有id和orderNumber,id是自动递增的,orderNumber是语义序列
<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>
<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>