上一篇
JSP与Java如何连数据库?
- 后端开发
- 2025-07-04
- 2844
在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规范。