JDBC批量处理和blob类型处理

批量处理JDBC语句提高处理速度

当需要成批插入或者更新记录时。可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率
JDBC的批量处理语句包括下面两个方法:
addBatch(String):添加需要批量处理的SQL语句或是参数;
executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
Statement实现批量处理;
PreparedStatement实现批量处理

/**
	 * 用Statement批量保存5000条记录 mysql statement batch time=3047 oracle statement
	 * batch time=2453
	 */
	@Test
	public void testStatementBatch() {
		Connection conn = null;
		Statement stmt = null;
		long time = System.currentTimeMillis();
		conn = OracleJDBCUtils.getConnection();
		try {
			stmt = conn.createStatement();
			for (int i = 0; i < 5000; i++) {
				String sql = "INSERT INTO b_user(id,NAME,PASSWORD,age) VALUES(1,'t','t',1)";
				stmt.addBatch(sql);
			}
			stmt.executeBatch();
			System.out.println("mysql statement batch time=" + (System.currentTimeMillis() - time));
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			OracleJDBCUtils.closeResource(conn, stmt, null);
		}
	}

	/**
	 * 用PreparedStatement批量保存5000条记录 
	 * mysql preparedstatement batch time=3094
	 * 5000 
	 * oracle preparedstatement batch time=265 oracle preparedstatement
	 * batch time=422 50000
	 * oracle preparedstatement batch time=2187
	 */
	@Test
	public void testPreparedStatementBatch() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		long time = System.currentTimeMillis();
		conn = OracleJDBCUtils.getConnection();
		String sql = "INSERT INTO b_user(id,NAME,PASSWORD,age) VALUES(?,?,?,?)";
		try {
			pstmt = conn.prepareStatement(sql);
			for (int i = 0; i < 500000; i++) {
				pstmt.setInt(1, 1);
				pstmt.setString(2, "t");
				pstmt.setString(3, "t");
				pstmt.setInt(4, 1);
				pstmt.addBatch();//这里一定不能传sql字符串 
				if (i % 50000 == 0) {
					pstmt.executeBatch();
					pstmt.clearBatch();
				}
			}
			pstmt.executeBatch();
			System.out.println("oracle preparedstatement batch time="
					+ (System.currentTimeMillis() - time));
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			OracleJDBCUtils.closeResource(conn, pstmt, null);
		}
	}



MySQLBLOB 类型介绍 

大对象操作 :
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列( TinyBlob、Blob、MediumBlob和LongBlob ),除了在存储的最大信息量上不同外,他们是等同的。
MySQL的四种BLOB类型

l 实际使用中根据需要存入的数据大小定义不同的 BLOB 类型。需要注意的是:

如果你存储的文件过大,数据库的性能会下降很多。 l

l 4 TEXT 类型: TINYTEXT TEXT MEDIUMTEXT LONGTEXT
。这些对应 4 BLOB 类型,有相同的最大长度和存储需求 
package com.jiangyi.testblob;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.sun.corba.se.spi.orbutil.fsm.Input;

public class TestBlob {
	private static final String URL = "jdbc:mysql://localhost:3306/t";
	private static final String USER = "root";
	private static final String PASSWORD = "";
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/*
	 * 
	 * 保存带图片的数据
	 */
	@Test
	public void save() {
		Connection conn = null;
		String sql = "insert into t(name,headimage) values ('tom',?)";
		PreparedStatement pstmt = null;
		try {
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			pstmt = conn.prepareStatement(sql);
			InputStream in = new FileInputStream(
					"D:/allworkspace/xxxx/day14_jdbc/src/com/jiangyi/testblob/mm.jpg");
			// 虽然jdbc定义里所有的方法 但是mysql并没有真正实现所有的犯法
			pstmt.setBinaryStream(1, in, in.available());
			// pstmt.setBlob(2,in,in.available());//没有实现 无法使用
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
				try {
					pstmt.close();
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			
		}

	}

	/*
	 * 
	 * 读取带图片的数据
	 */
	@Test
	public void read() {
		Connection conn = null;
		String sql = "select * from t where id=1";
		PreparedStatement pstmt = null;
		ResultSet rs=null;
		try {
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			pstmt = conn.prepareStatement(sql);
			rs=	pstmt.executeQuery();
			while(rs.next()){
			Blob blob=rs.getBlob(4);	
				InputStream in=blob.getBinaryStream();
				String path="D:/allworkspace/xxxx/day14_jdbc/src/com/jiangyi/testblob/new.jpg";
				OutputStream out=new FileOutputStream(path);
				byte[] buffer = new byte[1024];
				int len = -1;
				while((len=in.read(buffer))!=-1) {
					out.write(buffer, 0, len);
				}
				out.flush();
				out.close();
				in.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		
	}

	}

}

使用JDBC驱动程序处理元数据

元数据(MetaData):是关于数据的数据,也就是对数据的定义和描述
JDBC中定义了2个元数据类型
DataBaseMetaData:
数据库的相关信息,表的相关信息等等
通过Connection对象得到此类型的对象
ResultSetMetaData:
结果集中列的数量,类型和属性等信息
通过ResultSet对象得到


DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。

获取结果集的元数据

可用于获取关于 ResultSet 对象中列的类型和属性信息的对象:
getColumnName(int column):获取指定列的名称
getColumnCount():返回当前 ResultSet 对象中的列数。
getColumnTypeName(int column):检索指定列的数据库特定的类型名称。
getColumnDisplaySize(int column):指示指定列的最大标准宽度,以字符为单位。
isNullable(int column):指示指定列中的值是否可以为 null。
isAutoIncrement(int column):指示是否自动为指定列进行编号,这样这些列仍然是只读的。 
用于获取关于 ResultSet 对象中列的类型和属性信息的对象

ResultSet rs = stmt.executeQuery("select * from students");
//可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
//获取此 ResultSet 对象的列的编号、类型和属性。
ResultSetMetaData rsmd = rs.getMetaData();
System.out.println("有"+rsmd.getColumnCount()+"字段");
System.out.println("第1个字段名称是:"+rsmd.getColumnName(1));





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 JDBC 向 Oracle 数据库写入 BLOB 类型数据的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class WriteBlobToOracle { public static void main(String[] args) { // Oracle JDBC 驱动 String driver = "oracle.jdbc.driver.OracleDriver"; // 数据库连接信息 String url = "jdbc:oracle:thin:@localhost:1521:ORCL"; String user = "username"; String password = "password"; Connection conn = null; PreparedStatement pstmt = null; try { // 加载驱动程序 Class.forName(driver); // 获取数据库连接 conn = DriverManager.getConnection(url, user, password); // SQL 插入语句,参数使用 ? 占位符 String sql = "INSERT INTO blob_table (id, file_name, file_content) VALUES (?, ?, ?)"; // 创建 PreparedStatement 对象 pstmt = conn.prepareStatement(sql); // 设置参数 pstmt.setInt(1, 1); pstmt.setString(2, "test.txt"); // 读取文件内容到 InputStream 对象 File file = new File("test.txt"); InputStream is = new FileInputStream(file); // 设置 BLOB 类型参数 pstmt.setBinaryStream(3, is, (int) file.length()); // 执行 SQL 语句 int rowsAffected = pstmt.executeUpdate(); System.out.println(rowsAffected + " rows affected."); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { // 关闭 PreparedStatement 和数据库连接 try { if (pstmt != null) pstmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 在上面的示例中,我们使用 `setBinaryStream()` 方法将文件内容写入 BLOB 字段。该方法需要三个参数: - 参数索引:指定 BLOB 参数的位置,从 1 开始计数。 - InputStream 对象:包含要写入 BLOB 字段的数据。 - BLOB 字段的长度:指定数据长度,使用文件的长度。 在插入数据之前,我们需要创建一个表来存储 BLOB 类型数据: ```sql CREATE TABLE blob_table ( id NUMBER(10) PRIMARY KEY, file_name VARCHAR2(50), file_content BLOB ); ``` 这个表包含三个字段: - `id`:表示唯一标识符。 - `file_name`:表示文件名。 - `file_content`:表示 BLOB 类型字段,用于存储文件内容。 最后,需要将文件 `test.txt` 放在项目根目录下,这个文件将被写入 BLOB 字段。如果需要写入其他文件,只需将文件名和路径更改为相应的值即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值