JDBC - jdbc學習總結

Java DataBase Connectivity :可以爲多種關係型數據庫DBMS 提供統一的訪問方式,用Java來操作數據庫
在這裏插入圖片描述

一.JDBC訪問數據庫的具體步驟(以MySQL爲例):

1.導入驅動,加載具體的驅動類

1)導入驅動:

eclipse:
將E:\XunLei\Mysql\mysql-connector-java-8.0.19.jar加入項目的JER System Libray\src,
再右擊文件,增加到類路徑裏面,Build Path->Add to Build Path

idea:
File->Project Structure->Libraies->點擊加號>找到文件mysql-connector-java-8.0.19.jar->ok
運行

出現問題:Java程序運行時出現時提示配置Edit Configurations
解決方法:
在run裏打開Edit Configurations,點擊加號新建Application,選中自己的項目,填寫Name、Main class名稱,JER位置等(如圖所示),其他的基本都是默認,點擊OK。
在這裏插入圖片描述
2)加載具體的驅動類:
Class.forName(“com.mysql.jdbc.Driver”);
2.與數據庫建立連接
3.發送sql,執行語句
4.返回處理條數(增刪改)/處理結果集 (查詢)

5.JDBC模板:

try{
Class.forName("具體驅動類");  //導入驅動包、加載具體驅動類
connection = DriverManager.getConnection(...);   //與數據庫建立連接
stmt = connection.createStatement();  //獲取操作數據庫的對象
rs = pstmt.executeQuery();  //返回處理條數(增刪改)/處理結果集 (查詢)

while(rs.next()){ rs.getXxx(..) ;}
}catch(ClassNotFoundException e  )
{ ...}
catch(SQLException e)
{...
}
catch(Exception e)
{...
}
finally
{
	//打開順序,與關閉順序相反,最先打開的最後關閉
	if(rs!=null)rs.close()
	if(stmt!=null) stmt.close();
	if(connection!=null)connection.close();
}

6.示例程序見:
https://gitee.com/ma_meng_jiao/JDemo/blob/master/src/demo.java

二、數據庫驅動

在這裏插入圖片描述
*使用jdbc操作數據庫時,如果對數據庫進行了更換,只需要替換:驅動、具體驅動類、連接字符串、用戶名、密碼

三、JDBC API的主要功能:

1.
DriverManager : 管理jdbc驅動
2.
Connection: 連接
eg:
Connection connection =DriverManager.getConnection(URL,USERNAME,PWD);
3.
1)Statement(PreparedStatement) :增刪改查
eg:
Statement stmt = connection.createStatement();
對數據庫的操作:
    增刪改:executeUpdate();
    查詢:executeQuery();

2)還有幾種衍生的語句:
PreparedStatement、CallableStatement Connection
產生的方法:prepareStatement()、prepareCall();

3)ResultSet :返回的結果集
**rs默認指向第0行,和迭代器運行相似*
eg:
ResultSet rs = stmt.executeQuery(sql);

4)PreparedStatement的預編譯優點:
sql語句可能存在佔位符?,在創建PreparedStatement 對象時,將sql預編譯 prepareStatement(sql),然後獲取值setXxx(),替換佔位符?,在執行executeUpdate()
eg:
Scanner input= new Scanner(System.in); System.out.println("請輸入id:");
int id = input.nextInt() ;

String sql ="select count(*) from 13 where id= ? ";
pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, id);
rs = pstmt.executeQuery();

四、處理數據類型

1.稍大型數據:
通過JDBC存儲文件路徑,然後根據IO操作處理

2. CLOB:大文本數據 (小說)
 BLOB:二進制文本 (音樂、視頻)
1)clob:
大文本數據(超過4000字節),字符流 Reader Writer
存儲:
1.prepareStatement pstmt 的? 代替小說內容 (佔位符)
2.pstmt.setCharacterStream(2, reader, (int)file.length()); 將上一步的?替換爲 小說

*注意第三個參數需要是 Int類型

eg:

String sql = "insert into mynovel values(?,?)";
			// c.發送sql,執行(增刪改、查)
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, 1);
			File file = new File("E:\\all.txt");
			InputStream in = new FileInputStream( file) ;
			Reader reader = new InputStreamReader( in   ,"UTF-8") ;//轉換流 可以設置編碼
			pstmt.setCharacterStream(2, reader,  (int)file.length());
			int count =pstmt.executeUpdate() ;
			// d.處理結果
			if (count > 0) {  
				System.out.println("操作成功!");
			}
			reader.close();

取走:
1.通過Reader reader = rs.getCharacterStream(“NOVEL”) ; 將cloc類型的數據 保存到Reader對象中
2. 將Reader通過Writer輸出即可。
eg:

      String sql = "select NOVEL from mynovel where id = ? ";
			// c.發送sql,執行(查)
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, 1);
			
			rs = pstmt.executeQuery() ;
			//setXxxx getXxxx      setInt  getInt
			if(rs.next())
			{
				Reader reader = rs.getCharacterStream("NOVEL") ;
				Writer writer = new FileWriter("src/小說.txt");
				
				//將小說從內存->緩存->硬盤,chs就是緩存
				//reader->chs->writer
				char[] chs = new char[100] ;
				int len = -1;
				while(  (len = reader.read(chs)) !=-1 ) {
					writer.write( chs,0,len  );
				}
				writer.close();
				reader.close();
			}

2)
blob:二進制 字節流 InputStream OutputStream
與CLOB步驟基本一致,區別:setBinaryStream(…) getBinaryStream(…)
eg:

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class JDBCBlob {
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:ORCL";
	private static final String USERNAME = "scott";
	private static final String PWD = "tiger";

	//通過jdbc存儲二進制類型 (mp3)
	//設置BLOB類型:
	public static void blobDemo() {
		Connection connection = null;
		PreparedStatement pstmt = null;
		try {
			// a.導入驅動,加載具體的驅動類
			Class.forName("oracle.jdbc.OracleDriver");// 加載具體的驅動類
			// b.與數據庫建立連接
			connection = DriverManager.getConnection(URL, USERNAME, PWD);
			
			String sql = "insert into mymusic values(?,?)";
			// c.發送sql,執行(增刪改、查)
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, 1);
			File file = new File("d:\\luna.mp3");
			
			InputStream in = new FileInputStream(file );
			pstmt.setBinaryStream(2,in ,(int)file.length()  );
			
			
			int count =pstmt.executeUpdate() ;
			// d.處理結果
			if (count > 0) {  
				System.out.println("操作成功!");
			}
			
			in.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			try {
				 if(pstmt!=null) pstmt.close();// 對象.方法
				 	 if(connection!=null)connection.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	//讀取二進制文件
	public static void blobReaderDemo() {
		Connection connection = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null ; 
		try {
			// a.導入驅動,加載具體的驅動類
			Class.forName("oracle.jdbc.OracleDriver");// 加載具體的驅動類
			// b.與數據庫建立連接
			connection = DriverManager.getConnection(URL, USERNAME, PWD);
			
			String sql = "select music from mymusic where id = ? ";
			
			
			// c.發送sql,執行(查)
			pstmt = connection.prepareStatement(sql);
			pstmt.setInt(1, 1);
			
			rs = pstmt.executeQuery() ;
			if(rs.next())
			{
				InputStream in = rs.getBinaryStream("music") ;
				OutputStream out = new FileOutputStream("src/music.mp3") ;
				
				byte[] chs = new byte[100] ;
				int len = -1;
				while(  (len = in.read(chs)) !=-1 ) {
					out.write( chs,0,len  );
				}
				out.close();
				in.close();
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch(Exception e) {
			e.printStackTrace();
		}
		finally {
			try {
				 if(pstmt!=null) pstmt.close();// 對象.方法
				 if(connection!=null)connection.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
//		blobDemo() ;
		blobReaderDemo();
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章