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();
}
}