JDBC (一)
第一大塊 JDBC概述
一、JDBC概述
- a.概念:Java DataBase Connectivity Java數據庫連接,Java語言操作數據庫
- b.JDBK本質:其實是官方(sun公司)定義的一套操作所有關係型數據的規則,即接口。
各個數據庫廠商去實現這套接口,提供數據庫驅動jar包。我們可以使用
這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類。
- c.快速入門:學會如何導入JDBC的jar包,也就是安裝驅動。
- d.簡單介紹一下JDBC需要使用的對象
DriverManager對象:驅動管理對象
Connection:數據庫連接對象
Statement:執行sql對象(使用靜態的SQL)
ResultSet:結果集對象
PreparedStatemet:執行sql的對象(預編譯的SQL)
第二大塊 詳解各個對象
一、DriverManager類 java.sql.DriverManager
- a.功能:1.註冊驅動 2.獲取數據連接
- b.方法:
static void registerDriver(Driver driver) 註冊給定的驅動程序 實現通過 Class.forName(“com.mysql.jdbc.Driver”);因爲這樣註冊驅動比較方便,直接在穿件類對象時執行靜態代碼塊註冊驅動
Connection getConnection(String url,String user,String password); 獲取數據庫連接
注意:url 指定連接的路徑 語法:jdbc:mysql://ip地址(域名):端口號/數據庫名稱 其實種數據庫使用用的url語法是不一樣的
如果連接的是本機的mysql服務器,並且默認端口是3306,則url可以寫爲jdbc:mysql:///數據庫名稱
說明:這裏其實在參數url中已經是包含了一個數據庫的精確的位置信息了,有數據庫種類、數據庫所在主機的IP地址、數據庫的端口號、你要適用的數據庫
接着的兩個參數其實就是用戶的信息了,一個註冊了的用戶可以連接這個數據庫。
二、Connection接口 java.sql.Connection
- a.功能:1.獲取sql對象 2.管理事務
- b.方法:
Statement creteStatement()
PreparedStatement prepareStatement(String sql)
void setAutoCommit(boolean autoCommit) false就是開啓事務
void commit()
void rollback()
三、Statement接口
- a.功能
- b.方法:
boolean execute(String sql) :可以執行任意的sql 瞭解
int executeUpdate(String sql) :執行DML(insert、update、delete)語句、DDL(create,alter、drop)語句
返回值:影響的行數,可以通過這個影響的行數判斷DML語句是否執行成功 返回值>0的則執行成功,反之,則失敗。
ResultSet executeQuery(String sql) :執行DQL(select)語句
返回值:結果集對象
四、ResultSet接口
- a.功能:
- b.方法:
- boolean next(): 遊標向下移動一行,判斷當前行是否是最後一行末尾(是否有數據),如果是,則返回false,如果不是則返回true
- getXxx(參數):獲取數據
- Xxx:代表數據類型 如: int getInt() , String getString()
- 參數:
- int:代表列的編號,從1開始 如: getString(1)
- String:代表列名稱。 如: getDouble(“balance”)
第三大塊 創建自己的工具類JDBCUtil
一、示例展示:實現了數據庫安裝驅動,建立與數據庫連接,數據庫資源釋放的操作
/*
由於每次對mysql進行操作時都會對一部分繁瑣的代碼進行操作
所以特地創建這個工具類,方便了對數據操作
1.安裝驅動
2.建立和數據庫的連接 DriverManager
3.關閉相關資源 Statement Connection ResultSet
*/
public class JDBCUtil {
//配置文件的內容,一是數據庫連接字段;二是驅動安裝字段;
public static String url,user,password;
public static String driver;
static {
try {
//第一步獲取配置文件信息
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtil.class.getClassLoader();
//這裏需自己新建配置文件,後綴是.properties
URL res = classLoader.getResource("JDBCpeizhi.properties");
String path = res.getPath();
System.out.println(path);
pro.load(new FileReader(path));
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//第二步:安裝驅動
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//獲取數據庫連接,由配置文件決定
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
//關閉數據庫相關資源,有一個是方法的重載
public static void close(Statement stm, Connection con) {
if (stm != null) {
try {
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement stm, Connection con, ResultSet rs) {
if (stm != null) {
try {
stm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、示例說明解釋
- a.說明創建一個工具類的要點
1.創建的成員基本都是靜態的,方便直接調用
2.靜態代碼塊是一個很好的選擇
- b.在JDBC工具類中用到的額外方法(參考示例中的實際使用)
1.ClssLoader getClassLoader() 獲取類加載器
2.URL getResource(String name) 參數:文件名,需要添加後綴 獲取文件鏈接
3.String getPath() 獲取完整路徑
3.void load(FileReader reader) 讀取配置文件信息到Peoperties集合中
4.Sting getProperties(Sting name) 參數:配合文件中的鍵 key 返回相應的值
- c.配置文件的方法與步驟說明
注意點:配置文件通常不傳遞絕對路徑,絕對路徑不方便代碼的移植。
步驟:1.獲取Properties集合 2.通過當前所在類的類對象獲取類加載器 3.獲取配置文件路徑
4.將配置文件中的數據讀取到Properties集合中 5.通過集合獲取對應的數據
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtil.class.getClassLoader();
URL res = classLoader.getResource(“JDBCpeizhi.properties”);
String path = res.getPath(); //獲取絕對路徑
pro.load(new FileReader(path));
url = pro.getProperty(“url”);
第四大塊 PrepareStatement接口
一、用PreparedStatement接口解決SQL出現的問題(注入問題)
- a.SQL注入問題:在拼接sql時,有一些sql的特殊關鍵字參與字符串的拼接。會造成安全性問題
- 輸入用戶隨便,輸入密碼:a’ or ‘a’ = 'a
- sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’
- b.設置通配符 ? 的參數 參數1是?的位置 || 參數2是需要對?設置的值
void setXxx(int station,參數2)
- c.執行DQL的方法同時獲取ResultSet對象
ResultSet executeQuery()
說明:執行sql查詢操作時,接受返回結果,不需要傳遞sql語句 //也就是在創建ResultSet對象時不需要進行傳遞參數,而Statement對象創建時需要在方法中傳遞參數;這是因爲在創建prepareStatement對象時已經將SQL語句傳遞進來了
方法總結:按照使用的各個對象來說明了
說明:這裏其實是有這麼一個邏輯,1.安裝驅動
2.與數據庫建立連接(此時已經連接到了數據中對應的表中)
3.獲取數據庫執行對象
4.獲取數據庫結果集對象
一、DriverManager
- a.註冊驅動
Class.forName(“com.mysql.jdbc.Driver”); static void registerDriver(Driver driver)
- b. 獲取Connection對象(數據庫連接對象)
Connection getConnection(String url,String user,String password);
二、Connection
- a.獲取sql對象(這裏注意一下兩個sql對象的獲取方式的特點)
Statement createStatement()
PrepareStatement prepareStatement(String sql)
- b.事務管理方法
void setAutoCommit(boolean autoCommit)
void commit()
void rollback()
三、Statement
- a.執行DML、DDL的方法
int executeUpdate(String sql)
- b.執行DQL的方法同時獲取ResultSet對象,但是查看結果需要通過ResultSet對象
ResultSet executeQuery(String sql)
四、PrepareStatement
- a.設置通配符 ? 的參數 參數1是?的位置 || 參數2是需要對?設置的值
void setXxx(int station,參數2)
- b.執行DQL的方法同時獲取ResultSet對象,雖然說這個通過PrepareStatement的方法創建ResultSet對象不需要傳遞參數,但是在創建PrepareStatement對象時傳遞的參數決定了是否可以調用這個無參方法。
ResultSet executeQuery()
- c.執行DML、DDL的方法
int executeUpdate()
五、Result
- a.移動遊標:遊標從表頭行開始
boolean next()
- b.獲取數據
T getXxx(多種參數)