关闭

JDBC进阶

标签: jdbc游标大字段批处理
1899人阅读 评论(0) 收藏 举报
分类:

JDBC进阶

游标

     游标功能允许我们分批读取SQL的查询记录。PS:在数据库开发中,编写存储过程,也会经常用到游标。


如何使用游标

  1. 修改DB_URL为jdbc:mysql://<IP>:<Port>/<database>?useCursorFetch=true
  2. 使用PreparedStatement接口的setFetchSize()方法,设置每次获取的记录条数

案例

package com.pc.jdbc;

import java.sql.*;

/**
 * Created by switch on 16/8/26.
 */
public class HelloJDBC {
    public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    public static String DB_URL = "jdbc:mysql://localhost/cloud_study";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    private static Connection ct = null;
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;

    public static void helloWorld() throws ClassNotFoundException {
        // 1. 加载驱动
        Class.forName(JDBC_DRIVER);
        try {
            // 修改DB_URL使其支持使用游标
            DB_URL = DB_URL + "?useCursorFetch=true";
            // 2. 获取连接
            ct = DriverManager.getConnection(DB_URL, USER, PASSWORD);
            // 3. 执行SQL语句
            String sql = "SELECT userName FROM user";
            ps = ct.prepareStatement(sql);
            // 设置每次从数据库中获取的记录数n
            // 大于0则每次获取n条,n = 0则获取整个记录集
            ps.setFetchSize(1);
            rs = ps.executeQuery();
            // 4. 处理记录
            while (rs.next()) {
                System.out.println(rs.getString("userName"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 5. 释放资源
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
        helloWorld();
    }
}

读取数据库的大字段

     当一个字段大到都能使内存溢出的情况下,可以使用流方式的机制处理。


package com.pc.jdbc;

import java.io.*;
import java.sql.*;

/**
 * Created by switch on 16/8/26.
 */
public class HelloJDBC {
    public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    public static String DB_URL = "jdbc:mysql://localhost/cloud_study";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    private static Connection ct = null;
    private static PreparedStatement ps = null;
    private static ResultSet rs = null;

    public static void helloWorld() throws ClassNotFoundException {
        // 1. 加载驱动
        Class.forName(JDBC_DRIVER);
        try {
            // 修改DB_URL使其支持使用游标
            DB_URL = DB_URL + "?useCursorFetch=true";
            // 2. 获取连接
            ct = DriverManager.getConnection(DB_URL, USER, PASSWORD);
            // 3. 执行SQL语句
            String sql = "SELECT blog FROM user_note";
            ps = ct.prepareStatement(sql);
            // 设置每次从数据库中获取的记录数n
            // 大于0则每次获取n条,n = 0则获取整个记录集
            ps.setFetchSize(1);
            rs = ps.executeQuery();
            // 4. 处理记录
            while (rs.next()) {
                // 获取流对象
                InputStream in = rs.getBinaryStream("blog");
                // 写入文件,该文件需要不断更换,不然会被下一次循环覆盖
                File file = new File("Blog_File.txt");
                // 缓冲流写出到文件
                BufferedOutputStream out = new BufferedOutputStream(
                        new FileOutputStream(file));
                int len = 0;
                byte[] buf = new byte[4096];
                // 边读入边写出
                while ((len = in.read(buf)) != -1) {
                    out.write(buf, 0, len);
                }

                System.out.println(rs.getString("userName"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 5. 释放资源
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
        helloWorld();
    }
}

批处理

     通过一次添加,可以执行多个SQL语句。也就是说可以写一堆SQL语句,然后将它一并发送到DBMS中,然后DBMS执行者一堆SQL语句。

通过Statement接口中的addBatch()、executeBatch()、clearBatch()可以完成上述操作,addBatch()是将SQL语句添加到一个批处理列表中去,executeBatch()是执行这个批处理列表中的SQL语句,clearBatch()是清除这个批处理列表中的SQL语句。
package com.pc.jdbc;

import java.sql.*;

/**
 * Created by switch on 16/8/28.
 */
public class JDBC2 {
    public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    public static final String DB_URL = "jdbc:mysql://localhost:3306/cloud_study";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    private static Connection ct = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;

    public static void main(String[] args) {
        try {
            Class.forName(JDBC_DRIVER);
            ct = DriverManager.getConnection(DB_URL, USER, PASSWORD);
            stmt = ct.createStatement();

            // 将SQL语句添加到批处理列表
            stmt.addBatch("INSERT INTO user(userName, age) VALUES('zs', 20)");
            stmt.addBatch("INSERT INTO user(userName, age) VALUES('ls', 30)");
            stmt.addBatch("INSERT INTO user(userName, age) VALUES('ww', 25)");

            // 执行批处理列表中的SQL语句
            stmt.executeBatch();

            // 清除批处理列表中的SQL语句
            stmt.clearBatch();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (ct != null) {
                    ct.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}






-------------参考《网易云课堂.数据库开发》


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:812536次
    • 积分:11570
    • 等级:
    • 排名:第1416名
    • 原创:422篇
    • 转载:4篇
    • 译文:0篇
    • 评论:141条
    联系方式
    博客专栏
    最新评论