在 Java 中封装数据库操作是一个常见的需求,可以通过以下方法实现高效且可维护的代码结构。以下是一个 基于 JDBC 的封装示例,并附上最佳实践建议:
Connection
、Statement
、ResultSet
等对象的创建和释放封装在内部。SQLException
,避免重复代码。DAO
(Data Access Object)接口,分离业务逻辑与数据库操作。import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/your_database";
private static final String USER = "root";
private static final String PASSWORD = "password";
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
public static void close(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public interface UserDao {
void addUser(User user);
User getUserById(int id);
void updateUser(User user);
void deleteUser(int id);
}
import java.sql.*;
public class UserDaoImpl implements UserDao {
@Override
public void addUser(User user) {
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, user.getName());
pstmt.setString(2, user.getEmail());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public User getUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
User user = null;
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
// 其他方法类似,省略...
}
通过 JdbcTemplate
简化重复代码(类似 Spring JDBC 的思路):
import java.sql.*;
public class JdbcTemplate {
public static int update(String sql, Object... params) {
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
}
public static <T> T query(String sql, ResultSetHandler<T> handler, Object... params) {
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
ResultSet rs = pstmt.executeQuery();
return handler.handle(rs);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
}
// 定义结果集处理器接口
public interface ResultSetHandler<T> {
T handle(ResultSet rs) throws SQLException;
}
// 使用示例
User user = JdbcTemplate.query(
"SELECT * FROM users WHERE id = ?",
rs -> {
if (rs.next()) {
User u = new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
return u;
}
return null;
},
1
);
public interface UserMapper {
@Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")
void insertUser(User user);
@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);
}
SqlSession
调用:try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
}
DriverManager
。Connection
的 setAutoCommit(false)
和 commit()
/rollback()
实现。通过上述方法,可以显著提高代码的可维护性和安全性。如果需要更详细的实现或特定框架的示例,请告诉我!