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

news2024/9/9 1:22:03

💻博主现有专栏:

                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

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

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

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

相关文章

入驻长沙!全球数据资产理事会长江中游中心挂牌成立

在全球数据资产化浪潮的推动下&#xff0c;长江中游地区迎来了其在数字经济领域的重要里程碑。 近日&#xff0c;《数据资产长江中游生态论坛暨数据资产入表和价值转化研讨会》于长沙圆满落幕&#xff0c;会上各产业专家、企业高管&#xff0c;围绕数据产品开发、数据资产融资…

小程序复制功能不可用 setClipboardData:fail no permission

先上图 用户协议剪切板也更新但是依旧报错了 最后在公众平台通知里发现是用户之前小程序有规格被封禁了该功能

IP地址SSL证书的申请流程-五大步骤教你如何申请

网站需要申请SSL证书&#xff0c;没有域名或者不方便提供域名&#xff0c;只有IP地址也可以申请SSL证书。特别需要注意的是&#xff0c;为IP地址申请ssl证书是需要开放443或者80端口&#xff0c;一般开放几分钟用来验证IP管理权即可&#xff01; 申请IP地址的SSL证书&#xff…

13--memcache与redis

前言&#xff1a;数据库读取速度较慢一直是无法解决的问题&#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

阿里面试:canal+MQ,会有乱序的问题吗?

阿里面试&#xff1a;canalMQ&#xff0c;会有乱序的问题吗&#xff1f; 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题…

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

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

Vue组件通信props和$emit用法

父传子&#xff0c;通过props 子传父&#xff0c;通过$emit App.vue <template><div class"app" style"border: 3px solid #000; margin: 10px">我是APP组件<!-- 1.给组件标签&#xff0c;添加属性方式 赋值 --><!-- 添加属性传值 …

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

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

2024透明加密软件最新推荐丨11款好用的透明加密软件

在数字化时代&#xff0c;文件与数据安全愈发重要&#xff0c;保护信息安全刻不容缓。文件加密软件应运而生&#xff0c;成为了信息安全的重要帮手。透明加密技术凭借众多的优点备受青睐。那么&#xff0c;什么是透明加密技术呢&#xff1f; 透明加密技术是一种在不影响用户正…

旷野之间11 - 开源 SORA 已问世!训练您自己的 SORA 模型!

​​​​​ 目前最接近 SORA 的开源模型是 Latte,它采用了与 SORA 相同的 Vision Transformer 架构。Vision Transformer 究竟有何独特之处?它与之前的方法有何不同? Latte 尚未开源其文本转视频训练代码。我们复制了论文中的文本转视频训练代码,并将其提供给任何人使用,…

帕金森小伙伴必看!这些维生素让你的生活更“稳“定!

&#x1f308; 嗨&#xff0c;亲爱的小伙伴们&#xff01;今天来跟大家聊聊帕金森病患者应该补充哪些维生素的小知识&#xff0c;让我们的身体更健康&#xff0c;生活更美好哦&#xff01;&#x1f609; &#x1f34e; 维生素C 你知道吗&#xff1f;维生素C不仅能让我们的皮肤…

【Linux】内核文件系统系统调用流程摸索

内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的&#xff1a; 我们打印的pid,tgid就是从这里来的&#xff0c;然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息&#xff1a; 从上述日志&#xff0c;其实我也把write的系统调用加了入口的打印信…

ADS基础教程24 - Gerber文件的导入

EM介绍 一、引言二、基本概念1.仿真文件下载2.仿真文件介绍 二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题 四、总结 一、引言 本章节开始介绍在ADS中进行PCB仿真&#xff0c;首先讲解如何将Gerber文件导入到A…

Spark RDD优化

Spark RDD优化 一、分区优化二、持久化优化三、依赖优化四、共享变量优化五、提交模式与运行模式优化六、其他优化 一、分区优化 分区数调整&#xff1a;RDD的分区数可以通过repartition和coalesce方法进行调整。合理的分区数可以提高并行度&#xff0c;但过多的分区会增加管…

2024年Wolf沃尔夫奖数学奖得主出炉:诺加·阿隆(Noga Alon)、阿迪·萨莫尔(Adi Shamir)

沃尔夫基金会官网&#xff1a;2024年沃尔夫数学奖联合颁发给了以色列魏茨曼科学研究所的阿迪萨莫尔 &#xff08;Adi Shamir&#xff0c;1952 -&#xff09; 教授和美国普林斯顿大学的诺加阿隆&#xff08;Noga Alon&#xff0c;1963 -&#xff09; 教授&#xff0c;表彰他们对…

ADI新型充电器解决方案可实现电池堆电压和充电效率

就目前而言&#xff0c;这可能是生活中zui常见的问题了。世纪之交&#xff0c;电池&#xff08;尤其是基于锂离子的电池&#xff09;成本的降低和性能的提高&#xff0c;推动了电池供电的储能和便携式设备的稳步增长。此外&#xff0c;超级电容器由于具有独特的性质&#xff0c…

引用类飘红,但是导入失败

背景&#xff1a; 引用类飘红&#xff0c;且显示可导入&#xff0c;但是导入一直失败。 列如下图&#xff0c;引导你可以导入依赖包&#xff0c;但是你发现按了导入他是导入不了的&#xff0c;就一直失败&#xff0c;就一直飘红 解决方案&#xff1a; 我们用一下idea的清理不…

IDEA中Debug的使用

自定义功能图表 功能说明 光标回到Debug行 执行到光标所在行 Force Step into Step into 进入JDK的配置 step into做了下述配置后&#xff0c;也可以和force step into一样进入到JDK中。 Trace Current Stream Chain Reset Frame 重置方法入栈 Force Return Break Point四…

【Spring Cloud精英指南】深度探索与实战:网关Gateway的高级应用与最佳实践

1. 前言 Spring Cloud Gateway提供了一个在Spring生态系统之上构建的API网关&#xff0c;包括&#xff1a;Spring 5&#xff0c;Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的路由方式&#xff0c;并为它们提供一些网关基本功能&#xff0c;…

警惕:与ChatGPT共享业务数据可能十分危险

您已经在使用ChatGPT了吗&#xff1f;或者您正在考虑使用它来简化操作或改善客户服务&#xff1f;虽然ChatGPT提供了许多好处&#xff0c;但重要的是&#xff0c;您要意识到与ChatGPT这样的人工智能工具共享敏感业务数据相关的安全风险。下面&#xff0c;我们概述了一些关键问题…