Java 如何在MyBatis Insert中使用Mysql触发器生成的值填充对象属性
我无法从函数中获取值。它在表上进行插入,并且必须返回一个数字。数据插入正确,但返回的数字始终为空 Mysql MybatisJava 如何在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
<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>