JDBC元資料,Blob用法總結
阿新 • • 發佈:2018-12-31
從上一篇部落格中,我們知道,Java通過JDBC獲得連線後,得到一個Connection物件.咱們可以從這個物件中獲得有關資料庫管理系統的各種資訊,包括資料庫中各個表,表中的各個列,資料型別,觸發器,儲存過程等各方面的資訊。根據這些資訊,JDBC可以訪問一個事先並不瞭解的資料庫。
獲得上面各個資訊都是通過DatabaseMetaData類的物件上實現的,而DatabaseMetaData物件是在connection上獲取的。
DatabaseMetaData類
•DatabaseMetaData 類中提供了許多方法用於獲得資料來源的各種資訊,通過這些方法可以非常詳細的瞭解資料庫的資訊: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();//關閉輸入流
}
當然,以上這些都是一些簡單用法。