Servlet 可以通过JDBC(Java Database Connectivity)访问数据库,实现动态数据的存储和查询。本文将介绍如何在Servlet中连接数据库并执行基本的CRUD操作。


目录

  1. 数据库访问概述
  2. 环境准备
  3. 连接数据库
  4. 执行数据库操作
  5. 完整示例
  6. 部署与测试
  7. 参考资料

1. 数据库访问概述

  • 目的:通过Servlet访问数据库,处理动态数据(如用户信息)。
  • 技术:使用JDBC连接数据库,执行SQL语句。
  • 数据库:本文以MySQL为例,其他数据库(如PostgreSQL、SQLite)类似。

2. 环境准备

所需工具

  • JDBC驱动:如MySQL Connector/J(下载:https://dev.mysql.com/downloads/connector/j/)。
  • 数据库:MySQL或其他支持JDBC的数据库。
  • Tomcat:Servlet容器。

配置数据库

  1. 安装MySQL并启动。
  2. 创建数据库和表:
   CREATE DATABASE servlet_db;
   USE servlet_db;
   CREATE TABLE users (
       id INT AUTO_INCREMENT PRIMARY KEY,
       username VARCHAR(50),
       email VARCHAR(100)
   );
   INSERT INTO users (username, email) VALUES ('Alice', 'alice@example.com');
  1. 将JDBC驱动(如 mysql-connector-java-8.0.xx.jar)放入 Tomcat/lib/WEB-INF/lib/

3. 连接数据库

基本步骤

  1. 加载驱动:Class.forName("com.mysql.cj.jdbc.Driver");
  2. 建立连接:DriverManager.getConnection(url, user, password);

示例代码

import java.sql.*;

Connection conn = null;
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    String url = "jdbc:mysql://localhost:3306/servlet_db?useSSL=false&serverTimezone=UTC";
    conn = DriverManager.getConnection(url, "root", "password");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (conn != null) conn.close();
}

4. 执行数据库操作

查询

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
    int id = rs.getInt("id");
    String username = rs.getString("username");
    String email = rs.getString("email");
}
rs.close();
stmt.close();

插入

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (username, email) VALUES (?, ?)");
pstmt.setString(1, "Bob");
pstmt.setString(2, "bob@example.com");
pstmt.executeUpdate();
pstmt.close();

5. 完整示例

以下是一个展示数据库访问的Servlet。

HTML:db.html

<!DOCTYPE html>
<html>
<head><title>用户管理</title></head>
<body>
    <h2>添加用户</h2>
    <form method="POST" action="/myapp/db">
        用户名: <input type="text" name="username"><br>
        邮箱: <input type="text" name="email"><br>
        <input type="submit" value="添加">
    </form>
    <h2>查看用户</h2>
    <a href="/myapp/db">刷新用户列表</a>
</body>
</html>

Servlet:DatabaseServlet.java

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class DatabaseServlet extends HttpServlet {
    private Connection getConnection() throws SQLException {
        String url = "jdbc:mysql://localhost:3306/servlet_db?useSSL=false&serverTimezone=UTC";
        return DriverManager.getConnection(url, "root", "password");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        try (Connection conn = getConnection(); Statement stmt = conn.createStatement()) {
            ResultSet rs = stmt.executeQuery("SELECT * FROM users");
            out.println("<html><body>");
            out.println("<h1>用户列表</h1>");
            out.println("<table border='1'><tr><th>ID</th><th>用户名</th><th>邮箱</th></tr>");
            while (rs.next()) {
                out.println("<tr><td>" + rs.getInt("id") + "</td><td>" + rs.getString("username") + "</td><td>" + rs.getString("email") + "</td></tr>");
            }
            out.println("</table>");
            out.println("<a href=\"/myapp/db.html\">返回</a>");
            out.println("</body></html>");
        } catch (SQLException e) {
            out.println("<h1>数据库错误: " + e.getMessage() + "</h1>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String username = request.getParameter("username");
        String email = request.getParameter("email");

        try (Connection conn = getConnection();
             PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (username, email) VALUES (?, ?)")) {
            pstmt.setString(1, username);
            pstmt.setString(2, email);
            pstmt.executeUpdate();
            out.println("<h1>用户添加成功</h1>");
            out.println("<a href=\"/myapp/db\">查看用户列表</a>");
        } catch (SQLException e) {
            out.println("<h1>数据库错误: " + e.getMessage() + "</h1>");
        }
        out.println("<a href=\"/myapp/db.html\">返回</a>");
    }

    @Override
    public void init() throws ServletException {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            throw new ServletException("无法加载JDBC驱动", e);
        }
    }
}

配置:web.xml

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>DatabaseServlet</servlet-name>
        <servlet-class>DatabaseServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DatabaseServlet</servlet-name>
        <url-pattern>/db</url-pattern>
    </servlet-mapping>
</web-app>

6. 部署与测试

部署

  1. 编译:
   javac -cp /path/to/tomcat/lib/servlet-api.jar:/path/to/mysql-connector-java-8.0.xx.jar DatabaseServlet.java
  1. .class 文件放入 myapp/WEB-INF/classes/
  2. db.html 放入 myapp/
  3. 确保MySQL驱动在 WEB-INF/lib/Tomcat/lib/
  4. 部署 myapp 到Tomcat的 webapps 目录。
  5. 启动Tomcat。

测试

  • 访问:http://localhost:8080/myapp/db.html
  • 查看用户列表:显示已有用户。
  • 添加用户:输入用户名和邮箱,提交后刷新列表确认。

7. 参考资料

出站链接

其他资源

  • 《Servlet & JSP: A Tutorial》 – 数据库访问章节。
  • X社区:搜索 #ServletDatabase 获取示例。

这篇指南展示了Servlet访问数据库的实现。如果需要更复杂功能(如连接池、使用JPA或处理大数据),请告诉我!