在 Java 开发中,DAO(Data Access Object)之所以要“抽象”,本质目的不是为了炫技,而是为了解耦、可维护、可测试、可扩展。下面从几个关键角度说明。
DAO 的作用是:让业务层不关心“数据从哪里来、怎么存”。
没有抽象时:
// Service 里直接写 SQL
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE id = ?");
问题:
✅ 抽象后:
User user = userDao.findById(1);
业务层只关心“取用户”,不关心 SQL。
DAO 通常被抽象成接口:
public interface UserDao {
User findById(Integer id);
void save(User user);
}
实现可以是:
UserDao dao = new JdbcUserDao();
UserDao dao = new MyBatisUserDao();
好处:
抽象 DAO 后,可以轻松使用 Mock:
UserDao mockDao = Mockito.mock(UserDao.class);
when(mockDao.findById(1)).thenReturn(new User(1, "Tom"));
UserService service = new UserService(mockDao);
如果没有抽象:
抽象 DAO 可以统一方法命名和行为:
UserDao
OrderDao
ProductDao
统一风格:
findByIdsavedeletelistAll避免:
getUserqueryUserById在 DAO 抽象层可以统一:
try {
// DAO 操作
} catch (SQLException e) {
throw new DataAccessException("数据库错误", e);
}
业务层无需关心底层异常细节。
例如:
UserDao dao = new CachedUserDao(new JdbcUserDao());
interface UserDao {}
class JdbcUserDao implements UserDao {}
public interface BaseDao<T, ID> {
T findById(ID id);
void save(T t);
}
JpaRepositoryDAO 抽象不是银弹:
可以:
Java DAO 抽象,是为了让“业务不知道数据怎么存”,从而做到解耦、可替换、可测试、可维护。
如果你愿意,我也可以结合 Spring / MyBatis / JPA 给你一个具体的 DAO 抽象示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。