这篇博客 来自spring揭秘一书的第十三章
为什么要有访问异常都有一个体系,这个我们得从DAO模式说起。
public interface IUserDao{public User findUserByPK(Integer id); public void updateUser(User user);
}
在服务层的代码里,我们只有声明一个IUserDao型的实例变量,并让spring给我们注入即可
public class UserService{private IUserDao userDao;public IUserDao getUserDao(){return userDao;}public void setUserDao(IUserDao userDao){this.userDao = userDao;}public void disableUser(Integer userId){User user = this.userDao.findUserByPK(userId);userDao.updateUser(user);}
}
假定我们的数据存储在关系型数据库中
public class JDBCUserDao implements IUserDao{@Overridepublic User findUserByPK(Integer id){// TODO Auto-generated method stubreturn null;}@Overridepublic void updateUser(User user){// TODO Auto-generated method stub}
}
如果以后数据需要从关系型数据库中迁移到文本文件中(我知道这个假设很扯淡,就是为了说明如果后来数据的存储方式发生了改变),那么我们再实现一个TextUserDao即可
public class TextUserDao implements IUserDao{@Overridepublic User findUserByPK(Integer id){// TODO Auto-generated method stubreturn null;}@Overridepublic void updateUser(User user){// TODO Auto-generated method stub}
}
我们需要改动的地方,就是再spring的配置文件里,把UserService的配置变一下即可。
import java.sql.Connection;import javax.sql.DataSource;public class JDBCUserDao implements IUserDao{//省略datasource的getsetprivate DataSource dataSource ;@Overridepublic User findUserByPK(Integer id){Connection conn = null;try{conn = getDataSource().getConnection();//....User user = new User();//........return user;} catch (SQLException e){//是抛出异常,还是在当前位置处理。。。}finally{releaseConnection(conn);}return null;}//省略updateuser与releaseConnection
}
问题就在于try catch里,如果捕获到异常
public User findUserByPK(Integer id){try{conn = getDataSource().getConnection();//....User user = new User();Statement stmt = ateStatement();ute("");//........return user;} catch (SQLException e){throw new RuntimeException(e);}
}
关键问题是,因为RuntimeException不需要在方法的签名处声明throws
catch (SQLException e){//是抛出异常,还是在当前位置处理。。。if(isMysqlVendor()){//按照mysql数据库的规则分析错误信息然后抛出throw new RuntimeException(e);}if(isOracleVendor()){//按照oracle数据库的规则分析错误信息并抛出throw new RuntimeException(e);}throw new RuntimeException(e);
}
或者我们可以吧上面的两个if判断装到一个工具类里面去。
spring已经为我们做好了下面的异常体系:
DataAccessException位于org.springframework.dao中
上面各种exception的具体职责,我就不细说了,大家百度之。
本文发布于:2024-01-28 02:03:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063786554016.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |