DAO层的异常最好是让上一层知道,这样就可以使上一层知道出错是否还进行下一步操作.
首先看看我们的项目的架构:
Com.mengya.dao.innter接口层(只定义方法):
public void addUser(User user);
public User getUser(int userId);
public User findUser(String loginName, String password);
public void update(User user);
public void delete(User user);
com.mengya.dao.imple DAO的实现
public class UserDaoJdbcImpl implements UserDao {
public void addUser(User user) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
String sql = "insert into user(name,birthday, money) values (?,?,?) ";
ps = conn.prepareStatement(sql);
ps.setString(1, user.getName());
ps.setDate(2, new java.sql.Date(user.getBirthday().getTime()));
ps.setFloat(3, user.getMoney());
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (rs.next())
user.setId(rs.getInt(1));
} catch (SQLException e) {
throw new DaoException(e.getMessage(), e);
//1,如果这里我们打印异常信息,那么上一层即业务逻辑层就不知道,它
可能以为正常执行了.它可能会按照正确执行再执行下一步的操作.
2,如果这里我们简单的throw e.那么我们的这个方法就要改成:
public class UserDaoJdbcImpl implements UserDao throws
Exceiotn{},这也会导到我们的接口里的方法也要改成方法后面throw 一
个SQLException如果我们的接口的实现也是SQL实现了,并且这里是
CheckException,在我们的业务逻辑层调用时也要用try...catch.这
样的话就改动很大.
所以在这里我们就要用RunctimeException了。上面的问题都可以解决。
第一, 如果有异常上层即业务逻辑层肯定知道.因为这样的话程序出错了.
第二, 不用修改我们定义好了的接口,RunctimeException可以try...catch也可以不.
第三, 在我们业务逻辑层调用的时候也不需要非要try...catch也可以选择不try...catch.
} finally {
JdbcUtils.free(rs, ps, conn);
}
}
//其它方法就不写了...
}
自己定义的异常类,继承于RuntimeExceptin.也没有重写RuntimeException里面的方法,只是简单的一个继承而已.
public class DaoException extends RuntimeException {
private static final long serialVersionUID = 1L;
public DaoException() {
}
public DaoException(String message) {
super(message);
}
public DaoException(Throwable cause) {
super(cause);
}
public DaoException(String message, Throwable cause) {
super(message, cause);
}
}