在创建jsp项目中解决无法连接数据库以及junit问题

💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等
🥏主页链接:

                Y小夜-CSDN博客

目录

🎯项目例子

🎃项目结构

🎃所用到的方法以及类

✨Bookinfo类

✨DataBase类

 ✨Product类

 ✨ProductDao类

 ✨ProductDaoImp类

 ✨ProductTest类

✨product.jsp类

 🎃所实现的页面效果

🎯报空指针或连接不了数据库相关错误

🎃问题描述

🎃 解决方案

🎯Junit不在对应运行类上

🎃问题描述

🎃解决方法


🎯项目例子

🎃项目结构

这个是是我们项目的大体结构

🎃所用到的方法以及类

✨Bookinfo类

        这是一个用于表示图书信息的 Java 类 Bookinfo。它包含了图书的一些基本属性,比如书籍编号、书名、状态、借出日期和数量等。

        这个类提供了一系列的 getter 和 setter 方法,用于获取和设置对象的属性。构造函数 Bookinfo(String bookid, String bookname, int count) 用于初始化图书对象的部分属性,其中 bookid、bookname 和 count 是必填的参数。

package book;
public class Bookinfo {String bookid;String bookname;int bookstate;String lenddate;int count;public String getBookid() {return bookid;}public void setBookid(String bookid) {this.bookid = bookid;}public String getBookname() {return bookname;}public void setBookname(String bookname) {this.bookname = bookname;}public int getBookstate() {return bookstate;}public void setBookstate(int bookstate) {this.bookstate = bookstate;}public String getLenddate() {return lenddate;}public void setLenddate(String lenddate) {this.lenddate = lenddate;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public Bookinfo(String bookid, String bookname, int count) {this.bookid = bookid;this.bookname = bookname;this.count = count;}
}

✨DataBase类

        这段代码是一个用于数据库操作的 Java 类 DataBase。它封装了一些常见的数据库操作,包括连接数据库、执行更新操作、执行查询操作以及关闭数据库连接。

        在这个类中,首先定义了数据库的连接信息,包括 URL、用户名、密码以及驱动类。然后,在静态代码块中加载数据库驱动类。

        该类提供了 getConnection() 方法用于获取数据库连接,executeUpdate(String sql, Object...args) 方法用于执行更新操作(如插入、更新、删除等),executQuery(String sql, Object...args) 方法用于执行查询操作,并返回查询结果集,最后提供了 closeAll() 方法用于关闭数据库连接、PreparedStatement 对象和 ResultSet 对象。

这个类的设计使得数据库操作更加方便和简洁,同时也提高了代码的可维护性。

package book;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DataBase {static String url="jdbc:mysql://localhost:3306/bookstore";static String user="root";static String password="200454";static String driverClass="com.mysql.cj.jdbc.Driver";protected  Connection con=null;protected PreparedStatement ps=null;protected ResultSet rs=null;static{try {Class.forName(driverClass);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void getConnection(){try {if(con==null||con.isClosed())con=DriverManager.getConnection(url, user, password);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public int executeUpdate(String sql,Object...args){int result=0;getConnection();try {ps=con.prepareStatement(sql);for (int i = 0; i < args.length; i++) {ps.setObject(i+1, args[i]);}result=ps.executeUpdate();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}public ResultSet executQuery(String sql,Object...args){getConnection();rs=null;try {ps=con.prepareStatement(sql);for (int i = 0; i < args.length; i++) {ps.setObject(i+1, args[i]);}rs=ps.executeQuery();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return rs;}public void closeAll(){try {if(rs!=null){rs.close();if(ps!=null){ps.close();}if(con!=null){con.close();}}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

 ✨Product类

        这段代码定义了一个名为 Product 的类,表示商品对象。该类具有私有属性 productidcategorynamedescn,分别表示商品的编号、类别、名称和描述。

        该类提供了公共的 getter 和 setter 方法来访问和设置这些属性的值。此外,还覆盖了 toString() 方法,以便在需要打印该对象时能够提供有意义的输出。

        这个类的设计符合面向对象的原则,使得在应用程序中可以方便地创建和操作商品对象。

package book;public class Product {private String productid;private String category;private String name;private String descn;public String getProductid() {return productid;}public void setProductid(String productid) {this.productid = productid;}public String getCategory() {return category;}public void setCategory(String category) {this.category = category;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDescn() {return descn;}public void setDescn(String descn) {this.descn = descn;}@Overridepublic String toString() {return "Product [productid=" + productid + ", category=" + category+ ", name=" + name + ", descn=" + descn+ "]";}
}

 ✨ProductDao类

        这段代码定义了一个接口 ProductDao,用于商品的数据访问对象(DAO)。该接口规定了一组方法,用于对商品进行增加、更新、删除和查询等操作。

具体来说,接口中声明了以下方法:

  1. add(Product entity):向数据库中添加商品信息,并返回受影响的行数。
  2. update(Product entity):更新数据库中的商品信息,并返回受影响的行数。
  3. delete(String pid):根据商品编号从数据库中删除对应的商品信息,并返回受影响的行数。
  4. findByCatid(String catid):根据商品类别编号查询数据库中对应的商品信息,并返回结果列表。
  5. findByName(String name):根据商品名称查询数据库中对应的商品信息,并返回结果列表。
  6. findall():查询数据库中所有商品的信息,并返回结果列表。

        这些方法定义了对商品信息进行常见操作的接口,具体的实现可以根据具体的数据库访问框架来完成。通常,这个接口会被一个具体的类来实现,该类负责与数据库进行交互,执行具体的数据库操作。

package book;
import java.util.List;public interface ProductDao {public int add(Product entity);public int update(Product entity);public int delete(String pid);//public List<Product> findAll();public List<Product> findByCatid(String catid);public List<Product> findByName(String name);public List<Product> findall();}

 ✨ProductDaoImp类

        这段代码实现了 ProductDao 接口的具体方法,在数据库中对商品信息进行增删改查操作。

  1. add(Product entity) 方法用于向数据库中添加商品信息。
  2. update(Product entity) 方法用于更新数据库中的商品信息。
  3. delete(String pid) 方法用于根据商品编号从数据库中删除对应的商品信息。
  4. findByCatid(String catid) 方法用于根据商品类别编号查询数据库中对应的商品信息。
  5. findByName(String name) 方法用于根据商品名称查询数据库中对应的商品信息。
  6. findall() 方法用于查询数据库中所有商品的信息。

        这些方法中,通过执行 SQL 语句并处理查询结果集,将数据库中的商品信息转换为 Product 对象并添加到列表中返回。

        需要注意的是,代码中使用了继承关系,ProductDaoImp 类继承自 DataBase 类。在 ProductDaoImp 中直接调用了 executeUpdateexecutQuery 方法,这些方法应该是 DataBase 类中的实现。具体的数据库操作在 DataBase 类中实现。

package book;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;//import rjxy.entity.account;public class ProductDaoImp  extends DataBase implements ProductDao  {@Overridepublic int add(Product entity) {String sql="insert into product values(?,?,?,?)";returnthis.executeUpdate(sql,entity.getProductid(),entity.getCategory(),entity.getName(),entity.getDescn());}@Overridepublic int update(Product entity) {String sql="update product set category=?,name=?,descn=? where productid=?";returnthis.executeUpdate(sql,entity.getCategory(),entity.getName(),entity.getDescn(),entity.getProductid());}@Overridepublic int delete(String pid) {String sql="delete from product where productid=?";returnthis.executeUpdate(sql, pid);}@Overridepublic List<Product> findByCatid(String catid) {String sql="select * from product where category=?";List<Product> list=new ArrayList<Product>();this.rs=this.executQuery(sql,catid);try {while(rs.next()) {Product p=new Product();p.setCategory(rs.getString("category"));p.setDescn(rs.getString("descn"));p.setName(rs.getString("name"));p.setProductid(rs.getString("productid"));list.add(p);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}@Overridepublic List<Product> findByName(String name) {String sql="select * from product where name like ?";this.rs=this.executQuery(sql,name);List<Product> list=new ArrayList<Product>();try {while(rs.next()) {Product p=new Product();p.setCategory(rs.getString("category"));p.setDescn(rs.getString("descn"));p.setName(rs.getString("name"));p.setProductid(rs.getString("productid"));list.add(p);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}public List<Product> findall() {// TODO Auto-generated method stubString sql=" select * from product";this.rs=this.executQuery(sql);List<Product> list=new ArrayList<>();Product p=null;try {while(rs.next()) {p=new Product();p.setCategory(rs.getString("category"));p.setDescn(rs.getString("descn"));p.setName(rs.getString("name"));p.setProductid(rs.getString("productid"));list.add(p);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}}

 ✨ProductTest类

        这段代码是一个简单的测试类 ProductTest,用于测试 ProductDaoImp 类中的 findall() 方法。

        在 findall() 方法中,首先调用 ProductDaoImp 类的 findall() 方法获取数据库中所有商品的信息,然后遍历返回的商品列表,并打印每个商品的信息。最后调用 closeAll() 方法关闭数据库连接。

        这个测试方法可以帮助验证 findall() 方法是否能够正确地从数据库中获取所有商品的信息,并且是否能够正常地打印出来。

package book;import java.util.List;import org.junit.Test;public class ProductTest {ProductDaoImp pdi = new ProductDaoImp();@Testpublic void findall() {List<Product> list = pdi.findall();for (Product product : list) {System.out.println(product);}pdi.closeAll();}
}

✨product.jsp类

        这段代码是一个简单的 JSP 页面,用于显示数据库中的产品信息。

        首先,通过 ProductDaoImp 类获取所有产品的信息,并将结果存储在 list 中。

然后,页面使用 Bootstrap 框架创建了一个简单的表格,用于显示产品信息。表格包括了产品的编号、名称、描述、类别以及操作列。

        在 Java 代码块中使用了 JSP 的循环语句遍历 list 中的产品信息,并将每个产品的属性填充到表格中相应的位置。同时,为每个产品添加了修改和删除的链接。

        需要注意的是,在 <link><script> 标签中引入了 Bootstrap 和 jQuery 库,确保页面样式和功能的正常显示和运行。

​
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<%@ page import="book.Product" %>
<%@ page import="book.ProductDaoImp" %>
<%@ page import="java.util.List" %>
<html>
<head><meta charset="UTF-8"><meta name="viewport"  content="width=device-width,initial-scale=1"><title>Insert title here</title><link rel="stylesheet" href="css/bootstrap.css" type="text/css"/><script type="text/javascript"  src="js/jquery-1.11.3.min.js"></script><script type="text/javascript" src="js/bootstrap.js"></script>
</head>
<body>
<!--以表格形式来显示图书信息 -->
<%ProductDaoImp pdi=new ProductDaoImp();List<Product> list=pdi.findall();
%>
<div class=""><a href="#">添加产品</a></div>
<div class="row" style="height:500px; text-align:center;"><div class="col-md-10 col-md-push-1"><table class="table table-striped"><tr><td>图书编号</td><td>图书名称</td><td>图书描述</td><td>图书类别</td><td>操作</td></tr><% for(Product p:list){%><tr><td><%=p.getProductid() %></td><td><%=p.getName() %></td><td><%=p.getDescn() %></td><td><%=p.getCategory() %></td><td><a href="#">修改</a><a href="#">删除</a></td></tr><%} %></table>a</div>
</div>
</body>
</html>​

 🎃所实现的页面效果

🎯报空指针或连接不了数据库相关错误

🎃问题描述

ChatGPT给出的答案:

        这个错误是由于在执行 ProductDaoImp.findall() 方法时出现了空指针异常(NullPointerException)。具体地,异常堆栈信息显示在 ProductDaoImp 类的 findall() 方法的第 72 行出现了空指针异常。

空指针异常通常是因为尝试在空对象上调用方法或访问属性而引起的。在你的情况下,可能有几种原因导致了空指针异常:

  1. 数据库连接问题:如果在 DataBase.executQuery() 方法中出现了空指针异常,可能是因为数据库连接没有正确地建立或者被关闭了。你需要确保数据库连接正常并且可用。

  2. 查询返回空值:如果 ProductDaoImp.findall() 方法返回了空值(即没有查询到任何数据),而你的代码没有处理这种情况,尝试在空列表上执行操作可能导致空指针异常。你需要在使用返回的列表之前进行空值检查。

  3. 程序逻辑问题:可能是由于代码逻辑错误导致的。在调用 ProductDaoImp.findall() 方法之前,你可能需要确保所有必要的依赖项都已经正确地设置和初始化。

要解决这个问题,你可以:

  • 在程序中添加适当的空值检查,以防止空指针异常的发生。
  • 检查数据库连接是否正确建立,并确保查询方法能够正常执行并返回正确的结果。
  • 检查代码逻辑,确保所有依赖项都被正确初始化和设置。

🎃 解决方案

其实这个问题就是因为我们的web文件类中缺少关于连接数据库的jar包

在文件夹中找到我们的jar包,一般都在C:\Program Files (x86)\MySQL\Connector J 8.0

把他复制一下,让粘贴在我们WEB-INT下的lib文件夹内

在运行一下项目,应该就ok了

🎯Junit不在对应运行类上

🎃问题描述

运行wrok2模块下的test程序,但是Junit总是默认在work3下

🎃解决方法

我并没研究出调默认的方法,有好的方法的友友可以分享到评论区

我的方法,就是每次运行其他模块测试代码时,调一下配置:

点击三角符号,然后选择Mofify Run Configuration 

在这里可以选择你要运行的模块和类,点击OK

再次运行,就可以完成测试了

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

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

相关文章

将 Vision Transformer 用于医学图像的语义分割

关于ViT的关键点如下&#xff1a; ViT架构基于将图像表示为一组补丁。图像补丁是图像的非重叠块。每个块最初都有一个由该块中的图像像素形成的嵌入向量。Transformer编码器是ViT的主要部分&#xff0c;它根据它们的类别归属来训练补丁之间的相似度。它包含一系列线性、归一化…

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口&#xff0c; 那么你项目一定充斥着大量的对接逻辑和代码&#xff0c; 并且针对不同的对接渠道方需要每次封装一次调用的简化&#xff0c; 一旦封装不好系统将会变得难以维护&am…

SprintBoot创建遇到的问题

最近使用IDEA版本为2022.3.1&#xff0c;java版本为21.0.3&#xff0c;现在做一个创建SprintBoot3的一个大体流程 1.先下载Maven&#xff0c;解压到一个位置 maven下载 2.配置setting.xml文件 这路径自己配置&#xff0c;这里不多演示 代码如下&#xff1a; <mirror>&…

前端如何取消接口调用

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1. xmlHttpRequest是如何取消请求的&#xff1f; 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…

开关电源——15种控制模式(1)

关于开关电源的控制模式&#xff0c;TI官网的控制模式快速参考指南有相对全面的归纳和描述&#xff0c;提供了15种不同的控制架构&#xff0c;这些架构涵盖了从基础到高级的多种控制模式&#xff0c;以适应不同的应用需求&#xff0c;如下表所示&#xff1a; 以下是对控制模式相…

记一次Ueditor上传Bypss

前言 前一段时间和小伙伴在某内网进行渗透测试&#xff0c;目标不给加白&#xff0c;只能进行硬刚了&#xff0c;队友fscan一把梭发现某资产疑似存在Ueditor组件&#xff0c;但初步测试是存在waf和杀软的&#xff0c;无法进行getshell&#xff0c;经过一番折腾最终getshell&am…

一个 Docker 搭建的自动化电视剧下载和管理工具

大家好,我是CodeQi! 一个标准的“追剧狂人”。每周都有新剧上线,每天都要时刻关注各大影视平台的更新,这无疑是一项体力与脑力并存的艰巨任务。 于是,我决定为自己打造一个自动化的电视剧下载和管理工具。作为一个程序员,用 Docker 搭建这种自动化工具简直是小菜一碟。…

PointCloudLib GridMinimum获取栅格最低点 C++版本

测试效果 简介 在点云库(Point Cloud Library, PCL)中,如果你想要获取一个栅格(Grid)内的最低点,这通常意味着你需要先对点云数据进行某种形式的栅格化处理,然后在每个栅格内寻找最低的点。 测试代码 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointC…

f_mkfs格式化最小分区数是191

使用fatfs的f_mkfs最小分区数是191原因&#xff1a; 在挂载ram_disk时参考的文章有提到&#xff1a; “然后是GET_SECTOR_COUNT 用于f_mkfs格式化时获取可用的sector的数量&#xff0c;32bit-LBA的情况下至少为191” 自己也实际试过确实要不少于191&#xff0c;网上也没找到相…

【单片机毕业设计选题24056】-基于STM32的八路抢答器设计

系统功能: 系统上电后显示“欢迎使用八路抢答系统请稍后”&#xff0c;两秒后进入正常页面显示。 第一行显示系统状态信息&#xff0c;第二行显示抢答计时时间&#xff0c;第三行显示设定的抢答时间&#xff0c; 第四行显示系统状态&#xff08;空闲状态或计时状态&#xff…

CST软件仿真内存设置-电磁仿真cst软件教程

当大家使用CST软件进行仿真时&#xff0c;可能会有仿真内存的设置需求&#xff0c;下面的内容是帮助大家如何设置仿真内存。 首先&#xff0c;打开CST软件并加载您的仿真模型&#xff0c;在软件界面中&#xff0c;找到菜单栏或工具栏中的“仿真设置”或类似的选项。 在仿真设置…

揭秘”大模型加速器”如何助力大模型应用

文章目录 一、大模型发展面临的问题二、“大模型加速器”助力突破困难2.1 现场效果展示2.1.1 大模型加速器——文档解析引擎2.2.2 图表数据提取 三、TextIn智能文档处理平台3.1 在线免费体验3.1.1 数学公式提取3.1.2 表格数据提取 四、acge文本向量化模型4.1 介绍4.2 技术创新4…

数据仓库介绍_维度表(三)

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 表设计步骤 确定维度&#xff08;表&…

Django项目的基本准备工作【1】

【 一 】pip换源 # 1 之前装第三方模块 pip3 install django -i 镜像仓库 ​ # 2 一劳永逸--》整点配置&#xff0c;以后安装模块&#xff0c;自动去配置好的源下载 ###windows 1、文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用…

Sentinel-1 Level 1数据处理的详细算法定义(三)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

vscode远程调试python代码

第一步&#xff1a; vscode设置 vscode也支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。 还是点击VSCode侧边栏的“Run and Debug”&#xff08;运行和调试)&#xff0c;单击"create a lauch.json file" 第二步&a…

创建React 项目的几种方式

①.react自带脚手架 使用步骤&#xff1a; 1、下载 npm i create-react-app -g 2、创建项目命令&#xff1a; create-react-app 项目名称 ②.Vite构建工具创建react步骤&#xff1a;&#xff08;推荐&#xff09; 方法一&#xff1a; 1、yarn create vite 2、后续根据提示步…

系统架构设计师 - 数学与经济管理

数学与经济管理 数学与经济管理&#xff08;1 - 2分&#xff09;图论应用最小生成树最短路径网络与最大流量 ★ 运筹方法关键路径法 ★ ★ ★线性规划 ★动态规划 ★ ★ ★排队论预测与决策 ★预测 - 博弈论决策 数学建模 ★ ★ 大家好呀&#xff01;我是小笙&#xff0c;本章我…

线程安全(有点乱哈)

1.多个进程访问共享资源&#xff0c;通过上锁保证数据安全 1.2锁的宏观分类方式是悲观锁和乐观锁 1.3悲观锁和乐观锁 悲观锁&#xff1a;拿数据上锁‘ 举例&#xff1a;synchronzied 乐观锁&#xff1a;每次拿数据的时候不会上锁&#xff0c;更新数据&#xff0c;比较下版…

抖音机构号授权矩阵系统源码:打造自媒体帝国的新利器

在自媒体风起云涌的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;早已成为内容创作者们争相入驻的热门平台。然而&#xff0c;随着竞争加剧&#xff0c;如何在这场流量大战中脱颖而出&#xff0c;成为每一位自媒体人不得不面对的课题。今天&#xff0c;我们将带您深…