1.JDBC的基本概念
JDBC:java database connective數據庫連接,是一組專門負責連接並操做數據庫的標準, 在整個JDBC中,實際上提供了大量的接口.要使用java對數據庫進行數據庫的開發,則確定必須對這些標準有所支持. java
JDBC使用中的方式: sql
JDBC-ODBC:實際開發中使用不多,效率很是低. 數據庫
JDBC鏈接: 使用各個數據庫提供商給定的數據庫驅動程序,完成JDBC的開發,這時須要在classpath中配置驅動程序. 網絡
JDBC網絡鏈接:主要使用網絡鏈接數據庫. oracle
2.JDBC的操做步驟
操做步驟: 學習
①加載數據庫驅動程序,在classpath中配置. this
②鏈接數據庫,經過Connection接口和DriverManger類完成. spa
③操做數據庫,經過Statement,PreparedStatement,ResultSet三個接口完成. code
④關閉數據庫. orm
3.JDBC的鏈接操做
鏈接步驟:
①經過Class.forName加載數據庫的驅動程序.
②經過DriverManager類進行數據庫的鏈接,鏈接時須要輸入數據庫的鏈接地址,用戶名,密碼.
③經過Connection接口接收鏈接.
鏈接示例:
package com.ares.connectdemo; import java.sql.Connection; import java.sql.DriverManager; public class ConnectJDBC { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); System.out.println(conn); // 四、關閉數據庫 conn.close(); } }
4.數據庫更新操做
執行數據庫的更新操做須要Statement接口支持,能夠執行增,刪,改操做.
4.1增長操做示例
package com.ares.updatedemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class StatementDemo01 { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 Statement stmt = null ; // 表示數據庫的更新操做 // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 三、Statement接口須要經過Connection接口進行實例化操做 stmt = conn.createStatement() ; // 執行SQL語句,更新數據庫 stmt.executeUpdate("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'張三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; //TO_DATE是oracle數據庫的時間日期格式. // 四、關閉數據庫 conn.close(); } }
4.2更新操做示例
stmt.executeUpdate("UPDATE person SET name='李四',age=33, birthday=sysdate,salary=8000.0 WHERE pid=4") ;
4.3刪除操做示例
stmt.executeUpdate("DELETE FROM person WHERE pid=4") ;
4.4查詢操做示例
經過SELECT命令查詢數據庫,程序經過ResultSet保存所有的查詢結果,經過Statement接口中的executeQuery()方法查詢.經過next()方法找到返回的沒一行數據,沒一行中的各個列數據須要經過getXXX方法得到.
示例代碼:
package com.ares.resultdemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; public class ResultSetDemo01 { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 Statement stmt = null ; // 表示數據庫的更新操做 ResultSet result = null ;// 表示接收數據庫的查詢結果 // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 三、Statement接口須要經過Connection接口進行實例化操做 stmt = conn.createStatement() ; // 執行SQL語句,查詢數據庫 result = stmt.executeQuery("SELECT pid,name,age,birthday,salary FROM person") ; while(result.next()){// 是否有下一行數據 int pid = result.getInt("pid") ; String name = result.getString("name") ; int age = result.getInt("age") ; Date birthday = result.getDate("birthday") ; float salary = result.getFloat("salary") ; System.out.print("pid = " + pid + ";") ; System.out.print("name = " + name + ";") ; System.out.print("age = " + age + ";") ; System.out.print("birthday = " + birthday + ";") ; System.out.println("salary = " + salary + ";") ; } // 四、關閉數據庫 result.close() ; stmt.close() ; conn.close(); } }
數據查詢後取值的另外一種方式:
int pid = result.getInt(1) ; String name = result.getString(2) ; int age = result.getInt(3) ; Date birthday = result.getDate(4) ; float salary = result.getFloat(5) ;
5.動態操做數據庫
插入數據示例:
InputData類
package com.ares.execdemo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class InputData { private BufferedReader buf = null; public InputData() { this.buf = new BufferedReader(new InputStreamReader(System.in)); } public String getString(String info) { String str = null; System.out.print(info);// 打印提示信息 try { str = this.buf.readLine(); } catch (IOException e) { e.printStackTrace(); } return str; } public int getInt(String info, String err) { int temp = 0; boolean flag = true;// 定義一個標誌位 while (flag) { String str = this.getString(info); if (str.matches("\\d+")) { temp = Integer.parseInt(str); flag = false;// 退出循環 } else { System.out.print(err); } } return temp; } public float getFloat(String info, String err) { float temp = 0.0f; boolean flag = true;// 定義一個標誌位 while (flag) { String str = this.getString(info); if (str.matches("\\d+.?\\d+")) { temp = Float.parseFloat(str); flag = false;// 退出循環 } else { System.out.print(err); } } return temp; } public char getChar(String info, String err) { char temp = ' '; boolean flag = true;// 定義一個標誌位 while (flag) { String str = this.getString(info); if (str.matches("\\w")) { temp = str.charAt(0); flag = false;// 退出循環 } else { System.out.print(err); } } return temp; } public Date getDate(String info, String err) { Date temp = null ; boolean flag = true;// 定義一個標誌位 while (flag) { String str = this.getString(info); if (str.matches("\\d{4}-\\d{2}-\\d{2}")) { try { temp = new SimpleDateFormat("yyyy-MM-dd"). parse(str) ; } catch (ParseException e) { System.out.print(err) ; } flag = false;// 退出循環 } else { System.out.print(err); } } return temp; } }
InsertDemo類示例:
package com.ares.execdemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class InsertDemo { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 Statement stmt = null; // 表示數據庫的更新操做 InputData input = new InputData() ; String name = input.getString("請輸入姓名:"); int age = input.getInt("請輸入年齡:", "年齡必須是數字,"); String date = input.getString("請輸入生日:"); float salary = input.getFloat("請輸入工資:", "輸入的工資必須是數字,"); String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'" + name + "'," + age + ",TO_DATE('" + date + "','yyyy-mm-dd')," + salary + ") "; System.out.println(sql) ; // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 三、Statement接口須要經過Connection接口進行實例化操做 stmt = conn.createStatement(); // 執行SQL語句,更新數據庫 stmt.executeUpdate(sql); // 四、關閉數據庫 conn.close(); } }
備註:這種拼湊的SQL語句其實是有問題的,好比單引號就會出現解析異常,同時也會出現數據庫的注入非法操做等等.
6.PreparedStatement接口
PreparedStatement是Statement接口的子接口,也是實際操做中使用較多的接口,表示預處理操做.
插入示例:
package com.ares.prepareddemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date; public class InsertDemo { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 PreparedStatement pstmt = null; // 表示數據庫的更新操做 InputData input = new InputData() ; String name = input.getString("請輸入姓名:"); int age = input.getInt("請輸入年齡:", "年齡必須是數字,"); Date date = input.getDate("請輸入生日:","輸入的不是日期,"); float salary = input.getFloat("請輸入工資:", "輸入的工資必須是數字,"); String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,?,?,?,?) "; System.out.println(sql) ; // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 三、PreparedStatement接口須要經過Connection接口進行實例化操做 pstmt = conn.prepareStatement(sql) ;// 使用預處理的方式建立對象 pstmt.setString(1, name) ;// 第一個?號的內容 pstmt.setInt(2, age) ; // 第二個?號的內容 pstmt.setDate(3, new java.sql.Date(date.getTime())) ; //將util下的格式轉爲sql下的格式. pstmt.setFloat(4,salary) ; // 執行SQL語句,更新數據庫 pstmt.executeUpdate(); // 四、關閉數據庫 pstmt.close() ; conn.close(); } }
查詢操做示例:
String sql = "SELECT pid,name,age,birthday,salary FROM person" ; … ... pstmt = conn.prepareStatement(sql) ; // 執行SQL語句,查詢數據庫 result = pstmt.executeQuery() ; while(result.next()){// 是否有下一行數據 int pid = result.getInt(1) ; String name = result.getString(2) ; int age = result.getInt(3) ; Date birthday = result.getDate(4) ; float salary = result.getFloat(5) ; }
模糊查詢操做:
package com.ares.prepareddemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class SelectDemo02 { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 PreparedStatement pstmt = null ; // 表示數據庫的更新操做 ResultSet result = null ;// 表示接收數據庫的查詢結果 String keyWord = "" ; String sql = "SELECT pid,name,age,birthday,salary FROM person WHERE name LIKE ? OR birthday LIKE ?" ; // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 三、PreparedStatement接口須要經過Connection接口進行實例化操做 pstmt = conn.prepareStatement(sql) ; pstmt.setString(1,"%"+keyWord+"%") ; pstmt.setString(2,"%"+keyWord+"%") ; // 執行SQL語句,查詢數據庫 result = pstmt.executeQuery() ; while(result.next()){// 是否有下一行數據 int pid = result.getInt(1) ; String name = result.getString(2) ; int age = result.getInt(3) ; Date birthday = result.getDate(4) ; float salary = result.getFloat(5) ; System.out.print("pid = " + pid + ";") ; System.out.print("name = " + name + ";") ; System.out.print("age = " + age + ";") ; System.out.print("birthday = " + birthday + ";") ; System.out.println("salary = " + salary + ";") ; } // 四、關閉數據庫 result.close() ; pstmt.close() ; conn.close(); } }
7.批處理
定義:多條SQL語句能夠一次性執行完畢,稱爲批處理操做.批處理是JDBC2.0以後提出的一個概念.2.0還有滾動的結果集及用滾動結果集更新數據等,可是這些操做使用較少.
Statement上定義了一個addBatch()方法,此方法能夠加入批處理,以後使用executeBatch()方法執行批處理操做.
代碼示例:
package com.ares.prepareddemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class BatchInsertDemo { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 PreparedStatement pstmt = null; // 表示數據庫的更新操做 String sql = "INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,?,?,?,?) "; System.out.println(sql) ; // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); // 三、PreparedStatement接口須要經過Connection接口進行實例化操做 pstmt = conn.prepareStatement(sql) ;// 使用預處理的方式建立對象 for(int i=0;i<10;i++){ pstmt.setString(1, "lxh-" + i);// 第一個?號的內容 pstmt.setInt(2, 20 + i); // 第二個?號的內容 pstmt.setDate(3, new java.sql.Date(new java.util.Date().getTime())); pstmt.setFloat(4, 900*i); pstmt.addBatch() ; // 增長批處理 } // 執行SQL語句,更新數據庫 int i[] = pstmt.executeBatch() ; System.out.println(i.length); // 四、關閉數據庫 pstmt.close() ; conn.close(); } }
8.事務處理
經過commit提交事務,經過rollback回滾事務.事務處理須要依靠Connection完成.commit是提交更新操做,rollback表示提交執行過程當中出現異常,取消操做,回滾.由於數據庫的操做不用事務處理的話,操做都是當即執行的.
package com.ares.trandemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class TransactionDemo02 { // 驅動程序就是以前在classpath中配置的jdbc的驅動程序的jar包中 public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; // 鏈接地址是由各個數據庫生產商單獨提供的,因此須要單獨記住 public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DEMO"; // 鏈接數據庫的用戶名 public static final String DBUSER = "scott"; // 鏈接數據庫的密碼 public static final String DBPASS = "tiger"; public static void main(String[] args) throws Exception { Connection conn = null; // 表示數據庫的鏈接的對象 Statement stmt = null; // 表示數據庫的更新操做 // 一、使用Class類加載驅動程序 Class.forName(DBDRIVER); // 二、鏈接數據庫 conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); conn.setAutoCommit(false) ; // 取消自動提交 // 三、Statement接口須要經過Connection接口進行實例化操做 stmt = conn.createStatement() ; try{ stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'張三',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'李四',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'王'五',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'趙六',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; stmt.addBatch("INSERT INTO person(pid,name,age,birthday,salary) VALUES (perseq.nextval,'孫七',30,TO_DATE('1995-02-14','yyyy-mm-dd'),9000.0) ") ; // 執行SQL語句,更新數據庫 int i[] = stmt.executeBatch() ; System.out.println(i.length); conn.commit() ;// 提交 }catch(Exception e){ conn.rollback() ;// 回滾 } // 四、關閉數據庫 stmt.close() ; conn.close(); } }
20150528
JAVA學習筆記系列
--------------------------------------------
聯繫方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: aresxdy@gmail.com
------------------------------------------------