上一篇
jsp链接数据库代码怎么写
- 数据库
- 2025-08-10
- 42
JSP连数据库需导入驱动包,用Class.forName注册驱动,通过DriverManager.getConnection获取连接,创建
以下是关于 JSP 连接数据库 的完整技术指南,包含核心概念、分步实现、最佳实践及典型问题解决方案:
基础原理与准备工作
1 技术栈组成
| 组件 | 作用 | 示例 |
|---|---|---|
| JDBC | Java 数据库连接标准接口 | java.sql. |
| 驱动包 | 实现 JDBC 接口的具体类(需根据数据库类型选择) | mysql-connector-java |
| 连接池 | 优化性能(可选但推荐) | HikariCP / DBCP |
| Servlet/JSP | Web 层与数据库交互的桥梁 | request, response |
2 环境准备清单
必需项:

- JDK 1.8+(需支持当前使用的数据库驱动版本)
- 目标数据库(如 MySQL/PostgreSQL/Oracle)已安装并运行
- 对应数据库的 JDBC 驱动 JAR 包(放置于
WEB-INF/lib目录) - Tomcat/Jetty 等 Servlet 容器
- 数据库测试账号(具备读写权限)
️ 常见误区:不要将数据库密码明文写入代码!生产环境应通过配置文件或环境变量管理敏感信息。
完整代码实现步骤
1 传统方式(直连模式)
// 1. 导入必要包
import java.sql.;
import javax.servlet.;
import javax.servlet.http.;
public class UserDao extends HttpServlet {
// 2. 定义数据库连接参数(实际项目应移至配置文件)
private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "yourpassword";
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 3. 加载数据库驱动(新版JDBC可省略此步)
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 8+驱动类名
// 4. 建立数据库连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
// 5. 创建SQL语句(使用占位符防注入)
String sql = "SELECT FROM users WHERE id = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(request.getParameter("id")));
// 6. 执行查询并处理结果集
rs = pstmt.executeQuery();
while (rs.next()) {
out.println("姓名: " + rs.getString("name"));
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace(); // 生产环境应替换为日志记录
} finally {
// 7. 逆向关闭资源(重要!)
if (rs != null) try { rs.close(); } catch (SQLException ignored) {}
if (pstmt != null) try { pstmt.close(); } catch (SQLException ignored) {}
if (conn != null) try { conn.close(); } catch (SQLException ignored) {}
}
}
}
2 MVC 分层架构改进版
| 层级 | 职责 | 关键技术 |
|---|---|---|
| Controller | 接收请求 & 协调业务逻辑 | @WebServlet, RequestDispatcher |
| Service | 实现业务逻辑 | 事务管理、参数校验 |
| DAO | 数据库操作封装 | MyBatis/Hibernate/原生JDBC |
| Model | 数据实体类 | POJO |
优势:解耦清晰、复用性强、便于单元测试。

️ 关键配置详解
1 web.xml 配置示例
<web-app>
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.example.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/user/</url-pattern>
</servlet-mapping>
</web-app>
2 数据库连接池配置(以 HikariCP 为例)
# hikari.properties dataSource.driverClassName=com.mysql.cj.jdbc.Driver dataSource.jdbcUrl=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC dataSource.username=root dataSource.password=yourpassword dataSource.maximumPoolSize=20 dataSource.minimumIdle=5 dataSource.connectionTimeout=30000
️ 安全与性能优化
| 风险点 | 解决方案 | 示例代码 |
|---|---|---|
| SQL注入 | 使用 PreparedStatement |
pstmt.setString(1, userInput) |
| 慢查询 | 添加索引、分析执行计划 | EXPLAIN SELECT ... |
| 连接泄露 | 确保 finally 块关闭资源 |
见2.1节关闭顺序 |
| XSS攻击 | 输出前转义特殊字符 | <%= org.apache.commons.lang3.StringEscapeUtils.escapeHtml4(name) %> |
| 敏感信息泄露 | 使用加密工具存储密码哈希值 | BCryptPasswordEncoder |
典型场景代码对比
| 操作类型 | 增删改查示例 | 特点 |
|---|---|---|
| 查询单条 | SELECT FROM products WHERE id=? |
executeQuery() |
| 批量插入 | INSERT INTO logs(content) VALUES(?) |
addBatch() + executeBatch() |
| 事务操作 | SET autoCommit=false → commit() |
保证原子性 |
| 分页查询 | LIMIT ?,? + COUNT() |
配合前端页码计算 |
相关问答FAQs
Q1: 为什么会出现 “ClassNotFoundException: com.mysql.jdbc.Driver”?
A: 这是由于未将 MySQL JDBC 驱动 JAR 包放入项目依赖路径,解决方法:
- 下载与数据库版本匹配的驱动(如
mysql-connector-java-8.0.xx.jar) - 将 JAR 包复制到
WEB-INF/lib目录 - 确保项目构建路径包含该 JAR(Eclipse/IDEA 需刷新项目)
Q2: 如何解决中文乱码问题?
A: 需同时满足以下条件:
- URL 添加编码参数:
jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8 - 数据库表字段使用
utf8mb4字符集 - JSP 页面声明编码:
<%@ page contentType="text/html; charset=UTF-8" %> - 响应头设置:
response.setCharacterEncoding("UTF-8");
扩展学习建议
- 框架整合:学习 Spring Boot + JPA/MyBatis 组合,简化持久层开发
- 连接池监控:使用 Druid 监控面板观察连接池状态
- ORM映射:尝试 Hibernate 实现对象关系映射
- 分布式事务:了解 Seata 等分布式事务解决方案
通过以上系统化的实现方案,您可以构建稳定高效的 JSP 数据库应用,实际开发中建议结合具体业务需求选择合适的技术方案

