1. 程式人生 > >大物件(LOB)、批處理與元資料

大物件(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();

	}

}

在這裡插入圖片描述

在這裡插入圖片描述

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 ↩︎