在创建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 block
            e.printStackTrace();
        }
    }


    public void getConnection(){

        try {
            if(con==null||con.isClosed())
                con=DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.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 block
            e.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 block
            e.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 block
            e.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;
    }
    @Override
    public 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  {
    @Override
    public int add(Product entity) {
        String sql="insert into product values(?,?,?,?)";
        return
                this.executeUpdate(sql,
                        entity.getProductid(),entity.getCategory()
                        ,entity.getName(),entity.getDescn());
    }
    @Override
    public int update(Product entity) {
        String sql="update product set category=?,name=?,descn=? where productid=?";
        return
                this.executeUpdate(sql,entity.getCategory()
                        ,entity.getName(),entity.getDescn(),
                        entity.getProductid());
    }
    @Override
    public int delete(String pid) {
        String sql="delete from product where productid=?";
        return
                this.executeUpdate(sql, pid);
    }
    @Override
    public 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 block
            e.printStackTrace();
        }
        return list;
    }
    @Override
    public 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 block
            e.printStackTrace();
        }
        return list;
    }


    public List<Product> findall() {
        // TODO Auto-generated method stub

        String 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 block
            e.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();
    @Test
    public 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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CTF php RCE (四)

0x08 取反以及异或、或 这两个东西呢相当的好玩&#xff0c;也能够达到一下小极限的操作 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$…

大模型之战进入新赛季,开始卷应用

最近一段时间&#xff0c;国产大模型Kimi彻底火了&#xff0c;而这波爆火&#xff0c;某种意义上也展示了一个问题&#xff0c;即大模型的落地场景可能比技术比拼&#xff0c;更重要。 国产大模型Kimi突然爆火&#xff0c;与Kimi相关的产业链甚至被冠上“Kimi概念股”之名&…

降Compose十八掌之『鸿渐于陆』| State

公众号「稀有猿诉」 原文链接 降Compose十八掌之『鸿渐于陆』| State Jetpack Compose是一种声明式的UI框架&#xff0c;用以构建GUI应用程序。通过前面的文章我们学会了如何使用元素来填充页面&#xff0c;也学会了如何装饰元素&#xff0c;但这还不够。UI还必须处理与…

【VUE实战项目】使用typescript重构项目

前言 本文是博主vue实战系列中的一篇&#xff0c;本系列不是专业的前端教程&#xff0c;是专门针对后端熟悉前端的。前面我们用vue实现了一个基础的管理系统&#xff0c;前文专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12469788.html?spm1001.2014.300…

windows10开启防火墙,增加入站规则后不生效,还是不能访问后端程序

一、背景&#xff1a; 公司护网要求开启防火墙&#xff0c;开启防火墙后&#xff0c;前后端分离的项目调试受影响&#xff0c;于是增加入站规则开放固定的后台服务端口&#xff0c;增加的mysql端口3306和redis端口6379&#xff0c;别人都可以访问&#xff0c;但是程序的端口808…

丑数问题,力扣264,坑点

丑数问题&#xff0c;力扣264&#xff0c;坑点 力扣链接 给你一个整数 n &#xff0c;请你找出并返回第 n 个 丑数 。 丑数 就是质因子只包含 2、3 和 5 的正整数。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;12 解释&#xff1a;[1, 2, 3, 4, 5, 6, 8, 9, …

f_mkfs格式化最小分区数是191

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

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

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

DLP迎来新机遇 | 天空卫士数据防泄漏防护市场占有率连续三年第一

IDC 于近日发布了《中国数据泄露防护市场份额&#xff0c;2023&#xff1a;DLP迎来新机遇》&#xff08;Doc#CHC50973524 &#xff0c;2024年6月&#xff09;报告&#xff0c;天空卫士DLP产品以21.9%的市场份额再次位列中国数据防泄露防护市场第一。这一成绩体现了天空卫士在技…

2024SpringCloud学习笔记

远程调用Rest Template 服务注册与发现&分布式配置管理 Consul 下载安装 官网https:/ldeveloper.hashicorp.com/consul/downloads 开发者模式启动consul agennt -dev 浏览器访问本地端口:8500 服务注册与发现 Maven引入 <!--SpringCloud consul discovery -->…

基于 BERT 的非结构化领域文本知识抽取

文章目录 题目摘要方法实验 题目 食品测试的大型语言模型 论文地址&#xff1a;https://arxiv.org/abs/2103.00728 摘要 随着知识图谱技术的发展和商业应用的普及&#xff0c;从各类非结构化领域文本中提取出知识图谱实体及关系数据的需求日益增加。这使得针对领域文本的自动化…

MechMind结构光相机 采图SDK python调用

测试效果 Mech-Mind结构光相机 Mech Mind(梅卡曼德)的结构光相机,特别是Mech-Eye系列,是工业级的高精度3D相机,广泛应用于工业自动化、机器人导航、质量检测等多个领域。以下是对Mech Mind结构光相机的详细解析: 一、产品概述 Mech Mind的结构光相机,如Mech-Eye PRO,…

极狐GitLab X 中科星图,用实际行动赋能空天行业开发者

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

RFID技术革新养猪业,构建智能化养殖场

RFID技术作为无线射频识别技术的一种&#xff0c;凭借着非接触、高效识别的特性&#xff0c;在养殖业行业中得到了广泛的应用&#xff0c;为构建智能化、高效化的养殖场提供了强大的技术支持&#xff0c;给传统养殖业带来了一场前所未有的技术变革。以下是RFID技术在养猪行业不…

podman 替代 docker ? centos Stream 10 已经弃用docker,开始用podman了!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

记一次Ueditor上传Bypss

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

Python基础语法:运算符详解(算术运算符、比较运算符、逻辑运算符、赋值运算符)②

文章目录 Python中的运算符详解一、算术运算符二、比较运算符三、逻辑运算符四、赋值运算符五、综合示例结论 Python中的运算符详解 在Python编程中&#xff0c;运算符用于执行各种操作&#xff0c;例如算术计算、比较、逻辑判断和赋值。了解并掌握这些运算符的使用方法是编写…

【观成科技】Websocket协议代理隧道加密流量分析与检测

Websocket协议代理隧道加密流量简介 攻防场景下&#xff0c;Websocket协议常被用于代理隧道的搭建&#xff0c;攻击者企图通过Websocket协议来绕过网络限制&#xff0c;搭建一个低延迟、双向实时数据传输的隧道。当前&#xff0c;主流的支持Websocket通信代理的工具有&#xf…

物联网系统中市电电量计量方案(二)

上文我们主要介绍了电量计量中最重要的组成部分——电量计量芯片&#xff08;如果没有阅读该文章的&#xff0c;可以点击这里&#xff09;。本文会再为大家介绍电量计量的另外一个组成部分——电流互感器。 电流互感器的定义 电流互感器是一种可将一次侧大电流转换为二次侧小电…

AppStandby白名单机制

背景&#xff1a;原生机制中AppStandby机制的白名单是共享Doze白名单&#xff0c;即一旦设置doze白名单&#xff0c;也即AppStandby的白名单 需求&#xff1a;如何建立AppStandby自己的白名单 技术原理&#xff1a;可以使用setAppStandbyBucket接口实现 setAppStandbyBucket…