JDBC:数据库操作:BLOB数据处理
2023-09-14 08:58:42 时间
CLOB主要保存海量文字,而BLOB是专门保存二进制数据:包括,图片,音乐,影片。等。
在MYSQL中,BLOB类型使用LONGBLOB声明,最高可存储4G内容。
创建一个表:
create table userblob ( id int(4) primary key not null auto_increment, name varchar(30), photo longblob );
代码:
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileInputStream ; import java.io.InputStream ; public class BlobDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 PreparedStatement pstmt = null ; String name = "小华" ; String sql = "INSERT INTO userblob(name,photo) VALUES (?,?) " ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; File f = new File("d:" + File.separator + "图片1.JPG") ; // 图片文件 InputStream input = null ; input = new FileInputStream(f) ; pstmt.setString(1,name) ; // 设置第一个“?”的内容 pstmt.setBinaryStream(2,input,(int)f.length()) ; // 设置输入流 pstmt.executeUpdate() ; // 更新数据库 pstmt.close() ; conn.close() ; // 数据库关闭 } };
查询执行结果:
图片肯定是无法查询出来的,所以应该将图片读取出来,另存一个其他文件。
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.PreparedStatement ; import java.io.File ; import java.io.FileOutputStream ; import java.sql.ResultSet ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 PreparedStatement pstmt = null ; ResultSet rs = null ; int id = 1 ; String sql = "SELECT name,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 执行查询 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; InputStream input = rs.getBinaryStream(2) ; File f = new File("d:" + File.separator + "load图片1.gif") ; // 图片文件 OutputStream out = null ; out = new FileOutputStream(f) ; int temp = 0 ; while((temp=input.read())!=-1){ // 边读边写 out.write(temp) ; } input.close() ; out.close() ; } pstmt.close() ; conn.close() ; // 数据库关闭 } };
处理后,在D文件夹中发现文件,表示,读取成功。
以上程序是通过IO的操作流读取的
为了方便读取,JAVA专门的提供了BLOB类进行二进制文件的读取操作。
BLOB类
BLOB类提供了以下方法:
操作范例代码如下:
package 类集; import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ; import java.sql.PreparedStatement ; import java.sql.Blob ; import java.sql.ResultSet ; import java.io.File ; import java.io.FileOutputStream ; import java.io.InputStream ; import java.io.OutputStream ; public class BlobDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; // 定义MySQL数据库的连接地址 public static final String DBURL = "jdbc:mysql://localhost:3306/sys" ; // MySQL数据库的连接用户名 public static final String DBUSER = "root" ; // MySQL数据库的连接密码 public static final String DBPASS = "aaaaaa" ; public static void main(String args[]) throws Exception{ // 所有异常抛出 Connection conn = null ; // 数据库连接 PreparedStatement pstmt = null ; ResultSet rs = null ; int id = 1 ; String sql = "SELECT name,photo FROM userblob WHERE id=?" ; Class.forName(DBDRIVER) ; // 加载驱动程序 conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ; pstmt = conn.prepareStatement(sql) ; pstmt.setInt(1,id) ; rs = pstmt.executeQuery() ; // 执行查询 if(rs.next()){ String name = rs.getString(1) ; System.out.println("姓名:" + name) ; Blob b = rs.getBlob(2) ; File f = new File("d:" + File.separator + "load图片2.gif") ; // 图片文件 OutputStream out = null ; out = new FileOutputStream(f) ; out.write(b.getBytes(1,(int)b.length())) ; out.close() ; } pstmt.close() ; conn.close() ; // 数据库关闭 } };
操作结果:
发现成功读取并创建了文件。
使用BLOB会比较简单一些,但是从实际角度,把大文件存在数据库中是很不明智行为。往往采用映射路径方式完成。
相关文章
- JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一
- MySQL_(Java)使用JDBC向数据库中修改(update)数据
- 华为云MySQL金融版正式商用,高可靠的金融级数据库来了
- Elasticsearch(9):使用Logstash-input-jdbc同步数据库中的数
- JDBC进行Oracle数据库操作。
- JDBC数据库编程:callableStatement接口
- JDBC数据库编程:PreparedStatement接口
- JDBC操作,执行数据库更新操作
- java数据库编程:JDBC操作及数据库
- 数据库链接字符汇总
- [Servlet&JSP] 使用JDBC连接数据库
- JDBC + SAP云平台 = 运行在云端的数据库应用
- Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php c#.Net
- Atitit.跨语言数据库db api兼容性 jdbc odbc ado oledb 增强方案
- Java学习路线-44:JDBC数据库开发进阶
- JavaSE学习总结(九)—— Java访问数据库(JDBC)
- [Sqlite]-->Java采用jdbc联系Sqlite各种特定的工艺数据库的数据操作
- hive和hbase本质区别——hbase本质是OLTP的nosql DB,而hive是OLAP 底层是hdfs,需从已有数据库同步数据到hdfs;hive可以用hbase中的数据,通过hive表映射到hbase表
- JDBC(Java Database Connectivity,Java数据库连接)API是一个标准SQL(Structured Query Language
- JSP 连接数据库JDBC有一定的了解
- JAR包分享之Oracle(java)数据库11.2.0.4 JDBC驱动程序 jar包 ojdbc6.jar ojdbc5.jar