2016-04-29 123 views
1

我在从myBatis中检索属性时遇到问题。它说java.lang.NullPointerException。我想要的是从使用函数向数据库插入值(我正在使用oracle 10g)后自动生成的结果地图中获取user_id如何从MyBatis获取值?

我在我的映射代码如下

<resultMap type="User" id="userMap"> 
    <result property="userId" column="user_id"/> 
    <result property="someProperty1" column="property_1"/> 
    <result property="someProperty2" column="property_2"/> 
</resultMap> 

<insert id="addUser" parameterType="map" statementType="CALLABLE"> 
    { CALL 
    #{userResult, javaType=java.sql.ResultSet, jdbcType=CURSOR, mode=OUT, resultMap=userMap} := 
    PROJECT.create_user(
      #{surname,  javaType=String, jdbcType=VARCHAR, mode=IN}, 
      #{givenName, javaType=String, jdbcType=VARCHAR, mode=IN}, 
      #{middleName, javaType=String, jdbcType=VARCHAR, mode=IN}  
    )} 
</insert> 

这里就是java.lang.NullPointerException发生

return Integer.parseInt(paramMap.get("userId").toString()); 

我使用private Map<String, Object> paramMap = new HashMap<String, Object>();看来,我用paramMap.get("userId")是错误的,但我不确定与此。

任何建议或提示将是非常有益的!非常感谢!

+0

也许'paramMap'或'userId'为空,你可以调试它看看哪一个是空的。 – Blank

+0

好的,谢谢@Reno! – chiliflavor

回答

1

从数据库中获取自动生成的密钥从未标准化过,因此它往往是数据库特定的。对于Oracle,您需要先从序列中选择新的键值,然后执行插入并返回结果。 This question拥有MyBatis项目的真正原油。

一些较新的Java ER映射框架正在透明地处理这个问题。例如Spring JDBC Template有一个抽象数据库工作的GeneratedKeyHolder对象。举例来说,请参阅this question

+0

注意!感谢@kiwiron! – chiliflavor