目錄
- JDBC
- JDBC API主要功能
- JDBC訪問資料庫的具體步驟
- JDBCDemo代碼
- 資料庫驅動
- 處理CLOB/BLOB型別
- 總結
本文最初由security發布于security的博客,禁止任何形式的剽竊行為
轉載原創文章請注明,轉載自:security的博客
本文學習自DT課堂原名顏群
JDBC
- JDBC:Java DataBase Connectivity
可以為多種不同關系型資料庫提供統一訪問方式,用Java操作資料庫- 架構:
- Java程式
通過JDBC操縱
JDBC DriverManager
操縱
Oracle或MySQL等關系型資料庫驅動程式(jar包)
操縱
Oracle或MySQL資料庫等
- jdbc介面、方法、類:API
- jdbc API:提供了各種操作訪問介面,Connection、Statement、PreparedStatement、ResultSet
- jdbc DriverManger:給管理不同的資料庫驅動
- 各種資料庫驅動:相應的資料庫廠商提供的(第三方公司提供),連接或者直接操作資料庫
JDBC API主要功能
DriverManger:管理驅動
Connection:連接(通過DriverManager產生)
Statement(PreparedStatement):增刪改查(通過Connection產生)
CallableStatement:呼叫資料庫中的存盤程序/存盤函式(通過Connection產生)
ResultSet:回傳的結果集(上面的Statement等產生)
- Connection產生操作資料庫的物件:
- Connection產生Statement物件:createStatement()
- Connection產生PreparedStatement物件:prepareStatement()
- Connection產生CallableStatement物件:prepareCall()
- Statement操作資料庫:
- 增刪改:executeUpdate()
- 查:executeQuery()
- PreparedStatement操作資料庫(與Statement操作資料庫不同的是SQL陳述句需要放在前面,執行時不需要SQL,因為之前已經預編譯)
- 增刪改:executeUpdate()
- 查:executeQuery()
- 賦值操作:set...()先用?充當占位符,再用set..更改?
- 推薦使用PreparedStatement:原因如下:
- 編碼更加簡便,避免了字串拼接
- 提高性能,因為有預編譯,編譯一次,重復使用
- 安全(可以有效防止SQL注入)
SQL注入:將客戶輸入的內容和開發人員的SQL陳述句混為一體 Statement:存在被SQL注入的風險 (例如輸入用戶名:任意值 ' or 1=1 -- 密碼:任意值)
- CallableStatement:呼叫存盤程序、存盤函式
- connection.prepareCall(引數:存盤程序或存盤函式名)
- 引數格式:
- 存盤程序(無回傳值return,用out引數替代):
{call 存盤程序名(引數串列)}- 存盤函式(有回傳值return)
{?=call 存盤函式名(引數串列)}
- ResultSet:保存結果集
- next():游標下移判斷是否有下一條資料,true/false
- previous():true/false
- getXXX(欄位名|位置):獲取具體的欄位值
JDBC訪問資料庫的具體步驟
- 匯入驅動包,加載具體的驅動類
- 與資料庫建立連接
- 發送sql,執行
- 處理結果集(查詢)
JDBCDemo代碼
import java.sql.*;
public class JDBCDemo {
private static final String URL="jdbc:mysql://localhost:3306/學生作業管理資料庫?serverTimezone=UTC";
private static final String USERNAME="root";
private static final String PWD="1998";
/*
public static void update() { //增刪改
Connection con =null;
Statement stmt = null;
try {
//1. 匯入驅動,加載具體的驅動類
Class.forName("com.mysql.jdbc.Driver");
//2. 與資料庫建立連接
con= DriverManager.getConnection(URL,USERNAME,PWD);
//3. 發送sql,執行(增刪改、查)
stmt=con.createStatement();
String sql="INSERT INTO 學生表 (學號,姓名,性別,專業班級,出生日期,聯系電話) "
+ "VALUES(0538,'于蘭蘭','女','生物05','1984-2-20', '1331200××××');";
//4. 執行SQL
int count = stmt.executeUpdate(sql);
//5. 處理結果
if (count>0)
{
System.out.println("操作成功");
}
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
catch(SQLException e) {
e.printStackTrace();
}
catch(Exception e) {
e.printStackTrace();
}
finally{
try{
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
*/
public static void query() { //查詢
Connection con =null;
Statement stmt = null;
ResultSet rs=null;
try {
//1. 匯入驅動,加載具體的驅動類
Class.forName("com.mysql.jdbc.Driver");
//2. 與資料庫建立連接
con= DriverManager.getConnection(URL,USERNAME,PWD);
//3. 發送sql,執行(查)
stmt=con.createStatement();
String sql="select * from 學生表";
//4. 執行SQL
rs = stmt.executeQuery(sql); //executeUpdate改為executeQuery
//5. 處理結果
while(rs.next()) {
int sno =rs.getInt("學號");
String sname =rs.getString("姓名");
System.out.println(sno+"--"+sname);
}
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
catch(SQLException e) {
e.printStackTrace();
}
catch(Exception e) {
e.printStackTrace();
}
finally{
try{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO 自動生成的方法存根
// update();
query();
}
}
資料庫驅動
- Oracle
- 驅動jar
ojdbc-x.jar- 具體驅動類
oracle.jdbc.OracleDriver- 連接字串(資料庫名:IP:埠)
jdbc:oracle:thin:@localhost:1521:ORCL
- MySQL
- 驅動jar
mysql-connector-java-x.jar- 具體驅動類
com.mysql.jdbc.Driver- 連接字串
jdbc:mysql://localhost:3306/資料庫實體名
- SqlServer
- 驅動jar
sqljdbc-x.jar- 具體驅動類
com.microsoft.sqlserver.jdbc.SQLServerDriver- 連接字串
jdbc:microsoft:localhost:1433;databsename=資料庫實體名
- 使用jdbc操作資料庫時,如果對資料庫進行了更換,只需要替換:
驅動、驅動類、連接字串、用戶名、密碼
處理CLOB/BLOB型別
- 存放稍大型資料:
- 方法1:存盤路徑
通過JDBC存盤檔案路徑,然后根據IO操作處理- 方法2
- CLOB(Oracle叫法,mysql叫法為TEXT)字符流:大文本資料(小說->資料)
varchar2:4000byte- BLOB位元組流:二進制檔案(一切檔案、圖片,音頻)
總結
- 匯入驅動包、加載具體驅動類
- 與資料庫建立連接
- 通過connection,獲取操作資料庫的物件
- 處理結果集
while(rs.next()){ rs.get...();}
catch(SQLException e){...}
catch(Exception e){...}
finallu{//打開順序,與關閉順序相反
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(connection!=null) connection.close();
}
本文最初由security發布于security的博客,禁止任何形式的剽竊行為
轉載原創文章請注明,轉載自:security的博客
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/173492.html
標籤:Java
