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方法,即可看到控制台输出查询结果。
相关文章
|
6月前
|
安全 Java 数据库连接
如何在Java代码中处理数据库连接异常
在Java中,合理处理数据库连接异常对程序稳定性至关重要。需捕获`ClassNotFoundException`和`SQLException`等具体异常,使用`try-with-resources`自动释放资源,结合日志记录与用户友好提示,并可引入重试机制应对网络波动,提升系统容错能力。
375 1
SpringBoot之文件上传(单文件与多文件上传的使用)
SpringBoot之文件上传(单文件与多文件上传的使用)
519 1
|
7月前
|
Java
Java基础知识总结(超详细整理)
本文系统总结Java基础知识,涵盖语法、面向对象(类与对象、封装、继承、多态)、常用类(String、包装类、集合框架)及异常处理等核心内容,结合代码示例深入浅出,助你扎实掌握Java编程基础。
563 1
|
Java Maven
IDEA + maven 零基础构建 java agent 项目
Java Agent(java 探针)虽说在 jdk1.5 之后就有了,但是对于绝大多数的业务开发 javaer 来说,这个东西还是比较神奇和陌生的;虽说在实际的业务开发中,很少会涉及到 agent 开发,但是每个 java 开发都用过,比如使用 idea 写了个 HelloWorld.java,并运行一下, 仔细看控制台输出
1349 0
IDEA + maven 零基础构建 java agent 项目
|
7月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
625 0
|
6月前
|
Java 数据库 微服务
Java 学习路线可按「基础→进阶→实战→架构」四阶段推进
Java学习路线分四阶段:基础→进阶→实战→架构。涵盖语法、多线程、框架、微服务等核心内容,搭配项目实战与学习技巧,助你系统掌握Java开发技能,逐步成长为高级工程师。(238字)
674 4
|
6月前
|
存储 Java 数据安全/隐私保护
Java 入门核心知识点分类学习
Java入门按五大模块系统学习:基础语法、面向对象、常用工具类、异常处理、集合框架。结合代码示例,涵盖变量、流程控制、封装继承多态、String/Math类、try-catch、ArrayList/HashMap等核心知识点,助你快速掌握Java基础。
494 2
|
6月前
|
IDE Java Linux
Java基础阶段的常见错误和解决方案的文章
本文精选Java基础常见错误与解决方案的优质文章,涵盖环境配置、语法基础、面向对象、异常处理、集合IO等核心知识点,结合典型错误代码与原理分析,助力新手避坑提效,适合系统学习与实战参考。
255 0
|
6月前
|
Java
java初学者知识点
Java初学者需聚焦基础语法、面向对象、核心类库与编程思维。掌握数据类型、流程控制、类与对象、封装继承多态、String、集合、异常处理等核心内容,构建扎实入门框架,为进阶打下坚实基础。(238字)
322 2
|
缓存 Linux
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
4097 1
【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像

热门文章

最新文章