java - 使用带有注解的MyBatis如果发生MySql错误则抛出自己的自定义异常

标签 java sql mybatis psql

这是我的问题。我正在使用 mybatis 使用注释。为此,我创建了自己的 mybatis 接口(interface),现在如果执行查询出现任何问题,我想抛出自己的自定义异常。这是我的确切意思的代码形式。

考虑我用来封装一些 SQL 查询的以下接口(interface):

 public interface MyMapper { 

      @Select("SELECT id, title, description, creationDate, modificationDate, owner_id AS \"owner.id\" "
        + " FROM article WHERE article_id = #{id}")
Article getArticle(int id);//If this fails I want my own custom Exception to be thrown

 }

正如所评论的,如果我的查询有问题或者 getArticle(int id) 的执行失败,我希望它抛出我自己的自定义异常而不是 IBatisException。如果这是不可能的,有人可以建议树层次结构吗异常 因为了解树层次结构还可以帮助我知道我可以捕获哪些异常。不幸的是,如果出现问题,我什至无法捕获 SqlException。只有 IBatisException 和 Exception。

最佳答案

首先,我将对 DAO 实例中的 MyMapper 的每个调用进行包装,并将异常层次结构保留在特定位置(ExceptionHandler):

public class MyDAO {
    MyMapper mapper;

    public Article getArticle(int id) {
        try {
            return mapper.getArticle(id);
        } catch (PersistenceException e) {//IbatisException is deprecated
            throw ExceptionHandler.handle(e);
        }
    }
}

try/catch 子句可能会在每个方法中重复,因此使用 Java 代理或 AspectJ重构异常处理功能可能是一种选择。
可能可以使用加载时编织并围绕映射器本身而不是 DAO 进行编织。但我仍然更喜欢 DAO,为自己留出扩展功能的空间。
关于异常层次结构 MyBatis 已经有异常 hierarchy它自己的。如果您使用 Spring,它有自己的数据访问异常层次结构,因此您可以尝试 MyBatis-Spring 集成。但如 documentation状态,基本 DataAccessException 是

Root of the hierarchy of data access exceptions discussed in Expert One-On-One J2EE Design and Development

因此,您可能会尝试根据上述书籍实现类似的东西。

关于java - 使用带有注解的MyBatis如果发生MySql错误则抛出自己的自定义异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24779906/

相关文章:

java - 是否有更优雅的方法来从流中选择 max 或 min 方法?

java - Jooq 错误 : missing FROM-clause entry for table for nested query(sum and group by)

java - 使 Java 字符串可用于 SQL 脚本

mysql - Sql Server 2008,在通用查询中选择本周的日期?

java - MyBatis 多结果集与过程

java - 从字符串列表中删除停用词

python - MySQL - 匹配两个包含巨大数据的表并找到相似的数据

spring - @NotTransactional替代

java - [SQL]如何在一个 SELECT 中填充具有另一个表列表的对象?

java - 在 TextView 中加减数字