日期:2014-05-18  浏览次数:20746 次

新人求教:关于ibatis的SqlMapClient,怎么避免异常声明?
比如一个接口
public interface Facade{
   public boolean Login(String username,String password);
}

一个实现(通过Spring注入一个SqlMapClient):
class FacadeImpl implements Facade{
   private SqlMapClient Mapper;
   
   public boolean Login(String username,String password){
      HashMap map ....此处省略,主要是把参数放进去
      return Mapper.QueryForObject("test",map)==null;
   }
}

问题来了,MyEclipse5.1GA报错,说SqlMapClient的QueryForObject方法声明了异常SQLException抛出,
必须在Login方法上同样声明抛出此类异常,这倒也ok,问题是后面又说接口也要声明异常,这就痛苦了,
难道我的每个接口的方法一涉及到数据库就得声明这个异常吗?感觉太不人性化了啊,我看过另一个项目的源代码,人家的Service接口就从来没有声明过throws,这是怎么回事,他用了SqlClientTempla以及support等iBatis提示不建议使用的类,我都糊涂了,求好心人解惑,非常感谢!!!!

------解决方案--------------------
正确的处理异常抛出异常是个好习惯,如果sql语句出错了也没有异常怎么debug
千万别出现
try{
    ...
}catch(Exception e){
    //最差劲也要throw
}
当然 你也可以写一个 baseService 把QueryForObject 这些方法重新封装一下 然后里面都
try{
    Mapper.QueryForObject...
}catch(Exception e){
    e.printStackTrace();
}
不过不建议这么做,如果有事物的话不会回滚,后续还有其他操作的话不会中断。可能遇到意想不到的结果那时候就会很欢乐
------解决方案--------------------
引用:
我是Spring3.2+ibatis2.3.4的,为什么别人的代码都不用throws?我觉得出现异常应该由spring框架自动帮我捕获抛出,但我搞不懂怎么弄,每个方法都throws,效率要降低很多阿,尤其是需要在与实现无关的接口中作这种声明,太要命了

我们也用ssi框架都要抛出异常,分系统异常和业务异常,我觉得还是让spring帮你写代码比较好,service层如果不抛异常的话spring配置的事物就不起作用,接口声明怎么会与实现无关。异常不抛出的话调用者就不能捕获。习惯了就好了,写代码的时候 throws XXException 都是下意识打出来的不打都会觉得别扭