在 Java 中,DAO(Data Access Object,数据访问对象) 是一种设计模式,用来把业务逻辑和数据访问逻辑分离,让代码更清晰、更易维护。
下面我从 概念 → 结构 → 示例 → 常见用法 一步步说明。
DAO 的作用:
一句话:
DAO 负责“怎么存、怎么取”,Service 负责“做什么”
一般一个 DAO 包含 4 个部分:
Entity(实体类)
DAO 接口
DAO 实现类
Service(业务层)
public class User {
private int id;
private String name;
private int age;
// getter / setter
}
public interface UserDao {
void addUser(User user);
User getUserById(int id);
List<User> getAllUsers();
void deleteUser(int id);
}
✅ 好处:业务层只依赖接口,不关心实现
public class UserDaoImpl implements UserDao {
private Connection connection;
public UserDaoImpl(Connection connection) {
this.connection = connection;
}
@Override
public void addUser(User user) {
String sql = "INSERT INTO user(name, age) VALUES (?, ?)";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setString(1, user.getName());
ps.setInt(2, user.getAge());
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public User getUserById(int id) {
String sql = "SELECT * FROM user WHERE id = ?";
try (PreparedStatement ps = connection.prepareStatement(sql)) {
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
return new User(id, rs.getString("name"), rs.getInt("age"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 其他方法省略
}
public class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
public void registerUser(User user) {
// 业务逻辑
if (user.getAge() < 18) {
throw new RuntimeException("年龄太小");
}
userDao.addUser(user);
}
}
✅ Service 不关心 JDBC、SQL
@Mapper
public interface UserDao {
void insert(User user);
User selectById(int id);
}
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(int id);
✅ MyBatis 自动实现 DAO
✅ 不需要写实现类
| 场景 | 是否用 DAO |
|---|---|
| JDBC | ✅ 推荐 |
| MyBatis | ✅ 必须 |
| JPA / Hibernate | ✅ Repository 本质也是 DAO |
| 简单小项目 | 可选 |
✅ 解耦
✅ 易维护
✅ 易测试
✅ 易扩展(换数据库)
❌ Service 里直接写 SQL
❌ DAO 里写业务逻辑
❌ 一个 DAO 操作多张表(职责不清)
DAO = 数据库操作的“中间人”,让业务代码更干净
如果你愿意,我可以:
你现在是 学 Java 基础、做课设,还是实际项目?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。