前言
本文主要介绍了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的新类型,最后也欢迎各位优秀的小伙伴一起评论交流