A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Jeik 中级黑马   /  2014-11-9 16:00  /  1005 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题描述:向数据库中插入大文本数据,以及从数据库中读取大文本
        问题是数据插入后用cmd 查询数据库,查询出来的结果只有几行数据,但是我从数据库中读取打印到控制台又是对的!
问题2插入二进制的大数据比如图片:插入大数据之后,在从数据库中拷贝出来的数据比原始数据大了几十倍而且图片还打不开!
代码如下:
  1. package cn.jdbc;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedReader;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.FileOutputStream;
  8. import java.io.FileReader;
  9. import java.io.InputStream;
  10. import java.io.OutputStream;
  11. import java.io.Reader;
  12. import java.sql.Connection;
  13. import java.sql.PreparedStatement;
  14. import java.sql.ResultSet;
  15. import java.sql.SQLException;
  16. import java.sql.Statement;

  17. import oracle.sql.BLOB;

  18. import cn.utils.JdbcUtil;

  19. public class JdbcAccessBigData {
  20.         public static void main(String[] args) {
  21.                 //insertAndReadBigText();//代表大文本数据
  22.                 insertAndCopyPicture();//代表大型的二进制码数据,图片,视频等       
  23.         }
  24.         @SuppressWarnings("deprecation")
  25.         private static void insertAndCopyPicture() {
  26.                 Connection conn=JdbcUtil.getConnection();
  27.                 Statement st=null;
  28.                 PreparedStatement ps=null;
  29.                 ResultSet rs=null;
  30.                 String sql="insert into bigPicture values(?)";
  31.                 String sql2="select picture from bigPicture";
  32.                        
  33.                 try {
  34.                         //将数据插入到数据库,这种方式只适合MySQL,不适合Oracle
  35.                         /*ps=conn.prepareStatement(sql);
  36.                         File file=new File("src/cn/ojdbc/wusi.jpg");
  37.                         InputStream ins=new BufferedInputStream(new FileInputStream(file));
  38.                         ps.setBinaryStream(1, ins);//2进制字节流
  39.                         //ps.setBlob(1, ins);
  40.                         ps.execute();
  41.                         ins.close();*/
  42.                         /**Oracle 版本,从java中向数据库中插入图片 :*/
  43.                         st=conn.createStatement();
  44.                         conn.setAutoCommit(false);
  45.                         st.executeQuery("insert into bigPicture values(empty_blob())");
  46.                         rs=st.executeQuery("select picture from bigPicture for update");
  47.                         if(rs.next()){
  48.                                 //注意这里的BLOB对象时oracle里面的不是java中的
  49.                                 BLOB blob=(BLOB) rs.getBlob("picture");
  50.                                 @SuppressWarnings("unused")
  51.                                 OutputStream out=blob.getBinaryOutputStream();
  52.                                
  53.                                 File file=new File("src/cn/ojdbc/wusi.jpg");
  54.                                 InputStream ins=new BufferedInputStream(new FileInputStream(file));
  55.                                 byte[] buf=new byte[1024];
  56.                                 int n=0;
  57.                                 while((n=ins.read(buf))!=-1){
  58.                                         // 下面这样写报错--java.io.IOException: ORA-22920: 未锁定含有 LOB 值的行
  59.                                         //是因为select中没有写 for update
  60.                                         out.write(buf, 0, n);
  61.                                 }
  62.                                 out.flush();
  63.                                 out.close();
  64.                                 ins.close();
  65.                         }
  66.                        
  67.                         //从数据库中读取数据显示,貌似对于这样的数据好像不行。只能拷贝?
  68.                         //这里出现的问题 从数据库中拷贝出来的图片大小放大了n倍,而且图片打不开?
  69.                         st=conn.createStatement();
  70.                         rs=st.executeQuery(sql2);
  71.                         if(rs.next()){
  72.                                 InputStream ins2=rs.getBinaryStream(1);
  73.                                 OutputStream out=new BufferedOutputStream(new FileOutputStream("src/cn/ojdbc/wusi2.jpg"));
  74.                                 byte[] buf=new byte[1024];
  75.                                 int n=0;
  76.                                 while((n=ins2.read())!=-1){
  77.                                         out.write(buf,0,n);
  78.                                         out.flush();
  79.                                 }
  80.                                 out.close();
  81.                                 ins2.close();
  82.                         }
  83.                 } catch (Exception e) {
  84.                         throw new RuntimeException(e);
  85.                 }finally{
  86.                         JdbcUtil.freeSource(rs, ps, conn);
  87.                 }
  88.                
  89.         }
  90.         //向数据库中插入大文本数据,以及从数据库中读取大文本
  91.         //这里的问题是用cmd 查询数据库,查询出来的结果不对,但是我从数据库中读取打印又是对的???
  92.         private static void insertAndReadBigText() {
  93.                 Connection conn=JdbcUtil.getConnection();
  94.                 PreparedStatement ps=null;
  95.                 Statement st=null;
  96.                 ResultSet rs=null;
  97.                 String sql="insert into bigText values(?)";
  98.                 String sql2="select * from bigText";
  99.                 try {
  100.                         //向数据库中插入大文本数据
  101.                         ps=conn.prepareStatement(sql);
  102.                         File file=new File("src/cn/utils/JdbcUtils.java");
  103.                         Reader reader=new BufferedReader(new FileReader(file));
  104.                         //将大文本转换成字符流,存放到数据库的字段中
  105.                         ps.setCharacterStream(1,reader,file.length());
  106.                         ps.execute();
  107.                         reader.close();//关闭资源!!!
  108.                        
  109.                         //读取数据库中的大文本
  110.                         st=conn.createStatement();
  111.                         rs=st.executeQuery(sql2);
  112.                         if(rs.next()){
  113.                                 //将大文本字段转换成字符流
  114.                                 BufferedReader br=new BufferedReader(rs.getCharacterStream("bigTxt"));
  115.                                 int n=0;
  116.                                 while(br.read()!=-1){
  117.                                         System.out.println(br.readLine());
  118.                                 }
  119.                                 br.close();//关闭资源
  120.                         }
  121.                 } catch (Exception e) {
  122.                         e.printStackTrace();
  123.                         throw new RuntimeException(e);
  124.                 }finally{
  125.                         JdbcUtil.freeSource(rs, ps, conn);
  126.                 }
  127.         }

  128. }
复制代码

评分

参与人数 1黑马币 +1 收起 理由
杨佳名 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马