Servlet 教程 之 Servlet 数据库访问 2

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本教程讲解如何在Servlet中实现数据库访问。首先确保了解JDBC并配置MySQL驱动(如mysql-connector-java-5.1.39-bin.jar),在Eclipse Web项目中需将驱动放入Tomcat的lib目录。创建名为`websites`的数据库表,插入测试数据。之后展示了一个Servlet示例,该示例连接到数据库,执行SQL查询以获取`websites`表中的`id`、`name`和`url`,并将结果输出到HTML响应中。要运行Servlet,需在web.xml中配置并访问指定URL。

Servlet 教程 之 Servlet 数据库访问 2

Servlet 数据库访问

本教程假定您已经了解了 JDBC 应用程序的工作方式。在您开始学习 Servlet 数据库访问之前,请访问 Java MySQL 连接 来设置相关驱动及配置。

注意:

你可以下载本站提供的 jar 包:mysql-connector-java-5.1.39-bin.jar

在 java 项目中,只需要在 Eclipse 中引入 mysql-connector-java-5.1.39-bin.jar 就可以运行java项目。

但是在 Eclipse web 项目中,当执行 Class.forName("com.mysql.jdbc.Driver");时 不会去查找驱动的。所以本实例中我们需要把 mysql-connector-java-5.1.39-bin.jar 拷贝到 tomcat 下 lib 目录。

从基本概念下手,让我们来创建一个简单的表,并在表中创建几条记录。

创建测试数据
接下来我们在 MySQL 中创建 baidu 数据库,并创建 websites 数据表,表结构如下:

CREATE TABLE websites (
id int(11) NOT NULL AUTO_INCREMENT,
name char(20) NOT NULL DEFAULT '' COMMENT '站点名称',
url varchar(255) NOT NULL DEFAULT '',
alexa int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名',
country char(10) NOT NULL DEFAULT '' COMMENT '国家',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
插入一些数据:

INSERT INTO websites VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘宝', 'https://www.taobao.com/', '13', 'CN'), ('3', '百度', 'http://www.baidu.com', '5892', ''), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA');

访问数据库
下面的实例演示了如何使用 Servlet 访问 baidu 数据库。

package com.baidu.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**

  • Servlet implementation class DatabaseAccess
    */
    @WebServlet("/DatabaseAccess")
    public class DatabaseAccess extends HttpServlet {
    private static final long serialVersionUID = 1L;
    // JDBC 驱动名及数据库 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/baidu";

    // 数据库的用户名与密码,需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "123456";
    /**

    • @see HttpServlet#HttpServlet()
      */
      public DatabaseAccess() {
      super();
      // TODO Auto-generated constructor stub
      }

      /**

    • @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
      */
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      Connection conn = null;
      Statement stmt = null;
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();
      String title = "Servlet Mysql 测试 - 百度";
      String docType = "<!DOCTYPE html>\n";
      out.println(docType +
      "

\n" +
"\n" +
"\n" +
"

" + title + "

\n");
try{
 // 注册 JDBC 驱动器
 Class.forName("com.mysql.jdbc.Driver");

 // 打开一个连接
 conn = DriverManager.getConnection(DB_URL,USER,PASS);

 // 执行 SQL 查询
 stmt = conn.createStatement();
 String sql;
 sql = "SELECT id, name, url FROM websites";
 ResultSet rs = stmt.executeQuery(sql);

 // 展开结果集数据库
 while(rs.next()){
     // 通过字段检索
     int id  = rs.getInt("id");
     String name = rs.getString("name");
     String url = rs.getString("url");

     // 输出数据
     out.println("ID: " + id);
     out.println(", 站点名称: " + name);
     out.println(", 站点 URL: " + url);
     out.println("<br />");
 }
 out.println("</body></html>");

 // 完成后关闭
 rs.close();
 stmt.close();
 conn.close();

} catch(SQLException se) {

 // 处理 JDBC 错误
 se.printStackTrace();

} catch(Exception e) {

 // 处理 Class.forName 错误
 e.printStackTrace();

}finally{

 // 最后是用于关闭资源的块
 try{
     if(stmt!=null)
     stmt.close();
 }catch(SQLException se2){
 }
 try{
     if(conn!=null)
     conn.close();
 }catch(SQLException se){
     se.printStackTrace();
 }

}

}

/**

  • @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
    }
    }
    现在让我们来编译上面的 Servlet,并在 web.xml 文件中创建以下条目:
  • ....

    DatabaseAccess
    com.baidu.test.DatabaseAccess


    DatabaseAccess
    /TomcatTest/DatabaseAccess

    ....
    现在调用这个 Servlet,输入链接:http://localhost:8080/TomcatTest/DatabaseAccess

    相关实践学习
    如何在云端创建MySQL数据库
    开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
    全面了解阿里云能为你做什么
    阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
    目录
    相关文章
    |
    5天前
    |
    SQL NoSQL Java
    彻底革新你的数据库操作体验!Micronaut数据访问技巧让你瞬间爱上代码编写!
    【9月更文挑战第10天】Java开发者们一直在寻找简化应用程序与数据库交互的方法。Micronaut作为一个现代框架,提供了多种工具和特性来提升数据访问效率。本文介绍如何使用Micronaut简化数据库操作,并提供具体示例代码。Micronaut支持JPA/Hibernate、SQL及NoSQL(如MongoDB),简化配置并无缝集成。通过定义带有`@Repository`注解的接口,可以实现Spring Data风格的命名查询。
    19 6
    |
    12天前
    |
    SQL 存储 关系型数据库
    C#一分钟浅谈:使用 ADO.NET 进行数据库访问
    【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
    42 6
    |
    10天前
    |
    SQL 关系型数据库 分布式数据库
    PolarDB Proxy配置与优化:提升数据库访问效率
    【9月更文挑战第6天】PolarDB是阿里云推出的高性能分布式关系型数据库,PolarDB Proxy作为其关键组件,位于客户端与PolarDB集群间,负责SQL请求的解析与转发,并支持连接池管理、SQL过滤及路由规则等功能。本文详细介绍了PolarDB Proxy的配置方法,包括连接池、负载均衡和SQL过滤设置,并探讨了监控调优、缓存及网络优化策略,以帮助提升数据库访问效率。
    20 1
    |
    16天前
    |
    SQL 关系型数据库 数据库连接
    探索研究Ruby 数据库访问
    【8月更文挑战第31天】
    26 1
    |
    16天前
    |
    SQL 存储 小程序
    【教程】navicat配合HTTP通道远程连接SQLite数据库
    本文介绍了如何通过 Navicat Premium 工具配合 n_tunnel_sqlite.php 和 HTTP 通道远程连接服务器上的 SQLite 数据库。SQLite 是一种自给自足的、无服务器的 SQL 数据库引擎,由于其端口未对外开放,直接使用 Navicat 进行远程连接不可行。文章详细记录了使用 HTTP 通道实现远程连接的过程,包括定位本地 `ntunnel_sqlite.php` 文件,将其上传至服务器,并通过 Navicat 配置 HTTP 通道连接 SQLite 数据库的具体步骤。
    16 0
    【教程】navicat配合HTTP通道远程连接SQLite数据库
    |
    22天前
    |
    运维 安全 Cloud Native
    核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
    核心系统转型问题之分布式数据库和数据访问中间件协作如何解决
    |
    22天前
    |
    JavaScript Java 关系型数据库
    毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
    在数字化时代背景下,本文详细介绍了如何使用Spring Boot框架结合Vue.js技术栈,实现一个前后端分离的考试管理系统。该系统旨在提升考试管理效率,优化用户体验,确保数据安全及可维护性。技术选型包括:Spring Boot 2.0、Vue.js 2.0、Node.js 12.14.0、MySQL 8.0、Element-UI等。系统功能涵盖登录注册、学员考试(包括查看试卷、答题、成绩查询等)、管理员功能(题库管理、试题管理、试卷管理、系统设置等)。
    毕设项目&课程设计&毕设项目:基于springboot+vue实现的前后端分离的考试管理系统(含教程&源码&数据库数据)
    |
    15天前
    |
    开发者 UED Java
    Play Framework惊天秘密:如何让异常处理优雅得像芭蕾舞?
    【8月更文挑战第31天】在Web应用开发中,异常处理至关重要,直接影响应用稳定性和用户体验。Play Framework作为轻量级Java Web框架,提供了基于Scala偏函数的灵活异常处理机制。通过实现`HttpErrorHandler`接口可定义全局异常逻辑,而在控制器中使用try-catch块则能捕获特定异常。定义自定义异常类也有助于表示特定错误情况。最佳实践包括保持处理一致性、提供有用错误信息、记录日志及分类处理异常。掌握这些技巧,能使Play应用更健壮可靠。
    34 0
    |
    15天前
    |
    SQL 数据库 开发者
    全面提速你的数据访问:Entity Framework Core性能优化指南,从预加载到批量操作的最佳实践揭秘,打造高性能数据库交互体验
    【8月更文挑战第31天】本文详细介绍如何在Entity Framework Core(EF Core)中优化数据访问性能,涵盖从创建项目到定义领域模型、配置数据库上下文的最佳实践。文章通过具体代码示例讲解了预加载、惰性加载、显式加载、投影及批量操作等技术的应用,并介绍了如何使用SQL查询和调整查询性能来进一步提升效率。通过合理运用这些技术,开发者可以构建出高效且响应迅速的数据访问层,提升应用程序的整体性能和用户体验。
    29 0
    |
    18天前
    |
    SQL Shell API
    python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
    python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API