如何捕获mybatis异常“org.apache.ibatis.exceptions.PersistenceException”?

时间:2013-05-26 01:34:53

标签: java mybatis

以下是代码示例,我想捕获mybatis抛出的异常:

String resource = "com/sureone/server/db/mybatis-config.xml";
Reader reader = null;
try {
    reader = Resources.getResourceAsReader(resource);
} catch (IOException e) {
    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
}
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = factory.openSession(true);
tUserMapper = sqlSession.getMapper(TUserMapper.class);

if(tUserMapper.insert(user)>0){     <===Exception throwed here for duplicate entry problem 
   return verifyLogin(user.getAccount(),user.getPassword());
}
return null;

我想捕获的例外:

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'userName' for key 'account_UNIQUE'

2 个答案:

答案 0 :(得分:3)

您可以像平常一样捕获PersistenceException

try {
  ...
} catch (PersistenceException pe) {

}

但不要忘记这个Exception包裹了真实的那个:

来自MyBatis代码

} catch (Exception e) {
  throw ExceptionFactory.wrapException("Error committing transaction.  Cause: " + e, e);
}

因此,如果您希望了解PersistenceException的原因,则必须使用.getCause()

上的PersistenceException方法

请注意,MyBatis也可以启动自己的PersistenceExceptionTooManyResultExceptionBindingException ...)类,这些类不会有原因 { {1}}包裹。

答案 1 :(得分:2)

您可以通过在调用myBatis查询/插入的语句周围添加try / catch块来捕获ibatis异常。例如,如果使用SqlSessionTemplate和selectList()方法,则可以执行以下操作:

        try {
            myResults = mySqlSessionTemplate.selectList("getInfoList", parameterMap);
        } catch (final org.apache.ibatis.exceptions.PersistenceException ex) {
            logger.error("Problem accessing database");
            throw ex;
        }

您是否重新抛出异常或消费并在此处理它是您的选择。但是,要注意“吃掉”而不是处理问题,因为这样可以在不知道底层数据访问问题的情况下调用代码进行操作。