Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 385|回复: 0

[JDBC学习]mysql,sqlserver,oracle三种数据库的大对象存取

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 05:17:13 | 显示全部楼层 |阅读模式
    mysql 大对象存取:
    类型一般应该用mediumblod,
    blob只能存2的16次方个byte,
    mediumblod是24次方,
    一般来说够用了.longblob是32次方有些大.

    MYSQL默认配置只能存1M大小的文件,要修改配置,WIN版本的在mysql.ini文件中
    修改max_allowed_packet,net_buffer_length等几个参数,或直接SET GLOBAL varName=value.
    linux版本可以在启动参数后加-max_allowed_packet=xxM等几个参数.

    MYSQL存大对象最好直接就setBinaryStream,又快又方便.
    而不要先插入空再造型成BLOB然后再setBlob

    例子:
    import java.sql.*;
    import java.io.*;
    public class DBTest {

       
       static String driver = "org.gjt.mm.mysql.Driver";
       static String url = "jdbc:mysql://localhost:3306/test";
       static String user = "root";
       static String passwd = "passwd";
       public static void main(String[] args) throws Exception {
         Connection conn = null;
         try {
           Class.forName(driver);
           conn = DriverManager.getConnection(url,user,passwd);
          
           int op = 1;
           //插入
           if (op == 0) {
             PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
             ps.setString(1, "aaa.exe");
             InputStream in = new FileInputStream("d:/aaa.exe");
             ps.setBinaryStream(2,in,in.available());
             ps.executeUpdate();
             ps.close();
           }
           else {
             //取出
             PreparedStatement ps = conn.prepareStatement("select * from  tb_file where filename = ?");
             ps.setString(1, "aaa.exe");
             ResultSet rs = ps.executeQuery();
             rs.next();
             InputStream in = rs.getBinaryStream("filecontent");
             System.out.println(in.available());
             FileOutputStream out = new FileOutputStream("d:/bbb.exe");
             byte[] b = new byte[1024];
             int len = 0;
             while ( (len = in.read(b)) != -1) {
               out.write(b, 0, len);
               out.flush();
             }
             out.close();
             in.close();
             rs.close();
             ps.close();
           }
         }
         catch (Exception ex) {
           ex.printStackTrace(System.out);
         }
         finally {
           try {conn.close();}
           catch (Exception ex) { }
         }
       }
    }


    sqlserver 大对象存取
    没有什么多说的,只要是image类型就行了,注意这是column类型,有人以为它只能存
    图象.image是文件镜象的意思.
    import java.sql.*;
    import java.io.*;
    public class DBTest {


       static String driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
       static String url = "jdbc:microsoft:sqlserver://192.168.0.202:9999999999;DatabaseName=dddd";
       static String user = "sa";
       static String passwd = "ps";
       public static void main(String[] args) throws Exception {
         Connection conn = null;
         try {
           Class.forName(driver);
           conn = DriverManager.getConnection(url,user,passwd);
           int op = 0;
           //插入
           if (op == 0) {
             PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
             ps.setString(1, "aaa.exe");
             InputStream in = new FileInputStream("d:/aaa.exe");
             ps.setBinaryStream(2,in,in.available());
             ps.executeUpdate();
             ps.close();
           }
           else {
             //取出
             PreparedStatement ps = conn.prepareStatement("select * from  tb_file where filename = ?");
             ps.setString(1, "aaa.exe");
             ResultSet rs = ps.executeQuery();
             rs.next();
             InputStream in = rs.getBinaryStream("filecontent");
             System.out.println(in.available());
             FileOutputStream out = new FileOutputStream("d:/bbb.exe");
             byte[] b = new byte[1024];
             int len = 0;
             while ( (len = in.read(b)) != -1) {
               out.write(b, 0, len);
               out.flush();
             }
             out.close();
             in.close();
             rs.close();
             ps.close();
           }
         }
         catch (Exception ex) {
           ex.printStackTrace(System.out);
         }
         finally {
           try {conn.close();}
           catch (Exception ex) { }
         }
       }
    }



    ORACLE的大对象存储
    有些变态,要无论是Blob,还是CLOB都要求先插入一个空值,然后查询并锁定这一条记录,获取对Lob的引用再进行填充,网上有太多的例子.

    我个人认为这种方法垃圾得连写都不想写了,你可以自己去搜索一下.这种特别的操作既增加操作的复杂度,又违反了JDBC接口的规范,所以我极力反对这样使用,如果你和我有同样的观点.那么我提供另一种通用的方法.就是你不用LOB而用
    oracle的LONG RAW来代替它们.这样就可以象其它对象一样操作了:

    create table tb_file(filename varchar2(255),filecontent LONG RAW);


    import java.sql.*;
    import java.io.*;

    public class BlobTest {

       static String driver = "oracle.jdbc.driver.OracleDriver";
       static String url = "jdbc:oracle:thin:@localhost:1521:test";
       static String user = "system";
       static String passwd = "passwd";
       public static void main(String[] args) throws Exception {
         Connection conn = null;
         try {
           Class.forName(driver);
           conn = DriverManager.getConnection(url, user, passwd);
           int op = 1;
           //插入
           if (op == 0) {
             PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
             ps.setString(1, "aaa.exe");
             InputStream in = new FileInputStream("d:/aaa.exe");
             ps.setBinaryStream(2,in,in.available());
             ps.executeUpdate();
             ps.close();
           }
           else {
             //取出
             PreparedStatement ps = conn.prepareStatement("select * from  tb_file where filename = ?");
             ps.setString(1, "aaa.exe");
             ResultSet rs = ps.executeQuery();
             rs.next();
             InputStream in = rs.getBinaryStream("filecontent");
             System.out.println(in.available());
             FileOutputStream out = new FileOutputStream("d:/bbb.exe");
             byte[] b = new byte[1024];
             int len = 0;
             while ( (len = in.read(b)) != -1) {
               out.write(b, 0, len);
               out.flush();
             }
             out.close();
             in.close();
             rs.close();
             ps.close();
           }
         }
         catch (Exception ex) {
           ex.printStackTrace(System.out);
         }
         finally {
           try {
             conn.close();
           }
           catch (Exception ex) {}
         }
       }

      
      
       
       

         
       

         
       
      
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 07:23 , Processed in 0.297851 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表