JDBC进阶
来源:互联网 发布:视频底层软件开发 编辑:程序博客网 时间:2024/05/22 06:54
JDBC进阶
游标
游标功能允许我们分批读取SQL的查询记录。PS:在数据库开发中,编写存储过程,也会经常用到游标。
如何使用游标
- 修改DB_URL为jdbc:mysql://<IP>:<Port>/<database>?useCursorFetch=true
- 使用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
- JDBC进阶
- jdbc进阶
- JDBC进阶
- JDBC进阶
- JDBC进阶(SXT)
- JDBC 进阶版
- JDBC进阶功能
- Java进阶之JDBC
- JDBC进阶 + 数据源
- JDBC进阶功能
- JDBC进阶功能2
- mule进阶之jdbc transport
- mule进阶之jdbc transport:
- JDBC进阶之批处理 Batch
- Java进阶(一)JDBC
- JDBC进阶版本(JDBCVersion2)
- JDBC从瞎搞到进阶
- JDBC进阶之存储过程+CallableStatement
- 杂谈
- java中length,length(),size()区别
- Centos开机自启动redis
- 50个提高PHP编程效率的方法(整理)
- “无法识别的USB设备”如何解决
- JDBC进阶
- JavaFX学习之Layout
- 动态二维数组实现
- 四类八种数据类型 /java初学
- 【poj1015】 Jury Compromise
- c3p0与dbcp区别
- 【重庆市NOIP模拟赛】业务
- 更厚了
- jQuery的概念