当前位置:首页 > 后端开发 > 正文

JSP与Java如何连数据库?

在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与Java如何连数据库?  第1张

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

安全与性能建议

  1. 资源释放:使用try-with-resources自动关闭连接(Java 7+)
  2. 避免明文密码:使用环境变量或加密配置
  3. SQL注入防护:始终用PreparedStatement处理用户输入
  4. 连接池必用:减少频繁连接开销(推荐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规范。

0