JAVA(idea)连接mysql数据库知识整合2(JDBC)


前言

本文主要介绍了JDBC连接与关闭模板的实现,作为上节内容的补充。其次介绍数据库中两个新的字段,CLOB(Character Large Object)是数据库中用来存储大规模字符数据的字段类型。BLOB(Binary Large Object) 是一种在数据库中存储大规模二进制数据的类型,常用于存储图像、视频、音频以及其他二进制文件。下面我们来具体认识一下。


一、导入JDBC通用工具类

       上节我们实现了JDBC连接数据库基本的增删改查,但是对于增删改查,每一个方法里面都注册了一下驱动,并实现对数据库的连接和关闭,但是每次都这样做显得比较繁琐而且开销也大,这里我们可以通过将其提取到一个单独的方法来减少代码重复,并提高可维护性(通过自动关闭的语法避免了我们手动关闭可能产生的错误,即这里关闭不需要我们考虑它是否是空)。

package jdbc;

import java.sql.*;

public class JdbcUtils {
    static String url = "jdbc:mysql://localhost:3306/library1?useSSL=false&serverTimezone=UTC" +
            "&useUnicode=true&characterEncoding=UTF-8";
    static String user = "root";  // 数据库用户名
    static String password = "123456";  // 数据库密码

    static {
        // 注册驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 获得数据库连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    // 注意:
// 这里不需要显式地调用 close() 方法,try-with-resources 会在退出时自动调用这些资源的 close() 方法。
// 如果传入的资源对象为 null,try-with-resources 不会抛出异常,而是会跳过该资源的关闭操作。
// 这种方式的好处是代码简洁且能够自动管理资源的关闭,避免手动关闭时可能出现的遗漏或重复关闭的问题。
    public static void close(Connection conn, Statement st, ResultSet rs) {
        // 通过 try-with-resources,自动关闭所有资源
        try (
                ResultSet ignored = rs;
                Statement ignored1 = st;
                Connection ignored2 = conn
        ) {
            // 这里不需要做任何操作,try-with-resources 会自动关闭资源
        } catch (SQLException e) {
            e.printStackTrace();  // 处理 SQL 异常
        }
    }
}

二、JDBC其它常见API的介绍

CLOB:存储的是字符数据以及BLOB 存储二进制数据:

1)常见的 CLOB 用途:
1文档存储:
       用于存储如电子书、合同、手册等文档内容,适合存储大量的文本信息。
2日志记录:
       在系统日志、审计日志中,往往会记录大量的文本信息,这时可以使用 CLOB 类型来存储。
3配置文件:
       大型应用系统可能会将配置信息存储为文本格式的文件,这些文件也可以存储在数据库的 CLOB 字段中。
4XML 和 JSON 数据:
       用于存储 XML 或 JSON 格式的数据,特别是在不需要频繁解析时,可以将整个 XML/JSON 文本存储在 CLOB 字段中。
2)常见的BLOB 的用途
1存储图片、视频、音频:
       如果需要在数据库中存储如图片、视频或音频文件等二进制数据,BLOB 是一个常见的选择。通过将文件转换为字节流,并将其存储在数据库的 BLOB 字段中,可以轻松地管理和检索这些二进制数据。
2存储文档或其他大文件:
       除了多媒体文件外,BLOB 也适用于存储文档(例如 PDF 文件、Word 文档等)。这些文件通常是二进制格式,因此可以存储为 BLOB 类型。
3存储加密数据:
       在某些应用中,BLOB 也可以用来存储加密后的敏感数据,确保数据的安全性。
4实现数据库内的文件管理:
       通过将文件存储在数据库中而非文件系统中,BLOB 可以帮助将应用程序的文件管理功能集中化,避免文件丢失或文件路径错误的风险。
下面我们通过代码来进一步认识clob以及blob的使用。

①创建一张空表

CREATE TABLE information (
    id INT AUTO_INCREMENT PRIMARY KEY,   -- id 字段为自动递增的主键
    name VARCHAR(255) NOT NULL,           -- name 字段为非空的字符串(最大255个字符)
    date DATE NOT NULL,                   -- date 字段为日期类型,存储日期(YYYY-MM-DD 格式)
    text TEXT,                            -- text 字段为 TEXT 类型,用于存储长文本数据(即clob)
    longbimg LONGBLOB                     -- longbimg 字段为 LONGTEXT 类型,用于存储长二进制数据(如大图像等)
);

②编写我们的idea代码,使用CLOB以及BLOB

package jdbc;

import java.io.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TextBlob {
    public static void main(String[] args) throws SQLException, IOException {
        insertBlob();
        seleteText();
    }

    static void insertBlob() throws SQLException, IOException {
        String sql = "insert into information(name, date, text, longbimg)values(?,?,?,?)";
        Connection conn = JdbcUtils.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
        // 设置 name 字段
        ps.setObject(1, "清明上河图");
        // 设置 date 字段
        ps.setDate(2, java.sql.Date.valueOf("2024-12-22"));
        // 设置 text 字段(长文本数据)

        String s;
        StringBuilder context = new StringBuilder();
        BufferedReader br = new BufferedReader(
                new FileReader("D:\\桌面\\a.md"));
        while ((s = br.readLine()) != null) {
            context.append(s);
        }
        // 插入普通文本
        ps.setString(3, context.toString());
        // 插入图片
        ps.setBinaryStream(4, new FileInputStream("D:\\桌面\\清明上河图.png"));
        ps.executeUpdate();
        JdbcUtils.close(conn, ps, null);
        System.out.println("成功插入一条数据");
    }

    static void seleteText() throws SQLException, IOException {
        String sql = "select *from information where id=?";
        Connection conn = JdbcUtils.getConnection();
        PreparedStatement ps = conn.prepareStatement(sql);
        ps.setObject(1, 1);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            System.out.println("ID: " + rs.getInt("id"));
            System.out.println("Name: " + rs.getString("name"));
            System.out.println("Date: " + rs.getDate("date"));
            // 获取长文本字段
            String text = rs.getString("text");
            // 设置每行最大字符数
            int maxLineLength = 100;
            // 输出长文本并分行
            if (text != null && !text.isEmpty()) {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < text.length(); i++) {
                    sb.append(text.charAt(i));
                    // 每到 maxLineLength 个字符就换行
                    if ((i + 1) % maxLineLength == 0) {
                        sb.append("\n");
                    }
                }
                // 输出格式化后的文本
                System.out.println(sb);
            } else {
                System.out.println("Text is empty.");
            }
            // 获取并保存图片(二进制数据)
            InputStream in = rs.getBinaryStream("longbimg");
            FileOutputStream fos = new FileOutputStream("D:\\桌面\\清明上河图1.png");
            int b;
            while ((b = in.read()) != -1) {
                fos.write(b);
            }
            fos.flush();
            in.close();
            fos.close();
        }
        JdbcUtils.close(conn, ps, null);
    }
}


总结

上述内容封装了一个用于数据库连接与释放的通用工具类,同时实现了通过数据库输入和输出长文本类型以及图片,由此认识了数据库中不同于java的新类型,最后也欢迎各位优秀的小伙伴一起评论交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

37方寸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值