天天看点

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

版权声明:尊重博主原创文章,转载请注明出处哦~http://blog.csdn.net/eson_15/article/details/51317001

        上一节主要讲了jdbc的基本操作,这一节主要总结一下jdbc如何处理大文本、如何处理图片以及进行批处理。

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

string path = demo1.class.getclassloader().getresource("1.txt").getpath(); //获取指定文件的path  

file file = new file(path); //以这个path为参数构建一个file对象  

reader reader = new filereader(file); //以这个file对象为参数构建reader流,这个流与这个文件就关联了  

        下面我们来看一下如何向数据库中存入大文本以及如何从数据库中取出大文本。先建立一个数据库:

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

create database tes<span style="font-family:microsoft yahei;">t</span>;  

use test;  

create table testclob  

(  

   id int primary key auto_increment,  

   resume text  

);  

        下面看demo1.java:

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

public class demo1 {  

    @test//向数据库中插入一个文本  

    public void add() throws filenotfoundexception {  

        connection conn = null;  

        preparedstatement st = null;  

        resultset rs = null;  

        try {  

            conn = jdbcutils.getconnection();  //使用上一节中的jdbcutils  

            string sql = "insert into testclob(resume) values(?)";  

            st = conn.preparestatement(sql); //预处理sql语句  

            string path = demo1.class.getclassloader().getresource("1.txt").getpath();//在工程src目录下存放一个1.txt文件  

            file file = new file(path);   

            st.setcharacterstream(1, new filereader(file), file.length());  

            int num = st.executeupdate(); //执行向数据库中插入  

            if(num > 0) {  

                system.out.println("插入成功");  

            }   

        } catch (sqlexception e) {        

            e.printstacktrace();  

        } finally {  

            jdbcutils.release(conn, st, rs);  

        }  

    }  

    @test //从数据库中读取文本  

    public void read() throws ioexception {  

            conn = jdbcutils.getconnection();  

            string sql = "select resume from testclob where id=?";  

            st = conn.preparestatement(sql);  

            st.setint(1, 1);  

            rs = st.executequery(); //执行sql语句  

            if(rs.next()){  

                reader reader = rs.getcharacterstream("resume"); //获取字段未resume的项,也就是我们刚刚存到数据库的1.txt文件  

                char buffer[] = new char[1024];  

                int len = 0;  

                filewriter out = new filewriter("d:\\1.txt"); //写到d盘下  

                while((len = reader.read(buffer)) > 0){  

                    out.write(buffer, 0, len);  

                }  

                out.close();  

                reader.close();  

            }  

}  

        以上就是处理大文本的方法,比较简单,下面我们来看看如何处理图片。

         在mysql中,大文本是image类型,我们现在数据库中建立新的表:

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

create table testblob  

 (  

    id int primary key auto_increment,  

    image longblob  

 );  

        然后我们直接看处理图片的java程序demo2.java:

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

public class demo2 {  

    @test //向数据库中写入图片  

            string sql = "insert into testblob(image) values(?)";  

            string path = demo2.class.getclassloader().getresource("honey.jpg").getpath(); //图片存在src目录下  

            st.setbinarystream(1, new fileinputstream(path), new file(path).length());//这里用的是setbinarystream,字节流  

            //这种方法也行,fileinputstream方法重载了,既可以传递路径,也可以传递具体文件  

            //st.setbinarystream(1, new fileinputstream(new file(path)), new file(path).length());    

            int num = st.executeupdate();  

            /*这里会有这个错误: 

             * packet for query is too large (4531349 > 1048576).  

             * you can change this value on the server by setting the max_allowed_packet' variable. 

             * 原因:mysql的一个系统参数:max_allowed_packet,其默认值为1048576(1m),即允许传递的最大packet为1m,如果照片超过1m无法导入 

             * 查询:show variables like '%max_allowed_packet%';修改此变量的值:set global max_allowed_packet = 1024*1024*10;(10m) 

             * */  

            if(num > 0){  

    @test //从数据库中读取图片  

            string sql = "select image from testblob where id=?";  

            rs = st.executequery();  

            while(rs.next()){  

                inputstream in = rs.getbinarystream("image");//获取用getbinarystream,也是字节流  

                byte buffer[] = new byte[1024];  

                fileoutputstream out = new fileoutputstream("d:\\honey.jpg"); //写到d盘下  

                while((len = in.read(buffer)) > 0){  

                in.close();  

        jdbc操作图片也比较简单,跟操作大文本差不多。下面看看jdbc如何进行批处理。

首先我们还是先建立一个表:

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

create table testbatch  

    id int primary key,  

    name varchar(20)  

然后我们看看jdbc进行批处理的具体代码:

JDBC技术总结(二) 1.JDBC处理大文本 2. JDBC处理图片 3. JDBC进行批处理

//jdbc进行批处理  

public class demo3 {  

    @test  

    public void testbatch() {  

        statement st = null;  

            string sql1 = "insert into testbatch(id,name) values(1,'aaa')";  

            string sql2 = "insert into testbatch(id,name) values(2,'bbb')";  

            string sql3 = "insert into testbatch(id,name) values(3,'ccc')";  

            string sql4 = "delete from testbatch where id=1";  

            st = conn.createstatement();  

            st.addbatch(sql1);  

            st.addbatch(sql2);  

            st.addbatch(sql3);  

            st.addbatch(sql4); //将四条sql语句加入batch  

            st.executebatch(); //然后依次执行这四条sql语句  

            st.clearbatch();//执行完后清除batch  

        } catch (exception e) {       

    @test //大量插入  

    public void testbatch2() {  

            conn = j<span style="font-family:microsoft yahei;">dbc</span>utils.getconnection();  

            string sql = "insert into testbatch(id,name) values(?,?)";    

            for(int i = 0; i < 10000000; i++){  

                st.setint(1, i);  

                st.setstring(2, "aa"+i);  

                st.addbatch();  

                if(i % 1000 == 0){//每1000条向数据库中添加一次  

                    st.executebatch();  

                    st.clearbatch();  

            st.executebatch();//防止还剩一些零头的数据,这里刚好是1000的倍数  

            st.clearbatch();  

jdbc大文本、图片的操作以及批处理其实很简单,掌握几个关键的api就可以了,不再赘述,如有错误之处,欢迎留言指正~

<a target="_blank" href="http://blog.csdn.net/column/details/servletandjsp.html"></a>

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!