在 Java 中,DAO(Data Access Object,数据访问对象)是一种常见的设计模式,用于把业务逻辑与数据访问逻辑分离,让代码更清晰、更易维护。下面我从设计思想 → 基本结构 → 示例代码 → 常见变体 → 最佳实践几个方面说明。
DAO 的作用:
一句话概括:
DAO 负责“怎么存”,Service 负责“做什么”
Controller
↓
Service
↓
DAO
↓
Database
public class User {
private Long id;
private String username;
private String password;
// getter / setter
}
public interface UserDao {
User findById(Long id);
List<User> findAll();
void insert(User user);
void update(User user);
void delete(Long id);
}
✅ 好处:以后可以换实现(JDBC → MyBatis → JPA)
public class UserDaoJdbcImpl implements UserDao {
private DataSource dataSource;
public UserDaoJdbcImpl(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
public User findById(Long id) {
String sql = "SELECT id, username, password FROM user WHERE id = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setLong(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
return null;
}
// 其他方法省略
}
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public User getUser(Long id) {
return userDao.findById(id);
}
}
public interface BaseDao<T, ID> {
T findById(ID id);
List<T> findAll();
void insert(T entity);
void update(T entity);
void delete(ID id);
}
public class UserDaoImpl extends BaseDaoImpl<User, Long> {
}
✅ 适合 CRUD 非常多的场景
@Mapper
public interface UserDao {
User selectById(Long id);
void insert(User user);
}
<select id="selectById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
✅ 实际项目中最常见
public interface UserRepository
extends JpaRepository<User, Long> {
}
✅ 几乎不用写 SQL
❌ 不要在 DAO 中写业务逻辑
// 错误示例
if (user.getAge() > 18) { ... }
DAO 对上层屏蔽数据库细节
User → UserDao
Order → OrderDao
throw new DaoException("查询用户失败", e);
| 对比 | DAO | Repository |
|---|---|---|
| 来源 | 经典设计模式 | DDD |
| 强调 | 数据访问 | 领域对象集合 |
| 使用 | JDBC / MyBatis | JPA / Spring Data |
实际项目中:
DAO 是“数据库访问的门面”,负责把 SQL / 持久化细节藏起来,只暴露业务需要的数据操作。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。