JDBC的操作步驟
JDBC的操作步驟
一、什麼是JDBC
JDBC(Java DataBase Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用java語言編寫的類和介面組成。 其實,JDBC就是一套規範(介面),讓各大伺服器廠商自己去實現這個規範(實現介面),從而可以使得java編寫的程式可以去訪問。JDBC的目標是使Java程式設計師使用JDBC可以連線任何提供了JDBC驅動程式的資料庫系統,這樣就使得程式設計師無需對特定的資料庫系統的特點有過多的瞭解,從而大大簡化和加快了開發過程。
二、常用的API
Statement介面:
執行靜態SQL語句並返回它所生成結果.
int executeUpdate(String sql): 執行DDL/DML語句. 若當前SQL是DDL語句,則返回0. 若當前SQL是DML語句,則返回受影響的行數.
ResultSet executeQuery(String sql):執行DQL語句,返回結果集.
close():釋放資源
Connection介面
Statement createStatement():建立一個靜態的語句物件.
PreparedStatement prepareStatement(String sql):建立一個預編譯語句物件. 此時引數sql:表示帶有佔位符(?)的SQL語句的模板.
close():釋放資源
PreparedStatement介面
是Statemen介面的子介面,表示預編譯的 SQL 語句的物件.
void setXxx(int parameterIndex,Xxx value):設定第幾個佔位符的真正引數值.
int executeUpdate():執行DDL/DML語句. 注意:沒有引數 若當前SQL是DDL語句,則返回0. 若當前SQL是DML語句,則返回受影響的行數.
ResultSet executeQuery():執行DQL語句,返回結果集.
close():釋放資源
ResultSet介面
執行SQL語句會返回一個結果集,開始游標位於第一行的前,呼叫next方法會返回一個boolean型別,判斷下一行是否還有結果集並且游標會想下一行移動。
boolean next():判斷當前游標是否能向下移動,如果能向下移動返回true,並同時將游標移動到下一行.
Xxx getXxx(int columnIndex):取出當前游標所在行的第columnIndex列的資料(columnIndex從1開始算).
Xxx getXxx(String columnName):取出當前游標所在行的列名為columnName列的資料,columnName可以是別名.
close():釋放資源
Xxx表示的是資料型別
三、怎麼用JDBC
有五個鐵定的步驟,一個一個來說:
1.載入註冊驅動
先載入驅動包,驅動包就是伺服器廠商實現了JDBC介面的一個jar包,比如mysql的驅動包。先build path ,mysql的jar包。用java載入註冊驅動程式碼:
Class.forName("驅動類名稱");
一些資料庫的驅動類名稱:
mysql: com.mysql.jdbc.Driver
oracle: oracle.jdbc.driver.OracleDriver
DB2: com.ibm.db2.jcc.DB2Driver
載入過程就是 把驅動類這一份位元組碼載入進JVM,會立刻執行類中的靜態程式碼塊,而在這些類中的靜態程式碼塊就是在註冊驅動。
Java6開始,JDBC4.0有一個新特性,無需載入註冊驅動。不提倡,因為JavaWeb也是要手動載入
2.獲取連線物件
Connection conn = DriverManager.getConnection(url,username,password);
url是也是各個資料庫不相同:
mysql的是 jdbc:mysql://主機名:3306/資料庫
username和password是資料庫的賬號和密碼
3.獲取語句物件
Statement st = conn.createStatement();
PreparedStatement ps = conn.prepareStatement(sql);
4.執行SQL語句
在資料庫管理系統上執行完sql語句返回結果,DML語句會返回影響的行數,DDL語句不返回,DQL會返回一個結果集
st.executeUpdate(sql);//DML,DDL
ResultSet rs = execumentQuery();//DQL
對於DQL語句要進行處理結果集
while(rs.next){//TODO}
5.釋放資源
正確關閉資源:
public static void close(Connection conn, Statement st, ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(st != null){
st.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(conn != null){
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
}
}
四、JDBC的DML,DDL,DQL操作
建立表
public void testCreateTab() throws Exception { String sql = "CREATE TABLE s_student(id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10) NOT NULL UNIQUE,age INT)"; //1.記載註冊驅動/ Class.forName("com.mysql.jdbc.Driver"); //2.獲取連線物件 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "admin"); //3.建立語句物件 Statement st = conn.createStatement(); //4.執行SQL語句 st.executeUpdate(sql); //5.釋放資源 st.close(); conn.close(); }
增刪改
public class DMLTest { @Test //向表中新增行資料 public void testInsert() throws Exception { String sql = "INSERT INTO s_student(name,age) VALUES('西門吹雪',18),('王熙鳳',19)"; //1.載入註冊驅動 Class.forName("com.mysql.jdbc.Driver"); //2.獲取連線物件 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "admin"); //3.獲取語句物件 Statement st = conn.createStatement(); //4.執行sql語句 int ret = st.executeUpdate(sql); System.out.println("受影響的行數"+ret); //5.關閉資源 st.close(); conn.close(); } @Test public void testDelete() throws Exception { String sql = "DELETE FROM s_student WHERE name = '西門吹雪'"; //1.記載註冊驅動 Class.forName("com.mysql.jdbc.Driver"); //2獲取連線物件 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "admin"); //3獲取語句物件 Statement st = conn.createStatement(); //4.執行sql語句 st.executeUpdate(sql); //5.釋放資源 st.close(); conn.close(); } @Test public void testUpdate() throws Exception { String sql = "UPDATE s_student SET age = 99 WHERE id = 3"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "admin"); Statement st = conn.createStatement(); st.executeUpdate(sql); st.close(); conn.close(); } }
查詢
public class DQLTest { @Test public void testQuerySigle() throws Exception { String sql = "SELECT * FROM s_student WHERE id = 1"; //載入驅動 Class.forName("com.mysql.jdbc.Driver"); //獲取連線物件 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "admin"); //獲取語句物件 Statement st = conn.createStatement(); //執行sql語句 ResultSet rs = st.executeQuery(sql); if(rs.next()){ long id = rs.getLong("id"); long age = rs.getLong("age"); String name = rs.getString("name"); System.out.println(id + "," + age +"," + name); } rs.close(); st.close(); conn.close(); } @Test public void testAll() throws Exception { String sql = "SELECT * FROM s_student"; Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","admin"); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql); while(rs.next()){ String name = rs.getString("name"); long id = rs.getLong("id"); long age = rs.getLong("age"); System.out.println(name + "," + id +"," + age); } rs.close(); st.close(); conn.close(); } }
五、總結
JDBC的CUID操作就是嚴格按照上述步驟完成的,可以發現基本操作都很相同,也很容易理解。