大对象(LOB)、批处理与元数据

1.大对象LOB

LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的数据)。分为BLOB 和CLOB。
大文本CLOB:
CLOB(Character Large Object)
– 用于存储大量的文本数据。
– 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
• Mysql中文本相关类型:
TINYTEXT 最大长度为255(21–1)字符的TEXT列。
TEXT[(M)] 最大长度为65,535(22–1)字符的TEXT列。
MEDIUMTEXT 最大长度为16,777,215(23–1)字符的TEXT列。
LONGTEXT 最大长度为4,294,967,295或4GB(24–1)字符的TEXT列。

大二进制BLOB:

BLOB(Binary Large Object)
– 用于存储大量的二进制数据,如图像、视频、音频,文件等。
– 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的。而非一般的字段,一次即可读出数据。
Mysql中相关类型:
– TINYBLOB最大长度为255(25–1)字节的BLOB列。
– BLOB[(M)]最大长度为65,535(26–1)字节的BLOB列。
– MEDIUMBLOB最大长度为16,777,215(27–1)字节的BLOB列。
– LONGBLOB最大长度为4,294,967,295或4GB(28–1)字节的BLOB列。

实际使用中根据需要存入的数据大小定义不同的BLOB类型。
需要注意的是:如果存储的文件过大,数据库的性能会下降。(所以,一般不会存在数据库中)

例子:插入大文本和大二进制到数据库

package cn.njit.jdbc;

/****
 * 大对象插入MySQL
 */
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BigTest {

	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		String jdbcurl = "jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
		String user = "root";
		String password = "admin";
		try {
			Connection conn = DriverManager.getConnection(jdbcurl, user, password);
			PreparedStatement psmt;
			String sql = "insert stustu(name,introduce,img) values(?,?,?);";

			psmt = conn.prepareStatement(sql);

			psmt.setString(1, "张三");

			String txtpath = "D:\\FileDemo\\First\\studentInfo.txt";
			Reader rd = null;
			try {
				rd = new FileReader(txtpath);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			psmt.setCharacterStream(2, rd);
			String imgpath = "D:\\FileDemo\\First\\233\\jpg1.jpg";
			InputStream is = null;
			try {
				is = new FileInputStream(imgpath);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
			psmt.setBinaryStream(3, is);

			int rows = psmt.executeUpdate();
			System.out.println(rows);

			try {
				rd.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			psmt.close();
			conn.close();
		} catch (SQLException e) {

			e.printStackTrace();
		}
}

}
在这里插入图片描述
注:Navicat没有查看图片的功能;
在这里插入图片描述
在这里插入图片描述

例子:读取大文本和大二进制

package cn.njit.jdbc;
/****
 * MySQL大对象查询
 */
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class BigTest2 {

	public static void main(String[] args) throws IOException {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		String jdbcurl="jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
		String user="root";
		String password="admin";
		try {
			Connection conn=DriverManager.getConnection(jdbcurl, user, password);
	
		PreparedStatement psmt;
		String sql="select * from stustu where name='张三'";
		
		psmt=conn.prepareStatement(sql);
		ResultSet rs=psmt.executeQuery();

		if(rs.next()) {
		String str=rs.getString("introduce");
		System.out.println(str);
		//---------------------------------
		InputStream is=rs.getBinaryStream("img");
		//_______________________________
		OutputStream os;
		int len;
		byte[] buf=new byte[1024];
		len=is.read(buf);
		while(-1!=len) {
			os=new FileOutputStream("D:\\FileDemo\\First\\Demo1016.jpg",true);
			

			os.write(buf, 0, len);
			os.close();
		    len=is.read(buf);
		}
		is.close();
		}
		
		psmt.close();
		conn.close();
		} catch (SQLException e) {	
			e.printStackTrace();
		}
}
}

2批处理
批处理相关方法
void addBatch(String sql) 添加批处理
void clearBatch() 清空批处理
int[] executeBatch() 执行批处理

例子:插入100条记录到表中,每次插入10条,共执行10次

package cn.njit.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

/****
 * 批处理
 * @author Administrator
 *
 */
public class BatchTest {

	public static void main(String[] args) throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		String jdbcurl="jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
		String user="root";
		String password="admin";
		Connection conn=DriverManager.getConnection(jdbcurl, user, password);
		
		PreparedStatement psmt;
		String sql="insert into user(username,PASSWORD) values(?,?);";
		psmt=conn.prepareStatement(sql);
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				psmt.setString(1, "user"+(1000+j+10*i));
				psmt.setString(2, "password"+(1000+j+10*i));
				psmt.addBatch();
			}
			psmt.executeBatch();
			psmt.clearBatch();
		}
		psmt.close();
		conn.close();

	}

}

在这里插入图片描述

扫描二维码关注公众号,回复: 4191928 查看本文章

在这里插入图片描述

3元数据

 在jdbc中获取数据库的定义,例如:数据库、表、列的定义信息。就用到元数据。
 在jdbc中可以使用: 数据库元数据、参数元数据、结果集元数据
 (元数据定义相关api, …MetaData)
DatabaseMetaData 类
DatabaseMetaData 类中提供了许多方法用于获得数据源的各种信息,通过这些方法可以非常详细的了解数据库的信息:
getURL():返回一个String类对象,代表数据库的URL。
getUserName():返回连接当前数据库管理系统的用户名。
isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
getDatabaseProductName():返回数据库的产品名称。
getDatabaseProductVersion():返回数据库的版本号。
getDriverName():返回驱动驱动程序的名称。
getDriverVersion():返回驱动程序的版本号。

ParameterMetaData类
ParameterMetaData主要是针对PreparedStatement对象和其预编译的SQL命令语句提供一些信息,比如像”insert into account(id,name,money) values(?,?,?)”这样的预编译SQL语句,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等等,详细请看有关ParameterMetaData的API文档:
getParameterCount():获取预编译SQL语句中占位符参数的个数
String getParameterTypeName(int param)):获取预编译SQL语句中占位符参数的数据类型

要获取getParameterTypeName,需要修改url,添加参数 generateSimpleParameterMetadata=true:
String url=“jdbc:mysql://localhost:3306/test?generateSimpleParameterMetadata=true”;

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

package cn.njit.jdbc;
/****
 * MySQL大对象查询
 */
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class BigTest2 {

	public static void main(String[] args) throws IOException {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		String jdbcurl="jdbc:mysql://localhost:3306/njit?useUnicode=true&characterEncoding=UTF-8";
		String user="root";
		String password="admin";
		try {
			Connection conn=DriverManager.getConnection(jdbcurl, user, password);
			DatabaseMetaData dbmd=conn.getMetaData();
			System.out.println(dbmd.getDatabaseProductName());
			System.out.println(dbmd.getUserName());
			
			
		PreparedStatement psmt;
		String sql="select * from stustu where name='张三'";
		
		psmt=conn.prepareStatement(sql);
		//请求参数元数据
		ParameterMetaData pmd=psmt.getParameterMetaData();
		System.out.println("ParameterCount:"+pmd.getParameterCount());
		//System.out.println("ParameterTypeName:"+pmd.getParameterTypeName(1));
		
		
		
		ResultSet rs=psmt.executeQuery();
		//结果元数据
		ResultSetMetaData rsmd=rs.getMetaData();
		System.out.println("column count:"+rsmd.getColumnCount());
		System.out.println("cloumn name:"+rsmd.getColumnName(1));
		
		if(rs.next()) {
		String str=rs.getString("introduce");
		System.out.println(str);
		//---------------------------------
		InputStream is=rs.getBinaryStream("img");
		//_______________________________
		OutputStream os;
		int len;
		byte[] buf=new byte[1024];
		len=is.read(buf);
		while(-1!=len) {
			os=new FileOutputStream("D:\\FileDemo\\First\\Demo1016.jpg",true);
			

			os.write(buf, 0, len);
			os.close();
		    len=is.read(buf);
		}
		is.close();
		}
		
		psmt.close();
		conn.close();
		} catch (SQLException e) {	
			e.printStackTrace();
		}
	

	}

}

在这里插入图片描述


  1. 8 ↩︎

  2. 16 ↩︎

  3. 24 ↩︎

  4. 32 ↩︎

  5. 8 ↩︎

  6. 16 ↩︎

  7. 24 ↩︎

  8. 32 ↩︎

猜你喜欢

转载自blog.csdn.net/AirTrioa/article/details/83096706
LOB