Servlet 中使用 JDBC 连接 MySQL 数据库

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 块中依次关闭 ResultSetStatementConnection,避免资源泄漏

访问 http://localhost:8080/ServletDemo/JdbcServlet 即可看到从数据库读取并输出的站点列表。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注