Servlet 中使用 JDBC 连接 MySQL 数据库
创建数据库与表
使用 Navicat 创建数据库 ServletDemo,然后在该数据库下新建一张表:
DROP TABLE IF EXISTS `sites`;
CREATE TABLE `sites` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(30) NOT NULL,
`Url` varchar(30) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of sites
-- ----------------------------
INSERT INTO `sites` VALUES ('1', 'foxdevelop', 'www.foxdevelop.com');
INSERT INTO `sites` VALUES ('2', '百度', 'www.baidu.com');
INSERT INTO `sites` VALUES ('3', '谷歌', 'www.google.com');Code language: JavaScript (javascript)
下载并引入 MySQL JDBC 驱动
下载 MySQL JDBC 驱动 mysql-connector-java-8.0.12.jar,将其引入到项目中,同时拷贝到 Tomcat 的 lib 目录下,否则会报以下错误:
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1352)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1180)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)Code language: CSS (css)
注意:如果使用的是 MySQL 8.x 版本,需要使用
com.mysql.cj.jdbc.Driver驱动类,低版本的com.mysql.jdbc.Driver已过时且可能与 MySQL 8.x 不兼容。
JDBC Servlet 示例代码
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/JdbcServlet")
public class JdbcServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; // JDBC 驱动名
static final String DB_URL = "jdbc:mysql://localhost:3306/servletdemo?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true"; // 数据库 URL
static final String USER = "root"; // 数据库用户名
static final String PASSWORD = "123321"; // 数据库密码
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
Connection conn = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 注册 JDBC 驱动器
Class.forName(JDBC_DRIVER).newInstance();
// 打开一个连接
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
// 执行 SQL 查询
statement = conn.createStatement();
String sql = "select id, name, url from sites";
resultSet = statement.executeQuery(sql);
// 展开结果集数据库
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String url = resultSet.getString("url");
// 输出数据
out.println("ID: " + id);
out.println(", 站点名称: " + name);
out.println(", 站点 URL: " + url);
out.println("<br />");
}
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
} finally {
// 完成后关闭资源
try {
if (resultSet != null)
resultSet.close();
if (statement != null)
statement.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}Code language: JavaScript (javascript)
关键点说明
| 项目 | 说明 |
|---|---|
| JDBC 驱动类 | MySQL 8.x 使用 com.mysql.cj.jdbc.Driver |
| 数据库连接 URL | 需指定时区 serverTimezone、字符编码 characterEncoding 等参数 |
| 驱动放置位置 | 项目 WEB-INF/lib 和 Tomcat lib 目录均需放置 |
| 资源关闭 | 在 finally 块中依次关闭 ResultSet、Statement、Connection,避免资源泄漏 |
访问 http://localhost:8080/ServletDemo/JdbcServlet 即可看到从数据库读取并输出的站点列表。
Previous: Session
Next: Servlet 文件上传