在 Java 中,DAO(Data Access Object,数据访问对象) 的核心思想是:
把对数据库的访问逻辑封装起来,业务层只关心“调用 DAO 的方法”,不关心 SQL 怎么写。
下面我用最常见、最清晰的方式给你讲:DAO 怎么写 + 怎么调用。
一般会分成三层:
Service 层(业务逻辑)
↓ 调用
DAO 层(数据访问)
↓ 操作
数据库(MySQL / Oracle 等)
public class User {
private int id;
private String username;
private String password;
// getter / setter
}
public interface UserDao {
User findById(int id);
void addUser(User user);
void deleteUser(int id);
}
public class UserDaoImpl implements UserDao {
@Override
public User findById(int id) {
User user = null;
String sql = "SELECT * FROM user WHERE id = ?";
try (
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)
) {
ps.setInt(1, id);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
@Override
public void addUser(User user) {
String sql = "INSERT INTO user(username, password) VALUES (?, ?)";
try (
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)
) {
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void deleteUser(int id) {
// 类似实现
}
}
public class UserService {
private UserDao userDao = new UserDaoImpl();
public void printUser(int id) {
User user = userDao.findById(id);
System.out.println(user.getUsername());
}
}
✅ 业务层只管调用 DAO,不直接操作数据库
@Repository
public class UserDaoImpl implements UserDao {
// JDBC / MyBatis / JPA
}
@Service
public class UserService {
@Autowired
private UserDao userDao;
public User getUser(int id) {
return userDao.findById(id);
}
}
1. 创建 DAO 对象
2. 调用 DAO 的方法
3. DAO 内部执行 SQL
4. 返回结果给调用者
❌ 在 Service 里直接写 SQL
❌ 在 JSP / Controller 里直接操作数据库
❌ DAO 里写业务逻辑
✅ DAO 只负责“增删改查”
| 技术 | 说明 |
|---|---|
| JDBC | 原生,最底层 |
| MyBatis | 最常用,SQL 可控 |
| JPA / Hibernate | 面向对象,SQL 少 |
如果你愿意,我可以:
你现在是 普通 Java 项目 / Spring / Spring Boot 哪种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。