Servlet如何发送JSON数据到数据库:完整实现指南
在Java Web开发中,Servlet作为核心组件,常用于处理HTTP请求并返回响应,当需要将客户端提交的JSON数据存入数据库时,需结合JSON解析库(如Gson、Jackson)和JDBC(或JPA、MyBatis等持久层框架)实现,本文将详细介绍Servlet接收JSON数据、解析后存入数据库的完整流程,包含环境搭建、代码实现及注意事项。
环境准备与依赖配置
开发环境
- JDK 8+
- Servlet容器(如Tomcat 9+)
- IDE(如IntelliJ IDEA或Eclipse)
项目依赖
在pom.xml(Maven项目)中添加以下依赖,涵盖Servlet API、JSON解析库及数据库驱动(以MySQL为例):
<dependencies>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- JSON解析库(以Gson为例) -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- MySQL数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
数据库与表结构设计
以用户信息存储为例,创建MySQL数据库user_db及表user_info:
CREATE DATABASE IF NOT EXISTS user_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE user_db;
CREATE TABLE user_info (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100),
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Servlet接收与解析JSON数据
创建实体类(User)
定义与数据库表对应的Java实体类,用于映射JSON数据:
public class User {
private Integer id;
private String username;
private Integer age;
private String email;
// 无参构造器
public User() {}
// 全参构造器、getter/setter省略(可通过IDE自动生成)
@Override
public String toString() {
return "User{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + ", email='" + email + '\'' + '}';
}
}
编写Servlet处理JSON请求
创建UserServlet,通过doPost方法接收POST请求(JSON数据通常通过POST传递),并解析为User对象。
关键步骤:
- 设置请求/响应编码为UTF-8,避免中文乱码。
- 通过
request.getReader()读取请求体的JSON字符串。 - 使用Gson将JSON字符串反序列化为
User对象。 - 调用数据库操作方法将数据存入数据库。
import com.google.gson.Gson;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/user/add")
public class UserServlet extends HttpServlet {
private Gson gson = new Gson();
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 设置请求和响应编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("application/json;charset=UTF-8");
// 2. 读取请求体中的JSON字符串
StringBuilder jsonBuilder = new StringBuilder();
String line;
try (BufferedReader reader = req.getReader()) {
while ((line = reader.readLine()) != null) {
jsonBuilder.append(line);
}
}
String jsonString = jsonBuilder.toString();
// 3. 解析JSON为User对象
User user = gson.fromJson(jsonString, User.class);
// 4. 调用数据库操作方法
boolean success = saveUserToDatabase(user);
// 5. 返回操作结果(JSON格式)
PrintWriter out = resp.getWriter();
if (success) {
resp.setStatus(HttpServletResponse.SC_OK);
out.print("{\"code\":200,\"message\":\"用户添加成功\"}");
} else {
resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
out.print("{\"code\":500,\"message\":\"用户添加失败\"}");
}
out.flush();
}
// 数据库操作方法(后续实现)
private boolean saveUserToDatabase(User user) {
// TODO: 实现JDBC插入逻辑
return false;
}
}
数据库操作实现(JDBC方式)
通过JDBC连接MySQL数据库,将User对象插入user_info表,为提升代码复用性,可封装数据库连接工具类DBUtil。
数据库连接工具类(DBUtil)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
private static final String URL = "jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
private static final String USERNAME = "root"; // 数据库用户名
private static final String PASSWORD = "password"; // 数据库密码
static {
try {
// 加载MySQL驱动
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USERNAME, PASSWORD);
}
public static void closeConnection(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
实现数据库插入逻辑
在UserServlet中完善saveUserToDatabase方法,使用PreparedStatement防止SQL注入:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
private boolean saveUserToDatabase(User user) {
String sql = "INSERT INTO user_info (username, age, email) VALUES (?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setInt(2, user.getAge());
pstmt.setString(3, user.getEmail());
int rows = pstmt.executeUpdate();
return rows > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
DBUtil.closeConnection(conn);
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
完整流程测试
启动Tomcat并部署项目
将项目打包为WAR文件,部署到Tomcat的webapps目录,启动Tomcat。
发送JSON请求
使用Postman或curl工具向Servlet发送POST请求,请求体为JSON格式:
{
"username": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
请求URL:http://localhost:8080/your-project-name/user/add
验证结果
- 成功响应:HTTP状态码200,返回JSON:
{"code":200,"message":"用户添加成功"} - 数据库检查:查询
user_info表,确认数据已插入:SELECT * FROM user_info WHERE username = '张三';
进阶优化与注意事项
使用连接池提升性能
JDBC直连频繁创建/销毁连接,性能较低,推荐使用HikariCP、Druid等连接池优化:
<!-- HikariCP依赖 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
修改DBUtil,通过HikariCP管理连接:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class DBUtil {
private static HikariDataSource dataSource;
static {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8");
config.setUsername("root");
config.setPassword("password");
config.setMaximumPoolSize(10); // 最大连接数
dataSource = new HikariDataSource(config);
}
public static Connection getConnection() throws


还没有评论,来说两句吧...