图书管理系统5,制作第十天

1.

在Java中,BigDecimal 类提供了多种方法可以用来将其转换为 String 类型。以下是几种常见的方法:

使用 toString() 方法:
这是将 BigDecimal 转换为 String 的最直接的方法。
Java
深色版本
BigDecimal bd = new BigDecimal("123.456");
String str = bd.toString();
使用 toPlainString() 方法:
该方法返回一个不带科学记数法的字符串表示形式,它不会使用指数符号。
Java
深色版本
BigDecimal bd = new BigDecimal("123456789.123456789");
String str = bd.toPlainString();
使用 String.valueOf() 方法:
这是一个静态方法,可以直接通过类名调用,它内部会调用 toString() 方法。
Java
深色版本
BigDecimal bd = new BigDecimal("123.456");
String str = String.valueOf(bd);
使用 DecimalFormat 类进行格式化:
如果你需要对输出的字符串进行特定格式化,比如保留特定的小数位数,你可以使用 DecimalFormat 类。
Java
深色版本
import java.text.DecimalFormat;

BigDecimal bd = new BigDecimal("123.456");
DecimalFormat df = new DecimalFormat("#.###");
String str = df.format(bd);
使用 stripTrailingZeros() 方法:
如果你想要移除小数点后不必要的零,可以先调用 stripTrailingZeros() 方法然后再转换成字符串。
Java
深色版本
BigDecimal bd = new BigDecimal("123.45600");
String str = bd.stripTrailingZeros().toPlainString();
每种方法都有其特点和适用场景,请根据实际需求选择合适的方法。如果你只是简单地需要一个 BigDecimal 对象的字符串表示,通常 toString() 或 toPlainString() 就足够了。如果你需要控制数字的格式,则可能需要使用 DecimalFormat。

2.

SELECT b.id AS book_id, b.book_name, b.book_author, b.book_price, b.book_amount, bt.type_name FROM t_books b JOIN t_book_types bt ON b.book_type = bt.id WHERE bt.type_name = ?;[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 13

看起来你在尝试使用参数化查询时遇到了 SQL 语法错误。这个错误通常是由于 SQL 语句在发送到数据库之前没有正确地处理参数占位符(?)。如果你直接将带有 ? 的 SQL 语句打印出来并尝试执行,它会失败,因为 ? 不是有效的 SQL 语法。

然而,在 Java 中使用 PreparedStatement 时,? 是合法的,并且是用来表示参数占位符的。问题更可能出现在其他地方,比如 SQL 语句的格式或者执行方式。

确认 SQL 语句和执行方式

确保你是在通过 PreparedStatement 设置参数后执行查询,而不是直接尝试运行包含 ? 的 SQL 语句。以下是如何正确使用 PreparedStatement 来执行参数化查询的示例:

 

Java

深色版本

public List<Book> getBooksByTypeName(String typeName) {
    String sql = "SELECT "
               + "b.id AS book_id, "
               + "b.book_name, "
               + "b.book_author, "
               + "b.book_price, "
               + "b.book_amount, "
               + "bt.type_name "
               + "FROM t_books b "
               + "JOIN t_book_types bt ON b.book_type = bt.id "
               + "WHERE bt.type_name = ?";

    List<Book> books = new ArrayList<>();

    try (Connection conn = getConnection();
         PreparedStatement pstmt = conn.prepareStatement(sql)) {

        // 设置查询参数
        pstmt.setString(1, typeName);

        // 执行查询
        try (ResultSet rs = pstmt.executeQuery()) {
            while (rs.next()) {
                Book book = new Book();
                book.setId(rs.getLong("book_id"));
                book.setBookName(rs.getString("book_name"));
                book.setBookAuthor(rs.getString("book_author"));
                book.setBookPrice(rs.getBigDecimal("book_price"));
                book.setBookAmount(rs.getInt("book_amount"));
                book.setTypeName(rs.getString("type_name"));

                books.add(book);
            }
        }

    } catch (SQLException e) {
        e.printStackTrace();
        throw new RuntimeException("Database error occurred while fetching books by type name.", e);
    }

    return books;
}

检查 SQL 语句格式

另外,请确认你的 SQL 语句格式正确,特别是末尾是否有不必要的空格或符号。SQL 语句中的每一部分应该紧密相连,避免多余的空格或换行导致的问题。上面提供的代码中,SQL 语句构建是正确的。

调试建议

  • 打印最终 SQL:虽然不能直接打印带有 ? 的 SQL 语句并执行,但在调试时可以打印出 SQL 语句和参数值,以确保它们是你期望的样子。

  • 检查连接和事务:确保数据库连接有效,并且如果需要的话,管理好事务。

  • 验证表结构和字段名:确认 t_bookst_book_types 表的结构以及字段名是否准确无误。

示例输出调试信息

为了帮助调试,可以在设置参数之后打印出完整的 SQL 语句(用实际参数替换 ?),但这仅用于调试目的,不应在生产环境中这样做:

 

Java

深色版本

System.out.println("Executing query: " + sql.replace("?", "'" + typeName + "'"));

这可以帮助你看到生成的 SQL 语句是什么样子的,并检查是否有任何明显的语法错误。

总结

只要你确保使用 PreparedStatement 正确设置了参数,并且 SQL 语句格式正确,那么你应该能够成功地根据图书类型名称查询所有该类型的图书。如果仍然遇到问题,请检查数据库日志或使用数据库客户端工具来测试生成的 SQL 语句,以进一步诊断问题。

代码模式

/** * 根据图书类型名称查询所有该类型的图书 * @param typeName 图书类型名称 * @return 包含该类型的所有图书列表 */ public List<Book> getBooksByTypeName(String typeName) { String sql = "select" + "b.id AS book_id," + "b.book_name," + "b.book_author," + "b.book_price," + "b.book_amount," + "bt.type_name" + "from t_books b " + "JOIN t_book_types bt ON b.book_type = bt.id" + "WHERE bt.type_name=?"; List<Book> books = new ArrayList<>(); // 创建集合 try(Connection conn = getConnection(); // 获取连接对象 PreparedStatement pstmt = conn.prepareStatement(sql)){ // 设置查询参数 pstmt.setString(1,typeName); // 执行查询 try(ResultSet rs = pstmt.executeQuery()){ while(rs.next()){ // 映射结果到 Book 对象 Book book = new Book(); book.setId(rs.getLong("book_id")); book.setBookName(rs.getString("book_name")); book.setBookAuthor(rs.getString("book_author")); book.setBookPrice(rs.getBigDecimal("book_price")); book.setBookAmount(rs.getInt("book_amount")); books.add(book); // 添加到集合 } } } catch (SQLException e) { e.printStackTrace(); // 打印异常信息 throw new RuntimeException("Database error occurred while fetching books by type name.", e); } return books; }改为模糊查询,每行都要有注释

为了将查询改为模糊查询,你需要修改 SQL 语句中的 WHERE 子句,使用 LIKE 操作符来匹配图书类型名称的一部分,而不是完全匹配。此外,你还需要在参数值的两边添加 % 符号,以实现前缀、后缀或包含的模糊匹配。

以下是根据你的要求修改后的代码,每行都附有注释:

 

Java

深色版本

/**
 * 根据图书类型名称进行模糊查询所有该类型的图书
 * @param typeName 图书类型名称的一部分
 * @return 包含该类型的所有图书列表
 */
public List<Book> getBooksByTypeName(String typeName) {

    // 构建SQL查询语句,使用 LIKE 进行模糊匹配
    String sql = "SELECT " + // 开始构建SQL语句
                 "b.id AS book_id, " + // 选择图书ID,并重命名为book_id
                 "b.book_name, " + // 选择图书名称
                 "b.book_author, " + // 选择图书作者
                 "b.book_price, " + // 选择图书价格
                 "b.book_amount, " + // 选择图书数量
                 "bt.type_name " + // 选择图书类型名称
                 "FROM t_books b " + // 从t_books表中选择数据
                 "JOIN t_book_types bt ON b.book_type = bt.id " + // 将t_books表与t_book_types表连接,基于book_type字段
                 "WHERE bt.type_name LIKE ?"; // 条件:图书类型名称部分匹配给定的typeName

    List<Book> books = new ArrayList<>(); // 创建一个空的图书列表用于存储结果

    try (Connection conn = getConnection(); // 获取数据库连接
         PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建PreparedStatement对象,准备执行带有参数的SQL语句

        // 设置查询参数,为typeName添加通配符%,以支持模糊匹配
        pstmt.setString(1, "%" + typeName + "%");

        // 执行查询并获取结果集
        try (ResultSet rs = pstmt.executeQuery()) {
            // 遍历结果集中的每一行
            while (rs.next()) {
                // 创建一个新的Book对象,并设置其属性值
                Book book = new Book();
                book.setId(rs.getLong("book_id")); // 设置图书ID
                book.setBookName(rs.getString("book_name")); // 设置图书名称
                book.setBookAuthor(rs.getString("book_author")); // 设置图书作者
                book.setBookPrice(rs.getBigDecimal("book_price")); // 设置图书价格
                book.setBookAmount(rs.getInt("book_amount")); // 设置图书数量

                // 将新创建的Book对象添加到图书列表中
                books.add(book);
            }
        }

    } catch (SQLException e) {
        // 捕获SQLException异常,打印堆栈跟踪信息
        e.printStackTrace();
        // 抛出自定义运行时异常,提供更具体的错误信息
        throw new RuntimeException("Database error occurred while fetching books by type name.", e);
    }

    // 返回包含查询结果的图书列表
    return books;
}

关键点解释

  • LIKE 操作符:用于模糊匹配字符串,允许你在搜索条件中使用通配符(如 %)。

  • % 通配符:放在参数值的两端,表示可以匹配任何数量的字符(包括零个字符),从而实现部分匹配。

  • try-with-resources:确保资源(如 ConnectionPreparedStatement)在使用完毕后自动关闭,避免资源泄露。

  • ResultSet 处理:遍历结果集并将每一行的数据映射到 Book 对象中,最后将这些对象添加到列表中返回。

通过这种方式,你可以根据图书类型名称的部分内容进行模糊查询,并获得所有符合条件的图书记录。

3.

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

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

相关文章

机器视觉检测相机基础知识 | 颜色 | 光源 | 镜头 | 分辨率 / 精度 / 公差

注&#xff1a;本文为 “keyence 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识&#xff08;一&#xff09;颜色篇 视觉检测硬件构成的基本部分包括&#xff1a;处理器、相机、镜头、光源。 其中&#xff0c;和光源相关的最重要的两个参数就是光源颜色和…

Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件&#xff0c;”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件” 在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c…

批量提取zotero的论文构建知识库做问答的大模型(可选)——含转存PDF-分割统计PDF等

文章目录 提取zotero的PDF上传到AI平台保留文件名代码分成20个PDF视频讲解 提取zotero的PDF 右键查看目录 发现目录为 C:\Users\89735\Zotero\storage 写代码: 扫描路径‘C:\Users\89735\Zotero\storage’下面的所有PDF文件,全部复制一份汇总到"C:\Users\89735\Downl…

解决:websocket 1002 connection rejected 426upgrade required

这是问题是websocket客户端访问websocket服务端时候报的错&#xff0c;并非代码错误&#xff0c;需要配置一下k8s的路由策略 新增两行

Flutter组件————Container

Container Container 是 Flutter 中最常用的布局组件之一 参数 参数名称类型描述alignmentAlignmentGeometry定义子组件在其内部的对齐方式&#xff0c;默认为 null&#xff0c;即不改变子组件的位置。paddingEdgeInsetsGeometry内边距&#xff0c;用于在子组件周围添加空间…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation&#xff1f;基本结构after 参数的作用问题背景&#xff1a;传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

MySQL 8.0:explain analyze 分析 SQL 执行过程

介绍 MySQL 8.0.16 引入一个实验特性&#xff1a;explain formattree &#xff0c;树状的输出执行过程&#xff0c;以及预估成本和预估返 回行数。在 MySQL 8.0.18 又引入了 EXPLAIN ANALYZE&#xff0c;在 formattree 基础上&#xff0c;使用时&#xff0c;会执行 SQL &#…

【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567

本文涉及知识点 打开打包代码的方法兼述单元测试 C动态规划 C图论 LeetCode3243. 新增道路查询后的最短距离 I 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#…

120页PPT讲解ChatGPT如何与财务数字化转型的业财融合

此方案主要聚焦于利用ChatGPT技术与数字化转型推动业财融合&#xff0c;实现企业的价值最大化。首先&#xff0c;通过ChatGPT技术&#xff0c;企业可以构建生成式对话机器人&#xff0c;自动回答常见问题&#xff0c;减轻人工客服的压力&#xff0c;提高响应速度。这种机器人具…

旋转框目标检测自定义数据集训练测试流程

文章目录 前言一、数据集制作二、模型训练2.1 划分训练集验证集:2.2 配置yaml文件:2.3 训练 前言 旋转框目标检测&#xff08;Rotated bounding box object detection&#xff09;是计算机视觉领域的一项技术&#xff0c;它用于检测图像中具有任意方向的目标。与传统的水平矩形…

【QSS样式表 - ⑥】:QPushButton控件样式

文章目录 QPushBUtton控件样式QSS示例 QPushBUtton控件样式 常用子控件 常用伪状态 QSS示例 代码&#xff1a; QPushButton {background-color: #99B5D1;color: white;font-weigth: bold;border-radius: 20px; }QPushButton:hover {background-color: red; }QPushButton:p…

C# Random 随机数 全面解析

总目录 前言 一、Random 是什么&#xff1f; 1. 简介 表示伪随机数生成器&#xff0c;这是一种能够产生满足某些随机性统计要求的数字序列的算法。 public class Random继承&#xff1a;Object → Random 2. 构造函数 3. 属性 4. 方法 二、Random 的使用 1. Next() 或 Nex…

Linux网络——UDP的运用

Linux网络——UDP的运用 文章目录 Linux网络——UDP的运用一、引入二、服务端实现2.1 创建socket套接字2.2 绑定bind2.3 启动服务器2.4 IP的绑定的细节2.5 读取数据recvfrom 三、用户端实现3.1 绑定问题3.2 发送数据sendto 四、代码五、UDP实现网络聊天室&#xff08;简易版&am…

IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理

在使用IDEA的过程中&#xff0c;使用快捷键Alt Enter在接收返回值时&#xff0c;可以快速完成参数接收&#xff0c;但前面一直会出现接收参数前面有final修饰的情况&#xff0c;效果如下所示&#xff1a; 看着真烦人呢&#xff0c;我们会发现在接受到返回值是上方有个 Declare…

【小白51单片机专用教程】protues仿真AT89C51入门

课程特点 无需开发板0基础教学软件硬件双修辅助入门 本课程面对纯小白&#xff0c;因此会对各个新出现的知识点在实例基础上进行详细讲解&#xff0c;有相关知识的可以直接跳过。课程涉及protues基本操作、原理图设计、数电模电、kell使用、C语言基本内容&#xff0c;所有涉及…

软件设计与体系结构

1.简要说明什么是软件体系结构&#xff0c;软件体系结构模型&#xff0c;为什么要建立软件体系结构模型&#xff1f; 答&#xff1a;软件体系结构指一个软件系统在高层次上的结构化组织方式&#xff0c;包括系统的组成部分和各个部分之间的关系&#xff0c;以及它们与环境之间的…

位置式PID-控制步进电机-位置环-stm32

基本原理 1、软件设计 本闭环控制例程是在步进电机编码器测速例程的基础上编写的,这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。 我们创建了4个文件:bsp_pid.c和bsp_pid.h文件用来存放PID控制器相关程序,bsp_s…

汽车IVI中控开发入门及进阶(47):CarPlay开发

概述: 车载信息娱乐(IVI)系统已经从仅仅播放音乐的设备发展成为现代车辆的核心部件。除了播放音乐,IVI系统还为驾驶员提供导航、通信、空调、电源配置、油耗性能、剩余行驶里程、节能建议和许多其他功能。 ​ 驾驶座逐渐变成了你家和工作场所之外的额外生活空间。2014年,…

电力通信规约-104实战

电力通信规约-104实战 概述 104规约在广泛应用于电力系统远动过程中&#xff0c;主要用来进行数据传输和转发&#xff0c;本文将结合实际开发实例来讲解104规约的真实使用情况。 实例讲解 因为个人技术栈是Java&#xff0c;所以本篇将采用Java实例来进行讲解。首先我们搭建一…

AWS Transfer 系列:简化文件传输与管理的云服务

在数字化转型的今天&#xff0c;企业对文件传输、存储和管理的需求日益增长。尤其是对于需要大量数据交换的行业&#xff0c;如何高效、可靠地传输数据成为了一大挑战。为了解决这一难题&#xff0c;AWS 提供了一系列的文件传输服务&#xff0c;统称为 AWS Transfer 系列。这些…