Servlet 可以通过JDBC(Java Database Connectivity)访问数据库,实现动态数据的存储和查询。本文将介绍如何在Servlet中连接数据库并执行基本的CRUD操作。
目录
1. 数据库访问概述
- 目的:通过Servlet访问数据库,处理动态数据(如用户信息)。
- 技术:使用JDBC连接数据库,执行SQL语句。
- 数据库:本文以MySQL为例,其他数据库(如PostgreSQL、SQLite)类似。
2. 环境准备
所需工具
- JDBC驱动:如MySQL Connector/J(下载:https://dev.mysql.com/downloads/connector/j/)。
- 数据库:MySQL或其他支持JDBC的数据库。
- Tomcat:Servlet容器。
配置数据库
- 安装MySQL并启动。
- 创建数据库和表:
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');
- 将JDBC驱动(如
mysql-connector-java-8.0.xx.jar
)放入Tomcat/lib/
或WEB-INF/lib/
。
3. 连接数据库
基本步骤
- 加载驱动:
Class.forName("com.mysql.cj.jdbc.Driver");
- 建立连接:
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. 部署与测试
部署
- 编译:
javac -cp /path/to/tomcat/lib/servlet-api.jar:/path/to/mysql-connector-java-8.0.xx.jar DatabaseServlet.java
- 将
.class
文件放入myapp/WEB-INF/classes/
。 - 将
db.html
放入myapp/
。 - 确保MySQL驱动在
WEB-INF/lib/
或Tomcat/lib/
。 - 部署
myapp
到Tomcat的webapps
目录。 - 启动Tomcat。
测试
- 访问:
http://localhost:8080/myapp/db.html
- 查看用户列表:显示已有用户。
- 添加用户:输入用户名和邮箱,提交后刷新列表确认。
7. 参考资料
出站链接
- JDBC API – 官方JDBC文档。
- MySQL Connector/J – MySQL驱动指南。
- Java EE教程 – JDBC与Servlet。
其他资源
- 《Servlet & JSP: A Tutorial》 – 数据库访问章节。
- X社区:搜索 #ServletDatabase 获取示例。
这篇指南展示了Servlet访问数据库的实现。如果需要更复杂功能(如连接池、使用JPA或处理大数据),请告诉我!
发表回复