上一篇
在JSP中通过JDBC连接数据库:加载驱动(如com.mysql.jdbc.Driver),使用DriverManager.getConnection()建立连接,传入URL、用户名和密码,创建Statement执行SQL,处理结果集后关闭资源,推荐使用连接池优化性能。
在JSP和Java中连接数据库主要依赖JDBC(Java Database Connectivity) 技术,以下是详细步骤和最佳实践,符合现代开发规范:
核心步骤:JDBC连接数据库
准备工作
- 数据库驱动:下载对应数据库的JDBC驱动(如MySQL:mysql-connector-java)
- 导入驱动:将JAR文件放入项目的
/WEB-INF/lib目录
四步连接流程
<%-- JSP页面中的Java代码示例(实际开发建议分离到Servlet) --%>
<%@ page import="java.sql.*" %>
<%
try {
// 1. 加载驱动(MySQL示例)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立连接
String url = "jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC";
String user = "用户名";
String password = "密码";
Connection conn = DriverManager.getConnection(url, user, password);
// 3. 执行SQL
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// 4. 处理结果
while (rs.next()) {
out.print("ID: " + rs.getInt("id") + "<br>");
}
// 5. 关闭资源(反向顺序)
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
最佳实践:分层架构(MVC)
避免在JSP中直接写JDBC代码,推荐结构:
JSP(View) → Servlet(Controller) → DAO类(Model) → 数据库
创建DAO类(Data Access Object)
// UserDAO.java
public class UserDAO {
private static final String URL = "jdbc:mysql://localhost:3306/mydb";
public List<User> getUsers() throws SQLException {
List<User> users = new ArrayList<>();
try (Connection conn = DriverManager.getConnection(URL, "user", "pass");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
users.add(new User(rs.getInt("id"), rs.getString("name")));
}
}
return users;
}
}
Servlet调用DAO
// UserServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
try {
List<User> users = new UserDAO().getUsers();
request.setAttribute("users", users);
request.getRequestDispatcher("/users.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
JSP仅负责显示
<%-- users.jsp --%>
<c:forEach items="${users}" var="user">
<p>${user.id}: ${user.name}</p>
</c:forEach>
高级优化方案
使用连接池(如HikariCP)
// 配置连接池
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/mydb");
config.setUsername("user");
config.setPassword("pass");
HikariDataSource ds = new HikariDataSource(config);
// 获取连接
try (Connection conn = ds.getConnection()) {
// 执行操作...
}
防SQL注入
使用PreparedStatement替代Statement:
String sql = "SELECT * FROM users WHERE email = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, request.getParameter("email")); // 安全处理用户输入
ResultSet rs = pstmt.executeQuery();
}
配置外部属性文件
将数据库配置存入db.properties:
jdbc.url=jdbc:mysql://localhost:3306/mydb jdbc.user=root jdbc.password=123456
通过ResourceBundle或Spring加载配置。
常见错误排查
| 错误现象 | 解决方案 |
|---|---|
ClassNotFoundException |
检查驱动JAR是否在WEB-INF/lib下 |
SQLException: Access denied |
核对用户名/密码及数据库权限 |
| 连接超时 | 检查数据库地址、端口、防火墙设置 |
| 中文乱码 | 连接URL添加?characterEncoding=UTF-8 |
安全与性能建议
- 资源释放:使用
try-with-resources自动关闭连接(Java 7+) - 避免明文密码:使用环境变量或加密配置
- SQL注入防护:始终用
PreparedStatement处理用户输入 - 连接池必用:减少频繁连接开销(推荐HikariCP或Tomcat JDBC Pool)
JSP通过JDBC连接数据库是Java Web开发的基础能力,但务必遵循分层设计:
- JSP专注视图展示
- 业务逻辑交给Servlet
- 数据库操作封装到DAO类
- 连接池管理资源
引用说明基于Oracle官方JDBC文档、MySQL Connector/J文档及HikariCP最佳实践,技术细节参考《Head First Servlets and JSP》(O’Reilly)及Java EE规范。
