在 Java 中,DAO 的全称是 Data Access Object(数据访问对象)。
DAO 是一种设计模式,用于将数据访问逻辑与业务逻辑分离。
它提供了一种机制,通过特定的接口和实现类来访问数据库或其他持久化存储(如文件系统、网络服务等)。
DAO 模式的主要优点:
- 隔离数据访问代码:将数据访问逻辑封装在单独的类中,从而使业务逻辑代码更加简洁和清晰。
- 方便测试:由于数据访问代码被封装在 DAO 中,可以更容易地对其进行独立测试,并且可以使用模拟对象进行单元测试。
- 易于修改数据访问逻辑:如果底层的数据访问机制需要变更(例如从 JDBC 切换到 Hibernate),只需修改 DAO 层的实现,而不需要影响业务逻辑层。
- 提高代码的可维护性:通过使用标准接口进行定义,使得代码结构更加清晰可维护。
简单的 DAO 示例
1. 实体类(Entity)
public class User {
private int id;
private String username;
private String password;
// Getters and Setters
}
2. DAO 接口
import java.util.List;
public interface UserDao {
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
User selectUserById(int id);
List<User> selectAllUsers();
}
3. DAO 实现类(使用 JDBC 作为数据访问技术)
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDaoImpl implements UserDao {
private String jdbcURL = "jdbc:mysql://localhost:3306/mydatabase";
private String jdbcUsername = "root";
private String jdbcPassword = "password";
private static final String INSERT_USER_SQL = "INSERT INTO users (username, password) VALUES (?, ?)";
private static final String SELECT_USER_BY_ID = "SELECT id, username, password FROM users WHERE id = ?";
private static final String SELECT_ALL_USERS = "SELECT * FROM users";
private static final String DELETE_USER_SQL = "DELETE FROM users WHERE id = ?";
private static final String UPDATE_USER_SQL = "UPDATE users SET username = ?, password = ? WHERE id = ?";
protected Connection getConnection() {
Connection connection = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(jdbcURL, jdbcUsername, jdbcPassword);
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
return connection;
}
@Override
public void insertUser(User user) {
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(INSERT_USER_SQL)) {
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void updateUser(User user) {
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(UPDATE_USER_SQL)) {
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setInt(3, user.getId());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void deleteUser(int id) {
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(DELETE_USER_SQL)) {
preparedStatement.setInt(1, id);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public User selectUserById(int id) {
User user = null;
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(SELECT_USER_BY_ID)) {
preparedStatement.setInt(1, id);
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
@Override
public List<User> selectAllUsers() {
List<User> users = new ArrayList<>();
try (Connection connection = getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(SELECT_ALL_USERS)) {
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
}
这种方式将数据访问逻辑集中在一个地方,简化了应用程序的开发和维护。