数据库_jdbc_大数据(text+blob)_批处理

mysql中的大文本TEXT插入和读取

package cn.itcast.demo;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import cn.itcast.exception.DaoException;
import cn.itcast.utils.JdbcUtils;
//演示mysql中的大文本TEXT如何插入和读取!
/*
mysql -uroot -proot
set character_set_client=gb2312;
set character_set_results=gb2312;
create database day15 character set utf8 collate utf8_general_ci;
use day15;
create table testtext(
  id varchar(40) primary key,
  resume text
);
show tables;
select * from testtext;
 */
public class demo1 {
  //方法1:演示mysql中的大文本TEXT如何插入!
  @Test
  public void insert(){
    //SQL更新模板代码(sql_u)
    Connection conn = null;
    PreparedStatement st = null;
    ResultSet rs = null;
    try {
      conn = JdbcUtils.getConnection();
      String sql = "insert into testtext(id,resume) values(?,?)";
      st = conn.prepareStatement(sql);
      st.setString(1, "1");
      //插入mysql大文本text关键代码!
      //1,先准备一个字符流关联源文本
      File file=new File("src/1.txt");//注意路径的写法!普通java工程可以这样写,如果是web工程就不行!那样会在tomcat/bin/目录下找
      FileReader reader=new FileReader(file);
      st.setCharacterStream(2, reader, (int)file.length());
      //2,替换好占位符之后就可执行了!
      int num = st.executeUpdate();
      if (num > 0) {
        //do something
        System.out.println("mysql的大文本text插入成功!");
      }
    } catch (Exception e) {
      throw new DaoException(e);
    } finally {
      JdbcUtils.release(conn, st, rs);
    }
  }
  //方法2:演示mysql中的大文本TEXT如何读取!
  @Test
  public void read(){
    //SQL查询模板代码(sql_s)
    Connection conn = null;
    PreparedStatement st = null;
    ResultSet rs = null;
    try {
      conn = JdbcUtils.getConnection();
      String sql = "select * from testtext where id='1'";
      st = conn.prepareStatement(sql);
      rs = st.executeQuery();
      if (rs.next()) {
        //do something
        //String str=rs.getString("resume");直接读取大文本可能内存溢出
        //mysql大文本text读取的重点!
        //字符流读取模板代码+IO异常处理机制[read_c]
        Reader reader = null;
        FileWriter writer = null;
        try {
          reader=rs.getCharacterStream("resume");
          writer=new FileWriter("d:\\2.txt");
          //字符流必须用字符数组
          char[] buf = new char[1024];
          int len = 0;
          //一顿狂写
          while ((len = reader.read(buf)) != -1) {
            writer.write(buf, 0, len);
          }
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          if (reader != null) {
            try {
              reader.close();
            } catch (IOException e) {
              throw new RuntimeException("reader关闭失败!");
            }
            reader = null;
          }
          if (writer != null) {
            try {
              writer.close();
            } catch (IOException e) {
              throw new RuntimeException("writer关闭失败!");
            }
            writer = null;
          }
        }
      }
    } catch (Exception e) {
      throw new DaoException(e);
    } finally {
      JdbcUtils.release(conn, st, rs);
    }
  }
}

mysql中的二进制Blob插入和读取!

package cn.itcast.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
import cn.itcast.exception.DaoException;
import cn.itcast.utils.JdbcUtils;
//演示mysql中的二进制Blob如何插入和读取!(连接珍贵,建议少用!)
/*
mysql -uroot -proot
set character_set_client=gb2312;
set character_set_results=gb2312;
create database day15 character set utf8 collate utf8_general_ci;
use day15;
create table testblob(
  id varchar(40) primary key,
  image blob
);
注意:Blob为L+2,L<2^16,约为64K
MediumBlob为L+2,L<2^24,约为16M
LongBlob为L+2,L<2^32,约为4G
show tables;
select * from testblob;
 */
public class demo2 {
  //方法1:演示mysql中的二进制Blob如何插入!
  @Test
  public void insert(){
    //SQL更新模板代码(sql_u)
    Connection conn = null;
    PreparedStatement st = null;
    ResultSet rs = null;
    try {
      conn = JdbcUtils.getConnection();
      String sql = "insert into testblob(id,image) values(?,?)";
      st = conn.prepareStatement(sql);
      st.setString(1, "1");
      //插入mysql二进制Blob关键代码!
      //1,先准备一个字节流关联源图片
      File file=new File("src/1.jpg");//注意路径的写法!普通java工程可以这样写,如果是web工程就不行!那样会在tomcat/bin/目录下找
      InputStream in=new FileInputStream(file);
      st.setBinaryStream(2, in, (int)file.length());
      //2,替换好占位符之后就可执行了!
      int num = st.executeUpdate();
      if (num > 0) {
        //do something
        System.out.println("mysql的二进制Blob插入成功!");
      }
    } catch (Exception e) {
      throw new DaoException(e);
    } finally {
      JdbcUtils.release(conn, st, rs);
    }
  }
  //方法2:演示mysql中的二进制Blob如何读取!
  @Test
  public void read(){
    //SQL查询模板代码(sql_s)
    Connection conn = null;
    PreparedStatement st = null;
    ResultSet rs = null;
    try {
      conn = JdbcUtils.getConnection();
      String sql = "select * from testblob where id='1'";
      st = conn.prepareStatement(sql);
      rs = st.executeQuery();
      if (rs.next()) {
        //do something
        //mysql二进制Blob读取的重点!
        //字节流读取模板代码+IO异常处理机制[read_b]
        InputStream in = null;
        OutputStream out = null;
        try {
          in=rs.getBinaryStream("image");//关联源
          out=new FileOutputStream("d:\\2.jpg");//关联目的
          //字节流必须用字节数组
          byte[] buf = new byte[1024];
          int len = 0;
          //一顿狂写
          while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
          }
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          if (in != null) {
            try {
              in.close();
            } catch (IOException e) {
              throw new RuntimeException("in关闭失败!");
            }
            in = null;
          }
          if (out != null) {
            try {
              out.close();
            } catch (IOException e) {
              throw new RuntimeException("out关闭失败!");
            }
            out = null;
          }
        }
      }
    } catch (Exception e) {
      throw new DaoException(e);
    } finally {
      JdbcUtils.release(conn, st, rs);
    }
  }
}

jdbc实现批处理的两种方式

package cn.itcast.demo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
import cn.itcast.exception.DaoException;
import cn.itcast.utils.JdbcUtils;
public class demo3 {
	  /*jdbc实现批处理有两种方式:
	   * 第1种方式Statement对象!
	   * 第2种方式PreparedStatement对象!
	   * 下面通过两个方法演示
	   */
  /*
   mysql -uroot -proot
  set character_set_client=gb2312;
  set character_set_results=gb2312;
  use day15;
   create table testbatch
   (
     id varchar(40) primary key,
     name varchar(40)
   );
  select * from testbatch;
   show tables;
  */  
  @Test
  public void testbatch1(){
    //实现批处理第一种方式:Statement对象!
    //SQL实现批处理第1种方式模板代码(sql_batch_st)
    Connection conn = null;
    Statement st = null;
    ResultSet rs = null;
    try {
      conn = JdbcUtils.getConnection();
      String sql1 = "insert into testbatch(id,name) values('1','薛宝钗')";
      String sql2 = "update testbatch set name='林黛玉' where id='1'";
      st = conn.createStatement();
      //Statement对象批量插入标准3步曲!
      st.addBatch(sql1);
      st.addBatch(sql2);
      //返回Statement对象内部的list集合每一条命令影响的行数组成的数组!
      int[] num=st.executeBatch();
      st.clearBatch();
    } catch (Exception e) {
      throw new DaoException(e);
    } finally {
      JdbcUtils.release(conn, st, rs);
    }
  }
  @Test
  public void testbatch2(){
    //实现批处理第2种方式:PreparedStatement对象!
    //SQL实现批处理第2种方式模板代码(sql_batch_prest)
    //记录开始时间
    long startTime = System.currentTimeMillis(); 
    Connection conn = null;
    PreparedStatement st = null;
    ResultSet rs = null;
    try {
      conn = JdbcUtils.getConnection();
      String sql = "insert into testbatch(id,name) values(?,?)";
      st = conn.prepareStatement(sql);
      //PreparedStatement对象批量插入标准3步曲!
      for (int i = 1; i < 1006; i++) {
        //第1步,占位符全替换
        st.setString(1, i+"");
        st.setString(2,"妙玉"+ i);
        //第2步,将完整的sql语句添加到内部list
        st.addBatch();
        //第3步,健壮性判断,防止java heap space溢出
        if (i%100==0) {
          //达到一定数目,就先执行,并清空list里的Sql
          st.executeBatch();
          st.clearBatch();
        }
        //第4步,最后将无法整除的漏网之鱼执行
        st.executeBatch();
        st.clearBatch();
      }
    } catch (Exception e) {
      throw new DaoException(e);
    } finally {
      JdbcUtils.release(conn, st, rs);
    }
    //记录结束时间!1000条花了24秒
    long endTime = System.currentTimeMillis(); 
    System.out.println("总花了:" + (endTime-startTime)/1000 + "秒");
  }
}



你可能感兴趣的:(数据库,mysql,jdbc,大数据,批处理)