Java 捕获 mybatis异常_Spring + MyBatis 框架下处理数据库异常

一、概述

使用JDBC API时,很多操作都要声明抛出java.sql.SQLException异常,通常情况下是要制定异常处理策略。而Spring的JDBC模块为我们提供了一套异常处理机制,这套异常系统的基类是DataAccessException,它是RuntimeException的一种类型,那么就不用强制去捕捉异常了,Spring的异常体系如下:

3e392607727d54f6260b9d4662651593.png

查了一下资料发现MyBatis有自己特殊的处理异常方式。Mapper这一层说白了写的还是DataAccessObject数据访问对象,异常自然也就是DataAccessException数据访问异常了。

二、示例代码

1、首先Mapper抛出异常

public interfaceISignInMapper {int insertInToSignIn( int userId,String signInTime) throwsSQLException;

}

2、Service层继续向上抛出

public interfaceISignInService {boolean insert(int userId,String signInTime)throwsDataAccessException;

}

public class SignInServiceImpl implementsISignInService{

@Overridepublic boolean insert(int userId,String SignInTime) throwsDataAccessException{int rows = this.signInDao.insertInToSignIn(userId,SignInTime);return rows > 0 ? true : false;

}

}

3、Controller中捕获并处理

try{

bool=signInService.insert(userId,signInTime);

}catch(DataAccessException e){final Throwable cause =e.getCause();if(cause instanceofMySQLIntegrityConstraintViolationException){

response.getWriter().write(mapper.writeValueAsString("Duplicate entry"));

}else{

response.getWriter().write(mapper.writeValueAsString(bool?"success":"error"));

}

response.getWriter().close();

}

catch块中```MySQLIntegrityConstraintViolationException是违反完整性约束异常,可以根据实际情况换为其他异常类型

三、Spring的DataAccessException说明

Spring的DAO框架没有抛出与特定技术相关的异常,例如SQLException或HibernateException,抛出的异常都是与特定技术无关的org.springframework.dao.DataAccessException类的子类,避免系统与某种特殊的持久层实现耦合在一起。DataAccessException是RuntimeException,是一个无须检测的异常,不要求代码去处理这类异常,遵循了Spring的一般理念:异常检测会使代码到处是不相关的catch或throws语句,使代码杂乱无章;并且NestedRuntimeException的子类,是可以通过NestedRuntimeException的getCause()方法获得导致该异常的另一个异常。Spring的异常分类有:

7df6d3814f618c19da77a29159318ade.png

Spring的DAO异常层次是如此的细致缜密,服务对象能够精确地选择需要捕获哪些异常,捕获的异常对用户更有用的信息,哪些异常可以让她继续在调用堆栈中向上传递。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值