zoukankan      html  css  js  c++  java
  • JDBC:数据库操作:BLOB数据处理

    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会比较简单一些,但是从实际角度,把大文件存在数据库中是很不明智行为。往往采用映射路径方式完成。

  • 相关阅读:
    微信redirect_uri域名与后台配置不一致,错误代码10003
    windows安装centos7子系统
    c++中的var_dump
    egret3.x升级5.2
    PHP更改自动加载的顺序
    重定向如何携带cookie
    elasticsearch和mysql排序问题
    npm错误:Error: listen EADDRNOTAVAIL
    Spring Boot WebFlux 集成 Mongodb 数据源操作
    泥瓦匠:程序猿为啥要坚持写原创技术博客?
  • 原文地址:https://www.cnblogs.com/alsf/p/6731216.html
Copyright © 2011-2022 走看看