2

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

2 回答 2

4

您可以像往常一样捕获PersistenceException

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

}

但不要忘记,这Exception包含了真实的:

来自 MyBatis 代码

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

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

请注意,MyBatis 也可以启动自己的PersistenceException( TooManyResultException, BindingException...) 类,这些类不会包含原因 Exception

于 2014-02-10T13:45:55.053 回答
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;
        }

是重新抛出异常还是在这里消费和处理是你的选择。但是,请注意“吃掉”它而不是处理问题,因为这将允许调用代码在不知道底层数据访问问题的情况下进行。

于 2013-08-22T19:39:30.890 回答