1. 程式人生 > >JDBC元資料,Blob用法總結

JDBC元資料,Blob用法總結

從上一篇部落格中,我們知道,Java通過JDBC獲得連線後,得到一個Connection物件.咱們可以從這個物件中獲得有關資料庫管理系統的各種資訊,包括資料庫中各個表,表中的各個列,資料型別,觸發器,儲存過程等各方面的資訊。根據這些資訊,JDBC可以訪問一個事先並不瞭解的資料庫。

   獲得上面各個資訊都是通過DatabaseMetaData類的物件上實現的,而DatabaseMetaData物件是在connection上獲取的。

DatabaseMetaData類

•DatabaseMetaData 類中提供了許多方法用於獲得資料來源的各種資訊,通過這些方法可以非常詳細的瞭解資料庫的資訊:
getURL():返回一個String類物件,代表資料庫的URL。 getUserName():返回連線當前資料庫管理系統的使用者名稱。 isReadOnly():返回一個boolean值,指示資料庫是否只允許讀操作。 getDatabaseProductName():返回資料庫的產品名稱。 getDatabaseProductVersion():返回資料庫的版本號。 getDriverName():返回驅動驅動程式的名稱。 getDriverVersion():返回驅動程式的版本號。 getCatalogs() 返回一個ResultSet結果集,包含mysql裡面有哪些資料庫。
                       DatabaseMetaData data=connection.getMetaData();
			//可以得到資料庫本身的一些基本資訊 
			int version = data.getDatabaseMajorVersion();
			System.out.println(version);
				
			String name=	data.getDriverName();
			System.out.println(name);
			//得到Mysql中有哪些資料庫,rs中只包含一列,所以用getString(1)方法獲得第一列的字串
			rs= data.getCatalogs();
			while(rs.next()){
				System.out.println(rs.getString(1));
			}

ResultSetMetaData類:

咋一看這個和ResultSet是不是很像?因為它就是從ResultSet中獲得的,可得到結果集中的一些引數。getColumnName(int column):獲取指定列的名稱 –getColumnCount():返回當前ResultSet 物件中的列數。 –getColumnTypeName(int column):檢索指定列的資料庫特定的型別名稱。 –getColumnDisplaySize(int column):指示指定列的最大標準寬度,以字元為單位。 –isNullable(int column):指示指定列中的值是否可以為 null。 – isAutoIncrement(int column):指示是否自動為指定列進行編號,這樣這些列仍然是隻讀的。
ResultSetMetaData rsmd =resultSet.getMetaData();
			//得到列的個數
			int columnCount =rsmd.getColumnCount();
			System.out.println(columnCount);
			
			for(int i=0;i<columnCount;i++){
				//得到列名
				String columnName= rsmd.getColumnName(i+1);
				//得到列的別名
				String columnLabel =rsmd.getColumnLabel(i+1);
				
				System.out.println(columnName+"&&&&"+columnLabel);
			}

得到插入語句執行之後的主鍵: 1.使用過載的preparedStatement(sql,flag)來生成preparedStatement物件 2.通過呼叫preparedStatement的 getGeneratedKeys()方法獲取結果集ResultSet。
connection=JDBCTools.getConnection();
		String sql="insert into customer (name,email,birth) values(?,?,?); ";
		//preparedStatement=connection.prepareStatement(sql);
		//使用過載的prepareStatement(sql,flag)來生成PrepareStatement物件
		preparedStatement=connection.prepareStatement(sql,
				Statement.RETURN_GENERATED_KEYS);
		
		preparedStatement.setString(1, "daming");
		preparedStatement.setString(2, "[email protected]");
		preparedStatement.setDate(3, new Date(new java.util.Date().getTime()));
		
		
		preparedStatement.executeUpdate();
		//通過getGeneratedKeys()方法  得到的是執行該語句後得到的新生成的主鍵值
		//返回一個結果集
		//在resultSet中只有一列 
	ResultSet rs=	preparedStatement.getGeneratedKeys();

	if(rs.next()){
		System.out.println(rs.getObject(1));
		
	}
	//得到該結果集對應的元資料物件,用於得到結果集中的列數
	ResultSetMetaData rsmd = rs.getMetaData();
	for(int i=0;i<rsmd.getColumnCount();i++){
		System.out.println(rsmd.getColumnName(i+1));
		//輸出只有一列,即主鍵值。
	}

BLOB:

LoB ,即Large Objects(大物件),是用來儲存大量的二進位制和文字資料的一種資料型別(一個LOB欄位可儲存可多達4GB的資料)。 •LOB 分為兩種型別:內部LOB和外部LOB。 –內部LOB將資料以位元組流的形式儲存在資料庫的內部。因而,內部LOB的許多操作都可以參與事務,也可以像處理普通資料一樣對其進行備份和恢復操作。Oracle支援三種類型的內部LOB: •BLOB(二進位制資料)   •CLOB(單位元組字元資料)  •NCLOB(多位元組字元資料)。 –CLOB和NCLOB型別適用於儲存超長的文字資料,BLOB欄位適用於儲存大量的二進位制資料,如影象、視訊、音訊,檔案等。 •MySQL中,BLOB是一個二進位制大型物件,是一個可以儲存大量資料的容器,它能容納不同大小的資料。 •MySQL的四種BLOB型別(除了在儲存的最大資訊量上不同外,他們是等同的) •實際使用中根據需要存入的資料大小定義不同的BLOB型別。
需要注意的是:如果儲存的檔案過大,資料庫的效能會下降。 步驟:       前面的步驟與用preparedStatement物件執行插入語句一致。在插入BLOB對應的列的值時,呼叫setBlob()方法,傳入一個列數和一個輸入流。然後再執行executeUpdate()語句. 程式碼:
connection=JDBCTools.getConnection();
		String sql="insert into customer (name,email,birth,picture)" +
				" values(?,?,?,?); ";
		
		preparedStatement=connection.prepareStatement(sql);
		preparedStatement.setString(1, "daming22");
		preparedStatement.setString(2, "[email protected]");
		preparedStatement.setDate(3, new Date(new java.util.Date()
		.getTime()));
		InputStream inputStream =new FileInputStream("zys.jpg");
		//傳入一個輸入流
		preparedStatement.setBlob(4, inputStream);
		preparedStatement.executeUpdate();

相對應的,在讀取blob的時候,也需要一個輸出流 呼叫resultSet的getBlob()方法得到一個blob物件。呼叫blob的getBinaryStream方法得到輸入流,然後再使用IO操作即可
connection =JDBCTools.getConnection();
			String sql ="select id,name,email,birth,picture from customer where id =43";
			preparedStatement =connection.prepareStatement(sql);
			//得到結果集
			resultSet =preparedStatement.executeQuery();
			
			if(resultSet.next()){
				int id= resultSet.getInt(1);
				String name =resultSet.getString(2);
				String email = resultSet.getString(3);
				Blob b=		resultSet.getBlob(5);
				System.out.println(b);
				
				System.out.println(id+","+name+","+email);
				InputStream in =b.getBinaryStream();//輸入流
				OutputStream ous =new FileOutputStream("flower.jpg");
				
				byte [] buffer =new byte[1024];
				int len=0;
				while((len=in.read(buffer))!= -1){
					ous.write(buffer, 0, len);
				}
				ous.close();//關閉輸出流
				in.close();//關閉輸入流
			}

當然,以上這些都是一些簡單用法。