1. 程式人生 > >jdbc 如何處理Blob型別欄位的資料

jdbc 如何處理Blob型別欄位的資料

jdbc處理大物件Blob

 在貼程式碼之前先講一下什麼是LOB大物件資料
 LOB 大物件 是用來儲存大量的二進位制和文字資料的一種資料型別(一個LOB欄位可儲存多達 4GB的資料)

  LOB分類兩種型別:

  • (1)內部,
  • (2)外部

 內部LOB將資料是已位元組流的形式儲存再資料庫的內部,因而LOB的許多操作都可以參與事務,也可以像處理普通資料一樣對其進行備份和恢復操作。
 內部三種類型:

  • (1)BLOB(二進位制資料,用於儲存影象,視訊,檔案等),
  • (2)CLOB(單位元組字元資料,用於儲存超長的文字資料)
  • (3)NCLOB(多位元組字元資料,用於儲存超長的文字資料)

注意: 使用jdbc 向資料庫插入BLOB型別的資料時必須使用 prepareStatement


強制分割線


     列子1:是從一個數據庫中的表(帶有Blob型別)中資料匯入進另一張表(帶有Blob型別)

這裡的關鍵點就是位元組流。


	public static void main(String[] args) throws SQLException, IOException {
		/**
		 * 從一個庫移到另一個庫
		 * **/
		String url = "XXXXXXXXX";
		String driver =	"";
		String username = "XXXXXX";
		String password = "XXXXXX";
		Connection con = null;
		PreparedStatement ps = null;
		InputStream input = null;
		OutputStream osM  = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		try {
			con = DriverManager.getConnection(url, username, password);
			con.setAutoCommit(false);//關閉自動提交
			String MuSql = "select image from sys_image where user_id = 'icc'";
			ps = con.prepareStatement(MuSql);
			ResultSet rs = ps.executeQuery();
			BLOB blob = null;
			while (rs.next()) {
				blob = (BLOB)rs.getBlob("image");
			}
			 input = blob.getBinaryStream();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			byte[] b = new byte[1024];
			int l = 0 ;
			while((l = input.read(b)) != -1) {
				baos.write(b, 0, l);
			}
			
			String updateSql = "insert into  sys_image_test values('yzy',?,sysdate)";
			ps = con.prepareStatement(updateSql);
			ps.setBytes(1, baos.toByteArray());
			ps.executeUpdate();
			input.close();
			baos.close();
			con.commit();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			con.rollback();
		}finally {
			if (con != null) {
				con.close();
			}
			if (ps != null) {
				ps.close();
			}
						
		}
				
	}

例子2:下載圖片


	public static void main(String[] args) throws SQLException {
		/**
		 * 下載圖片
		 * **/
		String url = "jdbc:oracle:thin:@192.168.0.25:1521:orcl";
		String driver =	"";
		String username = "bjsc";
		String password = "bjsc";
		Connection con = null;
		PreparedStatement ps = null;
		InputStream input = null;
		OutputStream osM  = null;
		int i = 0;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		try {
			con = DriverManager.getConnection(url, username, password);
			String MuSql = "select image from sys_image";
			ps = con.prepareStatement(MuSql);
			ResultSet rs = ps.executeQuery();
			BLOB blob = null;
			while (rs.next()) {
				blob = (BLOB)rs.getBlob("image");
				//下載路徑
				String filePath = "F:/img/"+i+".jpg";
				InputStream in = blob.getBinaryStream();
				FileOutputStream out = new FileOutputStream(filePath);
				int l = (int)blob.length();
				byte buffer[] = new byte[l];
				while((l = in.read(buffer))!= -1) {
					out.write(buffer, 0, l);
				}
				out.close();
				in.close();
				i++;
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}finally {
			if (con != null) {
				con.close();
			}
			if (ps != null) {
				ps.close();
			}
		}
	}