JDBC增删查改操作-jsp实验-实现页面跳转

news2025/1/24 22:30:32

实验 JDBC增删查改操作
一、实验目的
1、掌握JDBC增删查改MySQL或者sql server数据库表的方法。
2、在增删查改页面间跳转
二、实验内容
在MySQL或者sql server中创建一张表,之后使用JDBC进行增删查改。(功能不限),包括:
(1)表设计
(2)JDBC连接到MySQL 或者sql server
(3)suc.jsp页面列出表中所有记录。每行记录后面有删除链接,链接中附加username字段,单击后跳转到delete.jsp。另有插入、查询按钮,单击后分别跳转到insert.jsp、query.jsp。
(4)delete.jsp页面:从URL中提取username字段,删除数据库表中该username对应的记录。删除成功后,显示删除成功,之后重定向到list.jsp。
(5)insert.jsp:设计表单,单击提交按钮后,插入到数据库表中。插入成功后,显示插入成功, 之后重定向到list.jsp。
(6)query.jsp:设计表单,比如查询姓名,单击查询按钮后,检索数据库表记录,用列表显示结果。
三、实验成果
(按序编号列出各项,截图代码及运行结果以验证)
1、数据库表设计截图

-- 创建表
CREATE TABLE UserInfo (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    age INT
)default CHARSET=utf8;

2、JDBC连接数据库
编写一个Java类,用于连接到MySQL数据库。在该类中,实现数据库连接的方法,以及增删查改的相关方法。

package com.wmc.javabean;

/**
 * @version 1.0
 * @Author wmc
 * @Date 2023/12/6 17:01
 * @注释
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnector {
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("Unable to load MySQL JDBC driver. Check your classpath.");
        }
    }

    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/javaweb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC";
    private static final String JDBC_USER = "root";
    private static final String JDBC_PASSWORD = "123456";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
    }
}

3、suc.jsp页面
在suc.jsp页面中,列出表中所有记录,并提供删除、插入、查询的链接。

<%--
  Created by IntelliJ IDEA.
  User: Lenovo
  Date: 2023/12/6
  Time: 17:03
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.wmc.javabean.DBConnector" %>

<%
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;

    try {
        connection = DBConnector.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery("SELECT * FROM UserInfo");

        while (resultSet.next()) {
            out.println("ID: " + resultSet.getInt("id") + "<br>");
            out.println("Username: " + resultSet.getString("username") + "<br>");
            out.println("Password: " + resultSet.getString("password") + "<br>");
            out.println("Email: " + resultSet.getString("email") + "<br>");
            out.println("Age: " + resultSet.getInt("age") + "<br>");

            // Add delete link
            out.println("<a href='/JdbcCrud/delete.jsp?username=" + resultSet.getString("username") + "'>删除</a><br><br>");
        }
%>

<a href="/JdbcCrud/insert.jsp">插入</a><br>
<a href="/JdbcCrud/query.jsp">查询</a><br>

<%
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (resultSet != null) resultSet.close();
            if (statement != null) statement.close();
            if (connection != null) connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
%>

4、delete.jsp页面
在delete.jsp页面中,从URL中提取username字段,删除数据库表中该username对应的记录。

<%--
  Created by IntelliJ IDEA.
  User: Lenovo
  Date: 2023/12/6
  Time: 17:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.wmc.javabean.DBConnector " %>

<%
  String username = request.getParameter("username");

  if (username != null) {
    Connection connection = null;
    PreparedStatement preparedStatement = null;

    try {
      connection = DBConnector.getConnection();
      String deleteQuery = "DELETE FROM UserInfo WHERE username = ?";
      preparedStatement = connection.prepareStatement(deleteQuery); // 防止SQL注入
      preparedStatement.setString(1, username);
      int rowsAffected = preparedStatement.executeUpdate();

      if (rowsAffected > 0) {
        out.println("删除成功!");
        response.sendRedirect("suc.jsp");
      } else {
        out.println("删除失败!");
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        if (preparedStatement != null) preparedStatement.close();
        if (connection != null) connection.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
%>

5、insert.jsp
在insert.jsp页面中,设计表单,插入数据到数据库表中。

<%--
  Created by IntelliJ IDEA.
  User: Lenovo
  Date: 2023/12/6
  Time: 17:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.wmc.javabean.DBConnector " %>

<!-- 前端表单输入框 -->
<%@page language="java" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>插入</title>
</head>
<body>
<form action="insert.jsp" method="post">
    用户名: <input type="text" name="username" required><br>
    密码: <input type="password" name="password" required><br>
    邮箱: <input type="email" name="email"><br>
    年龄: <input type="number" name="age"><br>
    <input type="submit" value="Insert">
</form>
</body>
</html>


<%
    if (request.getMethod().equals("POST")) {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        int age = Integer.parseInt(request.getParameter("age"));

        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            connection = DBConnector.getConnection();
            String insertQuery = "INSERT INTO UserInfo (username, password, email, age) VALUES (?, ?, ?, ?)";
            preparedStatement = connection.prepareStatement(insertQuery);
            preparedStatement.setString(1, username);
            preparedStatement.setString(2, password);
            preparedStatement.setString(3, email);
            preparedStatement.setInt(4, age);

            int rowsAffected = preparedStatement.executeUpdate();

            if (rowsAffected > 0) {
                out.println("插入成功!");
                response.sendRedirect("suc.jsp");
            } else {
                out.println("插入失败!");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (preparedStatement != null) preparedStatement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
%>


6、query.jsp
在query.jsp页面中,设计表单,查询数据库表记录。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.wmc.javabean.DBConnector" %>

<!-- HTML form for query -->
<form action="query.jsp" method="get">
  通过用户名查询: <input type="text" name="username" required>
  <input type="submit" value="查询">
</form>

<%
  if ("GET".equals(request.getMethod())) {
    String username = request.getParameter("username");

    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;

    try {
      connection = DBConnector.getConnection();
      String query = "SELECT * FROM userInfo WHERE username = ?";
      preparedStatement = connection.prepareStatement(query);
      preparedStatement.setString(1, username);

      resultSet = preparedStatement.executeQuery();

      // Move resultSet.next() outside the loop to check if there are results
      if (resultSet.next()) {
        // Print the first row of the result
        out.println("ID: " + resultSet.getInt("id") + "<br>");
        out.println("Username: " + resultSet.getString("username") + "<br>");
        out.println("Password: " + resultSet.getString("password") + "<br>");
        out.println("Email: " + resultSet.getString("email") + "<br>");
        out.println("Age: " + resultSet.getInt("age") + "<br><br>");

        // Loop through the remaining rows
        while (resultSet.next()) {
          out.println("ID: " + resultSet.getInt("id") + "<br>");
          out.println("Username: " + resultSet.getString("username") + "<br>");
          out.println("Password: " + resultSet.getString("password") + "<br>");
          out.println("Email: " + resultSet.getString("email") + "<br>");
          out.println("Age: " + resultSet.getInt("age") + "<br><br>");
        }
      } else {
        out.println("未找到匹配的记录。");
      }
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      try {
        if (resultSet != null) resultSet.close();
        if (preparedStatement != null) preparedStatement.close();
        if (connection != null) connection.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
%>

运行结果:
主页面:
在这里插入图片描述

点击插入:
在这里插入图片描述
在这里插入图片描述

点击查询:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

删除:

在这里插入图片描述
在这里插入图片描述

三、实验心得
实验总结: 数据库表设计:
了解如何设计数据库表,包括字段的类型、约束、主键等。 设计良好的数据库表结构对数据管理和操作至关重要。 JDBC连接数据库:
了解如何使用JDBC连接MySQL或SQL Server数据库。 JDBC提供了Connection、PreparedStatement等类,用于执行SQL语句。 页面间跳转:
学会使用JSP页面创建用户界面,通过按钮和链接实现页面间的跳转。 使用response.sendRedirect()实现页面跳转。 数据的增删查改:
实现了基本的增删查改功能,了解如何使用SQL语句进行数据操作。 使用PreparedStatement防止SQL注入攻击。 异常处理:
学会在JSP中处理SQL异常,保证程序的稳定性。 使用try-catch块捕获异常,及时定位问题。 页面显示与编码:
确保前端页面和后端代码的字符编码一致,避免中文乱码问题。 设置页面的contentType为UTF-8。 心得体会: 理解数据库设计原则:
学会设计规范的数据库表结构,合理选择字段类型,设定适当的约束。 熟悉JDBC基础操作:
通过实践掌握了JDBC的基本操作,包括连接数据库、执行SQL语句、处理结果集等。 强化编程实践:
实验中涉及了前后端的交互,强化了编程实践和代码调试的能力。 异常处理重要性:
了解异常处理的重要性,能够在程序中添加合适的异常处理代码,增强程序的健壮性。 界面交互设计:
通过实现页面跳转和用户交互,理解了如何设计友好的界面,提升用户体验。 对整个开发流程的认识:
了解了从数据库设计到前后端交互再到页面显示的整个开发流程,对于全栈开发有了更全面的认识。
总体而言,通过实践项目,你应该对JDBC的基本操作、数据库设计和前后端交互有了更深入的理解,这对于进一步学习和实践Java Web开发是很有帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1289561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java多线程万字详解(基础概念、多线程实现方式、锁、消费者机制、线程池)

1 、基础概念解释 1.1线程与进程 线程&#xff1a;是操作系统能够进行运算调度的最小单位。它被包含在进程当中&#xff0c;是进程中的实际运作单位。 进程&#xff1a;是程序的基本执行实体。一个进程中至少有一个线程。一个进程中是可以有多个线程的。如QQ&#xff0c;微信那…

并发编程(已整理,已废弃)

这一块知识&#xff0c;那真是有的啃了。 直接先看速成基础&#xff0c;再直接吃掉高频考点。 每个小知识点&#xff0c;直接看短视频&#xff0c;浅浅了解&#xff0c;在写下来就是自己的资料。 # 基础 一个进程有多个线程&#xff0c;多个线程共享进程的堆和方法区&#xf…

Linux环境变量与命令行参数

Linux环境变量与命令行参数 一.命令行参数1.语法2.应用1:简易计算器 二.环境变量1.环境变量的概念2.环境变量的作用3.进一步理解环境变量的作用4.常见环境变量5.导出环境变量(添加环境变量)6.环境变量的特性7.另一种获取环境变量的方式8.小功能:用于身份验证的代码9.补充:第三种…

​DeepMind:开发出可以向人类学习的人工智能

Nature发表了一篇Google DeepMind的研究成果&#xff1a;研究人员在3D模拟环境中使用神经网络和强化学习&#xff0c;展示了AI智能体如何在没有直接从人类那里获取数据的情况下&#xff0c;通过观察来学习和模仿人类的行为。 这项研究被视为向人工通用智能&#xff08;AGI&…

ssm土家风景文化管理平台源码和论文答辩PPT

摘要 土家风景文化管理平台是土家风景文化管理必不可少的一个部分。在风景文化管理的整个过程中&#xff0c;平台担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类土家风景文化管理平台也在不断改进。本课题所设计的土家风景文化管理平台&#xff0c;使用jav…

SAP MM中的科目分配类别是什么,如何配置

一、概述 这篇文章将概述 SAP MM 中的科目分配类别的基本概念以及如何在系统中配置它。我将在SAP配置中逐步解释配置。在此之前要理解采购的两种模式&#xff0c;库存物料采购和消耗型物料采购之间的区别。 1.1、库存采购 库存采购的物料&#xff0c;在收货后做库存管理&…

python创建子进程执行ping命令无法检测到超时情况(破案了:ping命令-W参数单位为s,我写了个1000)

文章目录 问题描述破案了&#xff1a;ping命令-W参数单位为s&#xff0c;我写了个1000。。。,,ԾㅂԾ,, 问题描述 我用了创建子进程的方式去执行ping&#xff0c;一开始用os.system()&#xff0c;有问题&#xff0c;后面用subprocess问题还是存在&#xff0c;后来我把这个改了&…

Python BeautifulSoup 选择器无法找到对应元素(异步加载导致)

文章目录 问题原因解决方案找到包含内容的 XHR 异步请求无头浏览器 个人简介 问题 使用 Python BeautifulSoup 爬取一个股吧帖子发现某个样式无法找到&#xff0c;但是在网页中确实存在这个元素&#xff1a;网页使用 document.querySelector 可以正常查找&#xff1a; 但是 Py…

javascript实现List列表数据结构

书籍推荐 有幸拜读《数据结构与算法Javascript描述》这本书&#xff0c;先强烈安利一波&#xff01;非常感谢作者大大给我们前端领域带来这本书。 全书从javascript的角度出发&#xff0c;简单明了的分析了数据结构在javascript领域的实现过程与实际的应用案例&#xff0c;且…

ps快捷键和常见项目总结

处理以像素构成的位图的软件 Mac笔记本快捷键&#xff1a; 打开文件&#xff1a;commandO 图像缩放&#xff1a;command 多个文件切换&#xff1a;同一桌面中&#xff1a;command (英文状态下输入) 切换屏幕模式&#xff1a;F,全屏模式下Tab键可进行切换 首选项—性能&a…

class051 二分答案法与相关题目【算法】

class051 二分答案法与相关题目【算法】 算法讲解051【必备】二分答案法与相关题目 code1 875. 爱吃香蕉的珂珂 // 爱吃香蕉的珂珂 // 珂珂喜欢吃香蕉。这里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉 // 警卫已经离开了&#xff0c;将在 h 小时后回来。 // 珂珂…

Swing程序设计详解(二)

一 文件标签组与图标 在Swing程序设计中&#xff0c;标签(JLabel)被用于显示文本、图标等内容。在Swing应用程序的用户系面中&#xff0c;用户能够通过标签上的文本、图标等内容获得相应的提示信息。 1.1 JLable标签 标签(JLabel)的父类是JComponent类。虽然标签不能被添加…

Qt绘制直线箭头

一.使用QPainter绘制 满足条件: 任意角度直线都可绘制箭头所有箭头同样大小 void MainWindow::paintEvent(QPaintEvent*) {QPainter painter(this); // 创建QPainter对象&#xff0c;并指定绘制目标为当前的widgetQLineF line(50,20,500,500);double distanceFromEnd1 20;qre…

LeetCode Hot100 200.岛屿数量

题目&#xff1a; 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以…

目标检测综述(待补ing)

文章目录 摘要引言目标检测发展历程目标检测路线图传统检测器基于CNN的两阶段检测器基于CNN的一阶段检测器 目标检测数据集及指标数据集评价指标标注软件 摘要 目标检测作为计算机视觉中最基本、最具挑战性的问题之一&#xff0c;近年来受到了广泛的关注。它在过去二十五年的发…

2023中医药国际传承传播大会在深圳召开

12月2日&#xff0c;2023中医药国际传承传播大会在深圳召开&#xff0c;大会由世界针灸学会联合会、中新社国际传播集团、中国新闻图片网、中国民族医药学会、中国针灸学会主办&#xff0c;世界针灸学会联合会健康传播工作委员会、中新雅视文化发展有限公司公司与深圳巨邦传媒集…

【西交少年班】数据解读近两年西少录取数据,凭什么让浙江霸榜?

招生简章 12月2日&#xff0c;西安交通大学发布了2024年“少年班”招生简章&#xff0c;大家可以参照这篇文章了解少年班招生信息。 【重磅】初三可报&#xff0c;直上985&#xff0c;西安交通大学2024年“少年班”招生简章 数据说话 最初的目的&#xff1a; 一是&#xf…

知识小课堂:在光伏电站中发生绝缘阻抗异常的排查方法

【摘要】近几年&#xff0c;光伏发电技术迅猛发展&#xff0c;光伏扶贫电站及分布式光伏使光伏发电走进千家万户。然而光伏发电设备运行期间仍存在隐患。及时发现并解决*常见异常运行故障&#xff0c;可以很大地提高光伏发电设备可利用率&#xff0c;是保证光伏发电设备正常运行…

git 分支的创建与删除

一 创建本地分支 git checkout -b codetwo //创建本地分支 codetwo git branch newcode //创建本地分支newcode创建的分支如下图&#xff1a; 用checkout的方式创建&#xff0c;只是创建的同时还切换到了这个本地分支 二 创建远程分支 git branch newcode //创…

未解决的问题:BIOS中enter键失效

我的acer电脑启动进入Ubuntu系统后enter键是完全正常的。但如果在启动的过程中按F2进入BIOS&#xff0c;进行一些设置(比如去使能F12&#xff09;&#xff0c;然后按F10保存退出&#xff0c;按下F10之后&#xff0c;出现的界面如下图&#xff0c;此时需要按enter键确认&#xf…