Java_JDBC

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

相關文章
相關標籤/搜索