JDBC扩展--处理大数据详解及源码

来源:互联网 发布:数据保密协议pdf 编辑:程序博客网 时间:2024/05/22 10:57

JDBC扩展--处理大数据详解及源码

JDBC处理大文本

一  使用目的

    在实际开发中,程序需要把大文本或二进制数据保存到数据库。

二  概念

1.大数据也称LOB(Loarg Objects)  LOB又称clob 和blob

    (1)Clob用于存储大文本 用Text表示

    (2)Blob用于存储二进制数据 例如图像。声音 二进制文等

注:对MySQL而言只有blob,而没有clob,mysql存储大文本采用的是Text,Text和blob分别又分为:

(1)TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT

(2)TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB

三  代码分析

(1)向数据库中插入大文本,下面是插入数据库的方法

    public void insert() {

       Connection con = null;

       PreparedStatement st = null;

       ResultSet rs = null;

       try {

           //获取连接

           con = DBManager.getConnection();

           //定义sql语句

           String sql = "insert into testclob (resume) value(?)";

           //创建预处理对象

           st = con.prepareStatement(sql);

           //为占位符赋值  ,给输入流对象做参数

           //得到指定资源url对象

           File f = new File("1.txt");

           //系统会自动的读取1.txt文件中的内容并放到流中

           st.setCharacterStream(1, new FileReader(f),f.length());

           //执行更新语句

           int result = st.executeUpdate();

           if(result>0){

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

           }else{

              System.out.println("插入失败");

           }

           DBManager.release(con, st, rs);

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (FileNotFoundException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

      注:要想向数据库中插入文本,就要用到的是输入流,先指定要向数据库中插入的数据

       File f = new File("1.txt");

       然后调用下面这个方法把文件写入到流中

       st.setCharacterStream(1, new FileReader(f),f.length());

(2)从数据库总读取文件

    public void find(){

       Connection con = null;

       PreparedStatement st = null;

       ResultSet rs = null;

      

       try {

           //获取连接

           con = DBManager.getConnection();

           //定义sql语句

           String sql = "select resume from testclob where id=1";

           //创建预处理对象

           st = con.prepareStatement(sql);

           //执行更新

           rs = st.executeQuery();

           if(rs.next()){

              //放到流中

              Reader reader = rs.getCharacterStream("resume");

              //创建缓冲区

              char buff[] = new char[1024];

              //通过循环的方法读取

              int len = 0;

              FileWriter writer = new FileWriter("3.txt");

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

                  //读取后放到文件中

                  writer.write(buff,0,len);

              }

writer.close();

              reader.close();

           }

           DBManager.release(con, st, rs);

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

  }

注:在读取的时候,可能有人会这样写:

        String str  = rs.getString("resume");

     但是这样只是适合于文本小的,如果是大的文本,则很可能会死机,所有用这个方法的时候要慎重。

四   附加上配置文件  dp.properties   和DBManager.java

   db.properties文件

#\u8FDE\u63A5\u8BBE\u7F6E

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/jdbc

username=root

password=qiao

 

#<!-- \u521D\u59CB\u5316\u8FDE\u63A5 -->

initialSize=5

 

#\u6700\u5927\u8FDE\u63A5\u6570\u91CF

maxActive=5

 

#<!-- \u6700\u5927\u7A7A\u95F2\u8FDE\u63A5 -->

maxIdle=20

 

#<!-- \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5 -->

minIdle=5

 

#<!-- \u8D85\u65F6\u7B49\u5F85\u65F6\u95F4\u4EE5\u6BEB\u79D2\u4E3A\u5355\u4F4D 60000\u6BEB\u79D2/1000\u7B49\u4E8E60\u79D2 -->

maxWait=3000

 

 

#JDBC\u9A71\u52A8\u5EFA\u7ACB\u8FDE\u63A5\u65F6\u9644\u5E26\u7684\u8FDE\u63A5\u5C5E\u6027\u5C5E\u6027\u7684\u683C\u5F0F\u5FC5\u987B\u4E3A\u8FD9\u6837\uFF1A[\u5C5E\u6027\u540D=property;]

#\u6CE8\u610F\uFF1A"user" \u4E0E "password" \u4E24\u4E2A\u5C5E\u6027\u4F1A\u88AB\u660E\u786E\u5730\u4F20\u9012\uFF0C\u56E0\u6B64\u8FD9\u91CC\u4E0D\u9700\u8981\u5305\u542B\u4ED6\u4EEC\u3002

connectionProperties=useUnicode=true;characterEncoding=UTF-8

 

#\u6307\u5B9A\u7531\u8FDE\u63A5\u6C60\u6240\u521B\u5EFA\u7684\u8FDE\u63A5\u7684\u81EA\u52A8\u63D0\u4EA4\uFF08auto-commit\uFF09\u72B6\u6001\u3002

defaultAutoCommit=true

 

#driver default \u6307\u5B9A\u7531\u8FDE\u63A5\u6C60\u6240\u521B\u5EFA\u7684\u8FDE\u63A5\u7684\u53EA\u8BFB\uFF08read-only\uFF09\u72B6\u6001\u3002

#\u5982\u679C\u6CA1\u6709\u8BBE\u7F6E\u8BE5\u503C\uFF0C\u5219\u201CsetReadOnly\u201D\u65B9\u6CD5\u5C06\u4E0D\u88AB\u8C03\u7528\u3002\uFF08\u67D0\u4E9B\u9A71\u52A8\u5E76\u4E0D\u652F\u6301\u53EA\u8BFB\u6A21\u5F0F\uFF0C\u5982\uFF1AInformix\uFF09

defaultReadOnly=

 

#driver default \u6307\u5B9A\u7531\u8FDE\u63A5\u6C60\u6240\u521B\u5EFA\u7684\u8FDE\u63A5\u7684\u4E8B\u52A1\u7EA7\u522B\uFF08TransactionIsolation\uFF09\u3002

#\u53EF\u7528\u503C\u4E3A\u4E0B\u5217\u4E4B\u4E00\uFF1A\uFF08\u8BE6\u60C5\u53EF\u89C1javadoc\u3002\uFF09NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE

defaultTransactionIsolation=READ_UNCOMMITTED

 

DBManager.java

 

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.Properties;

 

 

public class DBManager {

   

    private static String username;

    private static String password;

    private static String url;

    private static String driver;

   

    static{

       try{

           InputStream in = DBManager.class.getClassLoader().getResourceAsStream("db.properties");

           Properties prop = new Properties();

           prop.load(in);

          

           driver = prop.getProperty("driverClassName");

           url = prop.getProperty("url");

          

           username = prop.getProperty("username");

           password = prop.getProperty("password");

          

           Class.forName(driver);

          

       }catch (Exception e) {

           throw new ExceptionInInitializerError(e);

       }

    }

   

   

    public static Connection getConnection() throws SQLException{

       return DriverManager.getConnection(url, username, password);

    }

   

   

    public static void release(Connection conn,Statement st,ResultSet rs){

      

       if(rs!=null){

           try{

              rs.close();

           }catch (Exception e) {e.printStackTrace();}

            rs = null;

       }

       if(st!=null){

           try{

              st.close();

           }catch (Exception e) {e.printStackTrace();}

           st = null;

       }

       if(conn!=null){

           try{

              conn.close();

           }catch (Exception e) {e.printStackTrace();}

           conn = null;

        } 

    }

}

 Jdbc处理二进制数据

一  使用目的

一般是向数据库库中插入图片和从数据库中读取图片

二  代码介绍

1.向数据库中插入图片

   public void insert() {

       Connection con = null;

       PreparedStatement st = null;

       ResultSet rs = null;

        try {

           // 获取连接

           con = DBManager.getConnection();

           // 定义sql语句

           String sql = "insert into testblob (image) value(?)";

           // 创建预处理对象

           st = con.prepareStatement(sql);

           // 为占位符赋值

           File f = new File("1.jpg");

           st.setBinaryStream(1, new FileInputStream(f), f.length());

           // 执行更新语句

           int result = st.executeUpdate();

           // 判断

           if (result > 0) {

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

           } else {

              System.out.println("插入失败");

           }

       } catch (SQLException e) {

           e.printStackTrace();

       } catch (FileNotFoundException e) {

           e.printStackTrace();

       }finally{

           DBManager.release(con, st, rs);

}

    }

    注:想数据库中输入图片最重要的是:

        File f = new File("1.jpg");

       st.setBinaryStream(1, new FileInputStream(f), f.length());

2.从数据库中读取图片

    public void find() {

       Connection con = null;

       PreparedStatement st = null;

       ResultSet rs = null;

       try {

           // 获取连接

           con = DBManager.getConnection();

           // 定义sql语句

           String sql = "select image from testblob where id=1";

           // 创建预处理对象

           st = con.prepareStatement(sql);

           // 执行更新

           rs = st.executeQuery();

           // 判断

           if (rs.next()) {

              // 读取

              InputStream fis = rs.getBinaryStream("image");

              // 定义缓冲区,读取到缓冲区 中

              byte[] buff = new byte[1024];

              int len = 0;

              FileOutputStream fos = new FileOutputStream("3.jpg");

              while ((len = fis.read(buff)) > 0) {

                  fos.write(buff, 0, len);

              }

           }

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }finally{

           DBManager.release(con, st, rs);

}

}

注:最重要的部分:

    if (rs.next()) {

              // 读取

              InputStream fis = rs.getBinaryStream("image");

              // 定义缓冲区,读取到缓冲区 中

              byte[] buff = new byte[1024];

              int len = 0;

              FileOutputStream fos = new FileOutputStream("3.jpg");

              while ((len = fis.read(buff)) > 0) {

                  fos.write(buff, 0, len);

           }

    }

 

   注:配置文件在上一篇有附加


原创粉丝点击