Java 使用MyBatis从DB2获取生成的密钥

Java 使用MyBatis从DB2获取生成的密钥,java,mybatis,Java,Mybatis,我有一个使用自动生成列生成的表,但我无法使用MyBatis检索ID。我已经通过测试证明了SQL正在工作,并且正在插入行,但是我无法生成ID XML配置为: <insert id="insertRequestTrackingRow" parameterType="map"> INSERT INTO XML_LOG_T (REQ_SRC_SYS_CDE, REQ_USR_ID, REQ_XML_DOC, ROW_CRT_DTM, ROW_UPDT_DTM) VALUES

我有一个使用自动生成列生成的表,但我无法使用MyBatis检索ID。我已经通过测试证明了SQL正在工作,并且正在插入行,但是我无法生成ID

XML配置为:

<insert id="insertRequestTrackingRow" parameterType="map">
    INSERT INTO XML_LOG_T (REQ_SRC_SYS_CDE, REQ_USR_ID, REQ_XML_DOC, ROW_CRT_DTM, ROW_UPDT_DTM)
    VALUES (#{sourceSystemCode}, #{userID}, #{message}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
</insert>
返回的总是1,我相信是插入的记录数。我肯定我错过了一些明显的东西,但我看不见树木中的树木。

怎么样

<insert id="insertRequestTrackingRow" parameterType="map" 
        useGeneratedKeys="true" keyProperty="id">
    INSERT INTO XML_LOG_T (REQ_SRC_SYS_CDE, REQ_USR_ID, REQ_XML_DOC, ROW_CRT_DTM, ROW_UPDT_DTM)
    VALUES (#{sourceSystemCode}, #{userID}, #{message}, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
</insert>

插入XML日志(请求SRC系统CDE、请求USR ID、请求XML文档、行CRT DTM、行UPDT DTM)
值(#{sourceSystemCode}、#{userID}、#{message}、当前时间戳、当前时间戳)
下面是一个很好的方法

基本上,对于INSERT语句,您必须在XML配置中使用useGeneratedKeys=“true”和keyproperty=“keyfield”属性。然后将返回的键字段值插入到参数对象中,并可以从中检索。类似于以下代码示例的内容应该可以工作:

SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("sqlConfig.xml"));
SqlSession sess = sqlMapper.openSession();
try {
   Map<String,String> paramObj = new HashMap<String,String>();
   paramObj.put("param1", "value");
   int result = sess.insert("insertRequestTrackingRow", paramObj);
   System.out.println("REQ_ID: " + paramObj.get("REQ_ID"));
}
finally {
   sess.close();
}
SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader(“sqlConfig.xml”);
SqlSession sess=sqlMapper.openSession();
试一试{
Map paramObj=新的HashMap();
paramObj.put(“param1”,“value”);
int result=sess.insert(“insertRequestTrackingRow”,paramObj);
System.out.println(“请求ID:+paramObj.get(“请求ID”);
}
最后{
sess.close();
}

是的,我在文档中看到了这些属性,但它们依赖于我将对象传递到数据库,对吗?我不希望发明一个对象只是为了将数据输入数据库并再次输出生成的键值,但这可能是唯一的方法。生成的键值将插入到您使用的任何参数对象中,只要它有一个设置器,MyBatis可以用它来设置值。请看我在上面的回复中编辑的代码。当您说“只要它有一个setter”时,一切都变得清晰了。我实际上改变了我的实现,现在在这个地方传递一个对象,但是你的回答非常有用。谢谢
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("sqlConfig.xml"));
SqlSession sess = sqlMapper.openSession();
try {
   Map<String,String> paramObj = new HashMap<String,String>();
   paramObj.put("param1", "value");
   int result = sess.insert("insertRequestTrackingRow", paramObj);
   System.out.println("REQ_ID: " + paramObj.get("REQ_ID"));
}
finally {
   sess.close();
}