JDBC进阶

来源:互联网 发布:视频底层软件开发 编辑:程序博客网 时间:2024/05/22 06:54

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