Java 如何捕获mybatis异常;org.apache.ibatis.exceptions.PersistenceException“;?
下面是代码示例,我想捕获mybatis引发的异常: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
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);
}