如何用JSP连接数据库?
- 数据库
- 2025-06-13
- 5
如何用JSP连接数据库:详细指南
核心原理与准备工作
JSP通过JDBC(Java Database Connectivity) 实现数据库连接,操作流程如下:
- 加载驱动 → 2. 建立连接 → 3. 执行SQL → 4. 处理结果 → 5. 关闭资源
环境准备:
- 数据库:MySQL 8.0+(官网下载)
- JDBC驱动:mysql-connector-java-8.0.xx.jar(Maven仓库下载)
- 开发工具:Eclipse/IntelliJ IDEA
- 服务器:Tomcat 9+
配置步骤:
- 将JDBC驱动JAR文件放入/WEB-INF/lib目录
- 创建数据库(示例SQL): CREATE DATABASE jsp_demo; USE jsp_demo; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), email VARCHAR(100) );
连接MySQL的完整代码实现
JSP示例代码 (connect.jsp):
<%@ page import="java.sql.*" %> <% // 数据库配置(实际使用中应存储在配置文件中) final String DB_URL = "jdbc:mysql://localhost:3306/jsp_demo?useSSL=false&serverTimezone=UTC"; final String USER = "root"; final String PASS = "your_secure_password"; // 替换为实际密码 Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 建立连接 conn = DriverManager.getConnection(DB_URL, USER, PASS); // 3. 执行查询 stmt = conn.createStatement(); String sql = "SELECT id, name, email FROM users"; rs = stmt.executeQuery(sql); // 4. 处理结果 while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String email = rs.getString("email"); out.println("ID: " + id + ", Name: " + name + ", Email: " + email + "<br>"); } } catch(SQLException | ClassNotFoundException e) { e.printStackTrace(); out.println("数据库错误: " + e.getMessage()); } finally { // 5. 关闭资源(关键!) try { if(rs != null) rs.close(); } catch(SQLException e) { /* 忽略 */ } try { if(stmt != null) stmt.close(); } catch(SQLException e) { /* 忽略 */ } try { if(conn != null) conn.close(); } catch(SQLException e) { /* 忽略 */ } } %>
关键注意事项
-
安全规范


- 防SQL载入:使用PreparedStatement替代Statement String sql = "INSERT INTO users (name, email) VALUES (?, ?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, request.getParameter("name")); pstmt.setString(2, request.getParameter("email")); pstmt.executeUpdate();
- 密码存储:避免硬编码密码,使用环境变量或加密配置文件
-
性能优化
- 使用连接池(如Tomcat JDBC Pool)
- 在finally块中确保关闭资源,防止内存泄漏
- 设置连接超时参数:?connectTimeout=5000
-
常见错误解决
| 错误现象 | 原因 | 解决方案 |
|———————————-|———————-|—————————-|
| No suitable driver found | 驱动未加载或路径错误 | 检查JAR位置和Class.forName() |
| Access denied for user | 账号权限不足 | 检查数据库用户权限 |
| Communications link failure | 防火墙/端口阻塞 | 开放3306端口或检查MySQL远程访问设置 |
-
分层架构

- 将数据库操作封装在JavaBean或DAO类中 // UserDAO.java 示例 public class UserDAO { public List<User> getUsers() throws SQLException { // 封装查询逻辑 } }
-
连接池配置(Tomcat)
<!-- 在META-INF/context.xml 中添加 --> <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/jsp_demo" username="root" password="your_password"/>
-
事务管理
try { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个SQL操作 conn.commit(); // 提交事务 } catch(SQLException e) { conn.rollback(); // 回滚 } - 安全性:防止拼接SQL导致的载入攻破
- 可维护性:分离业务逻辑与JSP视图
- 性能:连接池减少重复创建连接的开销
- 扩展性:便于迁移到ORM框架(如Hibernate)
- MySQL官方JDBC文档:Connector/J Developer Guide
- Oracle JDBC教程:JDBC Database Access
- OWASP SQL载入防护指南:SQL Injection Prevention
- Apache Tomcat连接池配置:JDBC DataSources
进阶实践建议
为什么推荐JDBC而非直接脚本?
最佳实践提示:生产环境务必将数据库配置移至web.xml或外部属性文件,并通过ServletContextListener初始化连接池。
引用说明