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