JDBC-ODBC橋鏈接形式:利用微軟提供的ODBC進行數據庫連接,而後利用JDBC訪問ODBC的函數庫,實現數據操做java
流程:程序>JDBC>ODBC>數據庫;這樣操做性能差,但支持度最高,不須要配置任何第三方驅動程序sql
JDBC鏈接形式:利用不一樣數據庫的生產商提供的JDBC驅動程序進行數據庫操做數據庫
流程:程序>JDBC>數據庫;性能很好;設計模式
JDBC網絡鏈接形式:網絡
流程:程序>JDBC鏈接協議>數據庫,實際使用中是最多的;oracle
JDBC協議鏈接:使用特定數據庫生產廠商提供的協議標準進行數據庫的操做,難度較高;函數
使用Java.sql包開發,此包由如下類和接口組成:工具
類:DriverManager類性能
接口:Connection、Statement、PreparedStatement、ResultSet;開發工具
JDBC必定是按照固定的代碼操做執行的;
第一步:加載數據庫驅動程序
第二部:依靠DriverManager類鏈接數據庫
第三部:進行數據庫的CRUD操做(Statement、PreparedStatement、ResultSet)
第四步:關閉數據庫連接
按照指定步驟鏈接數據庫:
1. 配置數據庫驅動程序
須要打開Oracle兩個服務:監聽、實力服務;(OracleOraDb11g_home1TNSListener、OracleServiceORCL)
隨後須要配置數據庫驅動程序,驅動程序路徑:找到數據庫安裝文件目錄...\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar
若沒有開發工具而使用記事本開發,須要配置CLASSPATH中路徑。
使用開發工具,須要在【Java Build Path】中配置擴展的程序包,複製路徑,Eclipse中右鍵項目》屬性》Java Build Path》Libraries》》Add External JARs》粘貼路徑》已經配置到了當前項目環境中,已經能夠鏈接數據庫了
2.驅動加載
全部的數據庫的驅動加載是向容器加載(每當使用Java命令解釋一個程序的時候都表示啓動了一個Java Application容器),利用Class.forName()進行加載,Oracle的驅動程序類名稱:Oracle.jdbc.driver.OracleDriver
若是沒有配置驅動程序,則會出現找不到類的異常。
3.鏈接數據庫
要鏈接數據庫,要使用java.sql.DriverManager程序類,這個類沒有定義構造方法(私有化了),因此要想操做這個類能夠使用它的靜態方法:
鏈接數據庫:public static Connection getConnection(String url, String user, String password)
這個方法會返回一個Connection接口對象,每個Connection接口對象都會表示一個數據庫鏈接。然後再getConnection方法裏會須要有三個參數
String url:每個數據庫鏈接地址都是不一樣的,使用的協議也是不一樣的
Oracle標準格式:jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱
鏈接ORCL數據庫:jdbc:oracle:thin@localhost:1521:orcl
String user:鏈接用戶名,使用scott
String password:鏈接密碼,使用tiger
4.關閉數據庫鏈接
若是要關閉,確定使用Connection接口所定義的方法
import java.sql.Connection; import java.sql.DriverManager; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); System.out.println(conn); //第三步:關閉數據庫鏈接 conn.close(); } }
此時一執行,沒出錯就是連上了。
整個數據庫鏈接對象的取得使用的設計模式就是工廠設計模式,DriverManager就是工廠類
利用statement接口實現數據CRUD操做。
在java.sql包中的Connection接口只負責數據庫的鏈接使用,不具有數據操做能力,只有Statement接口才有數據操做能力。
想取得Statement接口的對象可經過Connection接口的以下方法完成:
實例化Statement對象:public Statement createStatement() throws SQLException;
若是使用Statement大部分狀況下操做的都是DML(數據庫增刪改查),全部Statement接口提供兩種方法:
數據更新操做:public int executeUpdate(String sql) throws SQLException; 返回int數據,是該更新影響的數據行數
數據查詢操做:public ResultSet executeQuery(String sql) throws SQLException;
範例:數據庫腳本
DROP TABLE member PURGE; DROP SEQUENCE myseq; CREATE SEQUENCE myseq; CREATE TABLE member( mid NUMBER , name VARCHAR2(50) , age NUMBER(3) , birthday DATE , note CLOB, CONSTRAINT pk_mid PRIMARY KEY (mid) );
member表中mid字段內容是依靠序列進行增加的。
數據更新操做:
更新分爲:INSERT、UPDATE、DELETE
範例:增長數據
SQL語句:
INSERT INTO member(mid,name,age,birthday,note) VALUES(myseq.nextval,'張三',10,TO_DATE('1989-10-10','yyyy-mm-dd'),'是我的'); commit;
Java:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); //第三步:進行數據庫操做 Statement stmt = conn.createStatement();//建立數據庫操做 String sql = "INSERT INTO member(mid,name,age,birthday,note) VALUES(myseq.nextval,'張三',10,TO_DATE('1989-10-10','yyyy-mm-dd'),'是我的')"; int len = stmt.executeUpdate(sql);//執行更新,返回更新行數 System.out.println("影響的數據行數:" + len); //第四步:關閉數據庫鏈接 conn.close(); } }
範例:數據更新操做:
SQL:
UPDATE member SET name='李四',birthday=SYSDATE WHERE mid IN (1,3,5,7,9);
Java:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); //第三步:進行數據庫操做 Statement stmt = conn.createStatement();//建立數據庫操做 String sql = "UPDATE member SET name='李四',birthday=SYSDATE WHERE mid IN (1,3,5,7,9)"; int len = stmt.executeUpdate(sql);//執行更新,返回更新行數 System.out.println("影響的數據行數:" + len); //第四步:關閉數據庫鏈接 conn.close(); } }
JDBC每每出現兩種異常:
1. java.sql.SQLException:數據庫鏈接出錯
2. java.sql.SQLSyntaxErrorException:執行的SQL語句有錯
範例:數據刪除:
SQL:
DELETE FROM member WHERE mid BETWEEN 3 AND 10; //刪3到10的
Java:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); //第三步:進行數據庫操做 Statement stmt = conn.createStatement();//建立數據庫操做 String sql = "DELETE FROM member WHERE mid BETWEEN 3 AND 10"; int len = stmt.executeUpdate(sql);//執行更新,返回更新行數 System.out.println("影響的數據行數:" + len); //第四步:關閉數據庫鏈接 conn.close(); } }
數據查詢操做:
要將查詢結果進行保留,爲了保存,java.sql包中引入了ResultSet接口的概念。
在ResultSet處理結果的時候實際是根據數據類型來處理的。
SQL:
SELECT mid,name,age,birthday,note FROM member
Java:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.Date; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); //第三步:進行數據庫操做 Statement stmt = conn.createStatement();//建立數據庫操做 String sql = "SELECT mid,name,age,birthday,note FROM member"; //開發中不容許寫「*」 ResultSet rs = stmt.executeQuery(sql); //數據查詢操做 //知道循環結束條件可是不知道循環次數,選擇while循環 while(rs.next()) { //移動指針同時判斷是否還有數據行 int mid = rs.getInt("mid"); String name = rs.getString("name"); int age = rs.getInt("age"); Date birthday = rs.getDate("birthday"); String note = rs.getString("note"); System.out.println("mid = " + mid + ", name = " + name + ", age = " + age + ", birthday = " + birthday + ", note = " + note); } //第四步:關閉數據庫鏈接 conn.close(); } }
寫getXxx方法讀取的數據能夠不寫列名稱,直接編寫序號就好了
while(rs.next()) { //移動指針同時判斷是否還有數據行 int mid = rs.getInt(1); String name = rs.getString(2); int age = rs.getInt(3); Date birthday = rs.getDate(4); String note = rs.getString(5); System.out.println("mid = " + mid + ", name = " + name + ", age = " + age + ", birthday = " + birthday + ", note = " + note); }
使用ResultSet說明:
全部的內容最好只取得一次
全部的內容最好按照順序取
PreparedStatement數據庫操做接口(全部項目都用)
statement存在的問題:
有一個最嚴重的的問題,全部操做都須要使用完整的SQL語句,那麼這時候若是數據是由用戶本身輸入的,就會產生問題。
例如用戶輸入名字Mr'SMITH, 中間有單引號,而sql語句要用‘Mr'SMITH’雙引號,會出錯。
PreparedStatement操做(核心!!!)
Statement開發不要用,永遠優先使用PreparedStatement接口,這是Statement的子接口,使用預處理的方式來操做。
若是想取得PreparedStatement接口的實例化對象,繼續依靠Connection接口,
預處理指的是執行SQL語句的時候,是在建立PreparedStatement接口是,而具體的內容使用問好:?來進行佔位,然後利用一系列setXxx()方法來設置內容。
因爲建立PreparedStatement接口的時候就已經準好了SQL語句,因此在執行SQL的時候就不在須要傳遞SQL語句了,使用PreparedStatement接口的以下方法實現數據庫操做:
更新操做:public int executeUpdate() throws SQLException;
查詢操做:public ResultSet executeQuery() throws SQLException;
程序中日期時間的描述使用的是java.util.Date,這個類下有三個類:java.sql.Date、java.sql.Time、java.sql.Timestamp
若是想java.util.Date變爲具體的子類對象,必須依靠long數據類型;
範例:利用PreparedStatement接口,解決名字Mr'SMITH不能寫進SQL的問題
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { String name = "Mr'SMITH"; int age = 30; Date birthday = new Date(); String note = "是個能活動的人"; //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); String sql = "INSERT INTO member(mid,name,age,birthday,note) VALUES (myseq.nextval,?,?,?,?) "; PreparedStatement pstmt = conn.prepareStatement(sql); //已經預處理的sql,可是沒有輸入值 pstmt.setString(1, name); //設佔位符,1是表明第一個問號 pstmt.setInt(2, age); pstmt.setDate(3, new java.sql.Date(birthday.getTime())); pstmt.setString(4, note); System.out.println(pstmt.executeUpdate()); //第三步:關閉數據庫鏈接 conn.close(); } }
此時更新與刪除的操做徹底同樣。
在整個PreparedStatement接口裏面最重要的就是查詢。
範例:查詢所有
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); String sql = "SELECT mid,name,age,birthday,note FROM member"; PreparedStatement pstmt = conn.prepareStatement(sql); //已經預處理的sql,可是沒有輸入值 ResultSet rs = pstmt.executeQuery(); while(rs.next()) { int mid = rs.getInt(1); String name = rs.getString(2); int age = rs.getInt(3); Date birthday = rs.getDate(4); String note = rs.getString(5); System.out.println("mid = " + mid + ", name = " + name + ", age = " + age + ", birthday = " + birthday + ", note = " + note); } //第三步:關閉數據庫鏈接 conn.close(); } }
範例:實現限定查詢,根據id查詢
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); String sql = "SELECT mid,name,age,birthday,note FROM member WHERE mid BETWEEN ? AND ?"; PreparedStatement pstmt = conn.prepareStatement(sql); //已經預處理的sql,可是沒有輸入值 pstmt.setInt(1, 1); //第一個問號,設置內容爲1 pstmt.setInt(2, 13); //第二個問號,設置內容爲13 ResultSet rs = pstmt.executeQuery(); while(rs.next()) { int mid = rs.getInt(1); String name = rs.getString(2); int age = rs.getInt(3); Date birthday = rs.getDate(4); String note = rs.getString(5); System.out.println("mid = " + mid + ", name = " + name + ", age = " + age + ", birthday = " + birthday + ", note = " + note); } //第三步:關閉數據庫鏈接 conn.close(); } }
範例:模糊查詢
模糊查詢須要設置模糊查詢字段
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { String keyword = "李"; //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); String sql = "SELECT mid,name,age,birthday,note FROM member WHERE name LIKE ?"; PreparedStatement pstmt = conn.prepareStatement(sql); //已經預處理的sql,可是沒有輸入值 pstmt.setString(1, "%" + keyword + "%"); //設置匹配符 ResultSet rs = pstmt.executeQuery(); while(rs.next()) { int mid = rs.getInt(1); String name = rs.getString(2); int age = rs.getInt(3); Date birthday = rs.getDate(4); String note = rs.getString(5); System.out.println("mid = " + mid + ", name = " + name + ", age = " + age + ", birthday = " + birthday + ", note = " + note); } //第三步:關閉數據庫鏈接 conn.close(); } }
須要注意,使用佔位符只能設置數據,不能設置表字段名稱。
範例:分頁查詢
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Date; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { String keyword = "張"; int currentPage = 1; int lineSize = 5; //每頁顯示的數據行數 //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); String sql = "SELECT * FROM (SELECT mid,name,age,birthday,note, ROWNUM rn FROM member WHERE name LIKE ? AND ROWNUM <= ? ) temp WHERE temp.rn > ?"; PreparedStatement pstmt = conn.prepareStatement(sql); //已經預處理的sql,可是沒有輸入值 pstmt.setString(1, "%" + keyword + "%"); //設置匹配符 pstmt.setInt(2,currentPage * lineSize); pstmt.setInt(3, (currentPage-1) * lineSize); ResultSet rs = pstmt.executeQuery(); while(rs.next()) { int mid = rs.getInt(1); String name = rs.getString(2); int age = rs.getInt(3); Date birthday = rs.getDate(4); String note = rs.getString(5); System.out.println("mid = " + mid + ", name = " + name + ", age = " + age + ", birthday = " + birthday + ", note = " + note); } //第三步:關閉數據庫鏈接 conn.close(); } }
範例:查詢數據庫中數據記錄個數:使用COUNT()函數,
使用COUNT統計必定會返回結果
name叫張三的有幾行
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class Hello{ public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver"; public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:orcl"; //jdbc:oracle:thin:@IP 地址:端口號:數據庫的SID名稱 public static final String DBUSER = "scott"; // 鏈接用戶名 public static final String PASSWORD = "123456"; //鏈接密碼 public static void main(String[] args) throws Exception { //第一步:加載數據庫驅動程序 Class.forName(DBDRIVER); //向容器中加載驅動鏈接類 //第二步:取得數據庫鏈接對象 Connection conn = DriverManager.getConnection(DBURL,DBUSER,PASSWORD); String sql = "SELECT COUNT(*) FROM member WHERE name = '張三'"; PreparedStatement pstmt = conn.prepareStatement(sql); //已經預處理的sql,可是沒有輸入值 ResultSet rs = pstmt.executeQuery(); if(rs.next()) { int count = rs.getInt(1); //取第一個數 System.out.println(count); } //第三步:關閉數據庫鏈接 conn.close(); } }
批處理:若干條語句一塊兒執行。在Statement接口與PreparedStatement接口中都定義有批處理的支持方法 。
Statement接口:
追加批處理:public void addBatch(String sql) throws SQLException
執行批處理:public int[] executeBatch() throws SQLException
PreparedStatement接口:
追加批處理:public void addBatch() throws SQLException
自動提交控制:public void setAutoCommit(boolean autoCommit) throws SQLException; 若是是true,就自動提交
提交:public void commit() throws SQLException
回滾:public void rollback() throws SQLException