在JSP(JavaServer Pages)中连接数据库是Web开发中的常见需求,通常通过JavaBean或Servlet实现业务逻辑与数据访问的分离,确保代码的可维护性和安全性,以下是详细的步骤和示例说明,涵盖环境准备、数据库连接方式、代码实现及常见问题处理。
环境准备
- 开发工具:安装JDK(建议1.8及以上版本)、IDE(如Eclipse或IntelliJ IDEA)、Web服务器(如Tomcat)。
- 数据库:选择数据库(如MySQL、Oracle等),并安装对应的JDBC驱动,MySQL需下载mysql-connector-java-x.x.x.jar,并将其放入项目的WEB-INF/lib目录下。
- 项目结构:在IDE中创建Dynamic Web Project,确保src目录存放Java类,WebContent存放JSP页面。
数据库连接方式
JSP本身不直接处理数据库连接,而是通过Java代码(如Scriptlet或JavaBean)调用JDBC(Java Database Connectivity) API实现,以下是两种主流方式:
使用Scriptlet直接连接(不推荐)
在JSP页面中嵌入Java代码,直接实现数据库操作,这种方式会导致代码混乱,难以维护。
<%@ page import="java.sql.*" %>
<%
    Connection conn = null;
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "123456";
        conn = DriverManager.getConnection(url, user, password);
        Statement stmt = conn.createStatement();
        String sql = "SELECT * FROM users";
        ResultSet rs = stmt.executeQuery(sql);
        while (rs.next()) {
            out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (conn != null) conn.close();
    }
%> 使用JavaBean封装连接(推荐)
将数据库操作封装到JavaBean中,JSP通过调用Bean的方法实现连接,实现逻辑分离。
步骤:

- 创建JavaBean(如 - DBUtil.java):- package util; import java.sql.*; public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
- 在JSP中使用JavaBean: - <%@ page import="util.DBUtil" %> <jsp:useBean id="dbUtil" class="util.DBUtil" scope="page" /> <% Connection conn = null; Statement stmt = null; ResultSet rs = null; try { conn = dbUtil.getConnection(); stmt = conn.createStatement(); String sql = "SELECT * FROM users"; rs = stmt.executeQuery(sql); while (rs.next()) { out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } finally { dbUtil.close(conn, stmt, rs); } %>
连接池优化(提高性能)
直接使用DriverManager连接数据库效率较低,推荐使用连接池(如Apache DBCP、C3P0或HikariCP),以下是HikariCP的示例:
- 添加依赖:在 - pom.xml中引入HikariCP和MySQL驱动: - <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> 
- 配置连接池: - import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import java.sql.Connection; import java.sql.SQLException; public class HikariUtil { private static HikariDataSource dataSource; static { HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"); config.setUsername("root"); config.setPassword("123456"); config.setDriverClassName("com.mysql.cj.jdbc.Driver"); config.setMaximumPoolSize(10); dataSource = new HikariDataSource(config); } public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } }
- 在JSP中使用连接池: - <%@ page import="util.HikariUtil" %> <% Connection conn = null; try { conn = HikariUtil.getConnection(); // 执行数据库操作 } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null) conn.close(); } %>
常见问题与解决方案
- 中文乱码问题: - 原因:数据库、JSP页面、连接URL未统一编码。
- 解决:在URL中添加useUnicode=true&characterEncoding=UTF-8,JSP页面设置<%@ page contentType="text/html;charset=UTF-8" %>。
 
- 连接泄露问题:  - 原因:未关闭Connection、Statement或ResultSet。
- 解决:使用try-finally或try-with-resources确保资源释放。
 
- 原因:未关闭
相关问答FAQs
问题1:JSP中如何避免数据库连接泄露?
解答:
数据库连接泄露会导致连接池耗尽,影响系统性能,解决方案包括: 
- 使用try-finally或try-with-resources(Java 7+)确保Connection、Statement、ResultSet关闭。
- 使用连接池(如HikariCP)并设置合理的超时时间,自动回收未释放的连接。
- 在JavaBean中封装关闭逻辑,如DBUtil.close()方法。
问题2:为什么推荐使用JavaBean而非Scriptlet连接数据库?
解答:
Scriptlet将Java代码嵌入JSP,导致页面逻辑混乱,难以维护;而JavaBean实现逻辑分离,优势包括: 
- 代码复用:数据库操作可在多个JSP页面中复用。
- 可维护性:修改连接逻辑只需调整JavaBean,无需改动JSP。
- 安全性:避免直接在JSP中暴露数据库密码等敏感信息。
- MVC模式:符合Model-View-Controller架构,提升代码结构清晰度。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
 
 
 
  
 
发表回复