Java代码示例:用于从数据库中查询图书信息

简介: 本示例展示Java连接MySQL查询图书信息的完整流程,包含数据库连接、PreparedStatement执行查询、结果集处理及资源释放。通过Book实体类封装数据,实现查询所有图书和按状态筛选功能,代码安全规范,适合初学者学习JDBC操作。

以下是一个简单的Java代码示例,用于从MySQL数据库中查询图书信息。这个示例包含数据库连接、查询操作和结果处理的完整流程:

前提条件

  1. 已创建MySQL数据库(例如库名:library
  2. 已创建图书表(books),表结构参考:
    CREATE TABLE books (
        id INT PRIMARY KEY AUTO_INCREMENT,
        title VARCHAR(100) NOT NULL,  -- 书名
        author VARCHAR(50) NOT NULL, -- 作者
        isbn VARCHAR(20) UNIQUE,     -- ISBN号
        status INT DEFAULT 1         -- 状态:1-可借阅,0-已借出
    );
    
  3. 已添加MySQL驱动依赖(Maven项目可在pom.xml中添加):
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.30</version>
    </dependency>
    

代码实现

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

// 图书实体类(对应数据库表结构)
class Book {
   
    private int id;
    private String title;
    private String author;
    private String isbn;
    private int status;

    // 构造方法
    public Book(int id, String title, String author, String isbn, int status) {
   
        this.id = id;
        this.title = title;
        this.author = author;
        this.isbn = isbn;
        this.status = status;
    }

    //  toString方法(用于打印图书信息)
    @Override
    public String toString() {
   
        return "ID: " + id + 
               ", 书名: " + title + 
               ", 作者: " + author + 
               ", ISBN: " + isbn + 
               ", 状态: " + (status == 1 ? "可借阅" : "已借出");
    }
}

// 图书查询工具类
public class BookQueryExample {
   
    // 数据库连接信息(请替换为你的实际配置)
    private static final String DB_URL = "jdbc:mysql://localhost:3306/library?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";       // 数据库用户名
    private static final String PASSWORD = "123456"; // 数据库密码

    public static void main(String[] args) {
   
        // 查询所有图书
        List<Book> allBooks = queryAllBooks();
        System.out.println("=== 所有图书信息 ===");
        for (Book book : allBooks) {
   
            System.out.println(book);
        }

        // 按条件查询(例如查询可借阅的图书)
        List<Book> availableBooks = queryBooksByStatus(1);
        System.out.println("\n=== 可借阅图书 ===");
        for (Book book : availableBooks) {
   
            System.out.println(book);
        }
    }

    /**
     * 查询所有图书
     */
    public static List<Book> queryAllBooks() {
   
        List<Book> books = new ArrayList<>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
   
            // 1. 加载数据库驱动(MySQL 8.0+ 无需显式加载,可省略)
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 获取数据库连接
            conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);

            // 3. 编写SQL语句
            String sql = "SELECT id, title, author, isbn, status FROM books";

            // 4. 创建PreparedStatement(预编译SQL,防止SQL注入)
            pstmt = conn.prepareStatement(sql);

            // 5. 执行查询,获取结果集
            rs = pstmt.executeQuery();

            // 6. 处理结果集
            while (rs.next()) {
   
                int id = rs.getInt("id");
                String title = rs.getString("title");
                String author = rs.getString("author");
                String isbn = rs.getString("isbn");
                int status = rs.getInt("status");

                // 将查询结果封装为Book对象
                books.add(new Book(id, title, author, isbn, status));
            }

        } catch (ClassNotFoundException e) {
   
            System.out.println("数据库驱动加载失败:" + e.getMessage());
        } catch (SQLException e) {
   
            System.out.println("数据库操作失败:" + e.getMessage());
        } finally {
   
            // 7. 关闭资源(顺序:ResultSet -> PreparedStatement -> Connection)
            try {
   
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
   
                System.out.println("资源关闭失败:" + e.getMessage());
            }
        }

        return books;
    }

    /**
     * 按状态查询图书(1-可借阅,0-已借出)
     */
    public static List<Book> queryBooksByStatus(int status) {
   
        List<Book> books = new ArrayList<>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
   
            conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
            String sql = "SELECT id, title, author, isbn, status FROM books WHERE status = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, status); // 设置SQL中的参数(?占位符)
            rs = pstmt.executeQuery();

            while (rs.next()) {
   
                books.add(new Book(
                        rs.getInt("id"),
                        rs.getString("title"),
                        rs.getString("author"),
                        rs.getString("isbn"),
                        rs.getInt("status")
                ));
            }

        } catch (SQLException e) {
   
            System.out.println("查询失败:" + e.getMessage());
        } finally {
   
            // 关闭资源(同上)
            try {
   
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
   
                e.printStackTrace();
            }
        }

        return books;
    }
}

代码详解

  1. 实体类(Book)
    对应数据库中的books表,属性与表字段一一对应,toString()方法用于格式化输出图书信息。

  2. 数据库连接
    通过DriverManager.getConnection()获取连接,需要替换DB_URLUSERPASSWORD为你的数据库实际配置。

  3. 查询操作

    • 使用PreparedStatement预编译SQL,避免SQL注入风险。
    • executeQuery()执行查询并返回ResultSet结果集。
    • 遍历结果集,将每条记录封装为Book对象,存入集合中。
  4. 资源关闭
    finally块中关闭ResultSetPreparedStatementConnection,确保资源释放,避免内存泄漏。

  5. 两种查询示例

    • queryAllBooks():查询所有图书。
    • queryBooksByStatus():按状态查询(演示带参数的查询)。

运行说明

  1. 确保数据库和表已创建,并插入测试数据(例如):
    INSERT INTO books (title, author, isbn, status) VALUES
    ('Java编程思想', 'Bruce Eckel', '9787111213826', 1),
    ('深入理解Java虚拟机', '周志明', '9787111641247', 0);
    
  2. 替换代码中的数据库连接信息(用户名、密码等)。
  3. 运行main方法,即可看到控制台输出查询结果。
相关文章
|
1月前
|
安全 Java 数据库连接
如何在Java代码中处理数据库连接异常
在Java中,合理处理数据库连接异常对程序稳定性至关重要。需捕获`ClassNotFoundException`和`SQLException`等具体异常,使用`try-with-resources`自动释放资源,结合日志记录与用户友好提示,并可引入重试机制应对网络波动,提升系统容错能力。
199 1
|
22天前
|
文字识别 安全 程序员
PowerToys微软官方效率工具实操教程!Windows系统增强神器!
PowerToys是微软官方推出的免费开源工具集,集成20余款高效插件,如窗口管理、快速启动、批量重命名、OCR文字提取等,显著提升Windows使用体验,支持多屏协作、快捷操作,安全稳定,持续更新,适合各类用户优化工作效率。
184 6
|
2月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
226 1
SpringBoot之文件上传(单文件与多文件上传的使用)
SpringBoot之文件上传(单文件与多文件上传的使用)
292 1
|
应用服务中间件 nginx
【已解决】nginx 502 Bad Gateway 问题排查
nginx 502 Bad Gateway 问题排查
15845 0
【已解决】nginx 502 Bad Gateway 问题排查
|
1月前
|
安全 Java Linux
Java 获取音频文件的持续时间(毫秒级)——摆脱 FFprobe 的纯本地方案(无外部依赖 / 低开销 / 可直接部署)
本文介绍如何在Java中不依赖FFmpeg,通过标准库`javax.sound.sampled`解析WAV、AIFF等音频文件头信息,直接计算毫秒级时长。方案无外部依赖、跨平台、低开销,适合高并发与安全敏感场景,显著优于调用FFprobe的进程方式,是轻量可控的优选方案。
|
2月前
|
缓存 安全 Java
如何在Java中实现多线程编程
Java多线程编程有三种主要方式:继承Thread类、实现Runnable接口、实现Callable接口(结合Future获取结果),推荐使用Runnable避免单继承限制。通过线程池(如ExecutorService)可高效管理线程,提升性能。多线程共享资源时需注意线程安全,使用synchronized或Lock机制保证数据一致性。适用于并发执行、异步计算等场景。
209 1
|
2月前
|
监控 算法 固态存储
Ashampoo UnInstaller使用教程!高效彻底的软件卸载助手(附下载)
Ashampoo UnInstaller 可彻底卸载软件并清理残留文件、注册表等,提升系统速度与稳定性。支持批量卸载、程序迁移、安装保护及实时监控,操作简单,是优化电脑性能的高效工具。
254 1
|
1月前
|
存储 关系型数据库 MySQL
五、Docker 核心技术:容器数据持久化之数据卷
别把重要数据直接放进Docker容器里,因为容器就像一辆“临租车”,车一还(容器被删除),落在里面的东西就全没了。正确的做法是使用数据卷 (Volume),它好比一个属于你自己的、可插拔的“移动硬盘”。你可以把这个“硬盘”(具名数据卷)挂载到任何一辆“临租车”(容器)上使用。这样一来,就算车换了,你的数据也安然无恙,完美解决了数据库等应用的数据持久化问题。
222 32
五、Docker 核心技术:容器数据持久化之数据卷
|
1月前
|
存储 人工智能 JSON
构建AI智能体:十九、优化 RAG 检索精度:深入解析 RAG 中的五种高级切片策略
本文详细介绍了RAG(检索增强生成)系统中的文本切片策略。RAG切片是将长文档分割为语义完整的小块,以便AI模型高效检索和使用知识。文章分析了五种切片方法:改进固定长度切片(平衡效率与语义)、语义切片(基于嵌入相似度)、LLM语义切片(利用大模型智能分割)、层次切片(多粒度结构)和滑动窗口切片(高重叠上下文)。作者建议根据文档类型和需求选择策略,如通用文档用固定切片,长文档用层次切片,高精度场景用语义切片。切片质量直接影响RAG系统的检索效果和生成答案的准确性。
394 11

热门文章

最新文章