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); } } }
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); } } }
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 + "秒"); } }