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方法,即可看到控制台输出查询结果。
相关文章
|
3月前
|
安全 Java 数据库连接
如何在Java代码中处理数据库连接异常
在Java中,合理处理数据库连接异常对程序稳定性至关重要。需捕获`ClassNotFoundException`和`SQLException`等具体异常,使用`try-with-resources`自动释放资源,结合日志记录与用户友好提示,并可引入重试机制应对网络波动,提升系统容错能力。
282 1
|
3月前
|
SQL 人工智能 API
LangChain 不只是“拼模型”:教你从零构建可编程的 AI 工作流
LangChain 不只是“拼模型”:教你从零构建可编程的 AI 工作流
367 8
|
3月前
|
存储 关系型数据库 MySQL
五、Docker 核心技术:容器数据持久化之数据卷
别把重要数据直接放进Docker容器里,因为容器就像一辆“临租车”,车一还(容器被删除),落在里面的东西就全没了。正确的做法是使用数据卷 (Volume),它好比一个属于你自己的、可插拔的“移动硬盘”。你可以把这个“硬盘”(具名数据卷)挂载到任何一辆“临租车”(容器)上使用。这样一来,就算车换了,你的数据也安然无恙,完美解决了数据库等应用的数据持久化问题。
429 32
五、Docker 核心技术:容器数据持久化之数据卷
|
3月前
|
Java 开发者
Java高级技术深度解析:性能优化与架构设计
本文深入解析Java高级技术,涵盖JVM性能调优、并发编程、内存模型与架构设计。从G1/ZGC垃圾回收到CompletableFuture异步处理,剖析底层机制与实战优化策略,助力构建高性能、高可用的Java系统。
279 47
|
3月前
|
安全 C++ Windows
使用教程!Geek UninstallerV1.5.3.170 深度卸载神器完全使用指南!彻底告别软件残留
Geek Uninstaller是一款免费、轻量级的深度卸载工具,能彻底清除软件残留文件和注册表项,解决系统卡慢、空间占用等问题。支持普通卸载、强制卸载及Windows预装应用清理,操作简单,无需安装,一键释放硬盘空间,提升系统性能。
811 8
|
3月前
|
存储 人工智能 JSON
构建AI智能体:十九、优化 RAG 检索精度:深入解析 RAG 中的五种高级切片策略
本文详细介绍了RAG(检索增强生成)系统中的文本切片策略。RAG切片是将长文档分割为语义完整的小块,以便AI模型高效检索和使用知识。文章分析了五种切片方法:改进固定长度切片(平衡效率与语义)、语义切片(基于嵌入相似度)、LLM语义切片(利用大模型智能分割)、层次切片(多粒度结构)和滑动窗口切片(高重叠上下文)。作者建议根据文档类型和需求选择策略,如通用文档用固定切片,长文档用层次切片,高精度场景用语义切片。切片质量直接影响RAG系统的检索效果和生成答案的准确性。
822 11
|
3月前
|
机器学习/深度学习 人工智能 算法
面向 AI 工作负载的 Java:从数值计算到模型服务化
本文探讨Java在AI工作负载中的应用,涵盖数值计算、深度学习、模型服务化及性能优化,展示如何利用DeepLearning4J、ND4J与Spring Boot构建高效、可扩展的AI系统,推动Java在人工智能领域的落地实践。
295 7
|
3月前
|
Java
java初学者知识点
Java初学者需聚焦基础语法、面向对象、核心类库与编程思维。掌握数据类型、流程控制、类与对象、封装继承多态、String、集合、异常处理等核心内容,构建扎实入门框架,为进阶打下坚实基础。(238字)
229 2
|
3月前
|
应用服务中间件 Shell nginx
七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)
容器不仅仅是孤立的运行环境,它们需要相互通信,也需要与外部世界进行交互。理解 Docker 的不同网络模式,是构建和部署复杂多容器应用的关键。本节将深入探讨 Docker 原生提供的四种网络模式以及强烈推荐使用的自定义网络。要让它们通信,需要将其中一个容器也连接到另一个网络上。默认 bridge 网络不支持容器名DNS解析,只能通过IP地址通信。容器没有自己的独立IP地址,它共享宿主机的IP。网络模式启动一个容器后,如何查看该容器的IP地址?时,该容器默认会连接到哪个网络?模式运行,并且其内部的应用监听。
658 4
|
3月前
|
缓存 Java Maven
六、Docker 核心技术:Dockerfile 指令详解
想亲手给你的应用程序打造一个专属的“集装箱”吗?Dockerfile就是你的说明书!它其实就是一个简单的文本文件,你可以在里面像搭积木一样,用FROM、COPY、RUN这些指令,一步步告诉Docker如何打包你的应用。最后,通过多阶段构建的小技巧,还能给镜像“减肥”,让它变得轻巧又高效。快来学习用Dockerfile变身打包达人吧!
430 4

热门文章

最新文章