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

Java 如何捕获mybatis异常;org.apache.ibatis.exceptions.PersistenceException“;?,java,exception,mybatis,Java,Exception,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 st

下面是代码示例,我想捕获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;

通过在调用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;
        }

无论您是重新抛出异常还是消费并处理它,这里都是您的选择。但是,请注意不要“吃掉”它,也不要处理问题,因为这将允许调用代码,而不知道底层的数据访问问题。

您可以像通常那样捕获
PersistenceException

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

}
但别忘了,这个
异常
包装了真正的异常:

来自MyBatis代码

因此,如果您想了解
PersistenceException
的原因,您必须在
PersistenceException
上使用
.getCause()
方法


请注意,MyBatis还可以启动自己的
持久性异常
TooManyResultException
BindingException
…)类,这些类不会包含原因
异常

您还可以在SO线程中检查代码完整答案。但是,在您的情况下,由于您使用的是“org.apache.ibatis…”包,因此您需要捕获PersistenceException而不是NestedSQLException,因为它将真正的原因封装在它下面。+1对于MyBatis代码,您可能还希望包含捕获PersistanceException原因的示例,例如,原因:MySQLIntegrityConstraintViolationException
try {
  ...
} catch (PersistenceException pe) {

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