JDBC(二)完成CRUD

1.獲取數(shù)據(jù)庫連接

(1)使用JDBC的準(zhǔn)備環(huán)境:

  • 1):拷貝MySQL的JDBC驅(qū)動,到Java項(xiàng)目中:mysql-connector-java-5.1.26-bin.jar。(注意:是jar包,不是zip包.)
  • 2):選擇jar,[buil path],把jar添加到classpath路徑.
驅(qū)動包.png

(2)DBC操作第一步:獲取JDBC連接對象/Connection對象.

操作步驟(賈璉):

  • 1):加載注冊驅(qū)動.
Class.forName("com.mysql.jdbc.Driver");

為什么說上述代碼,在完成加載注冊驅(qū)動?
上述代碼的作用:
1):把com.mysql.jdbc.Driver這一份字節(jié)碼加載進(jìn)JVM.
2):當(dāng)一份字節(jié)碼被加載進(jìn)JVM,就會執(zhí)行其靜態(tài)代碼塊。而其底層的靜態(tài)代碼塊在完成注冊驅(qū)動工作.

加載注冊驅(qū)動.png
  • 2):獲取連接對象.

通過DriverManager的getConnection方法創(chuàng)建Connection對象.

Connection  conn = DriverManager.getConnection(url,username,password);
url=jdbc:mysql://localhost:3306/jdbcdemo
//如果連接的是本機(jī)的MySQL,并且端口是默認(rèn)的3306,則可以簡寫:url=jdbc:mysql:///jdbcdemo
username=root
password=admin

可以通過 show processlist命令來查看有幾個MySQL進(jìn)程.

(3)備注

  • 從Java6開始:JDBC4.0: (了解)JDBC4.0有一個新特性-無需加載注冊驅(qū)動.

  • 規(guī)范要求:從JDBC 4.0所有的驅(qū)動都必須包括 META-INF/services/java.sql.Driver 文件。此文件包含 java.sql.Driver 的 JDBC 驅(qū)動程序?qū)崿F(xiàn)的名稱。
    程序會自動從 META-INF/services/java.sql.Driver去讀取當(dāng)前的驅(qū)動類的全限定名,此時程序員不再需要顯示的編寫 Class.forName("com.mysql.jdbc.Driver")代碼.

  • 在Web開發(fā)中,還是得使用手動加載注冊驅(qū)動.

  • PS:有的時候,MySQL的驅(qū)動類也也會看到使用org.gjt.mm.mysql.Driver的情況,org.gjt.mm.mysql.Driver是早期的驅(qū)動名稱,后來就改名為com.mysql.jdbc.Driver,現(xiàn)在一般都推薦使用 com.mysql.jdbc.Driver。

  • 在最新版本的mysql jdbc驅(qū)動中,為了保持對老版本的兼容,仍然保留了org.gjt.mm.mysql.Driver,但是實(shí)際上 org.gjt.mm.mysql.Driver中調(diào)用了com.mysql.jdbc.Driver,因此現(xiàn)在這兩個驅(qū)動沒有什么區(qū)別。

注冊驅(qū)動規(guī)范.png

2.JDBC常用的API

(1)操作JDBC的步驟口訣:

賈璉欲執(zhí)事:
1:載注冊驅(qū)動.
2:獲取接對象.
3:創(chuàng)建/獲取句對象.
4:執(zhí)行SQL語句.
5:放資源.

(2)重要接口

  • Connection接口: 表示JDBC的連接對象.
    常用方法:
Statement createStatement()          //:創(chuàng)建一個靜態(tài)的語句對象.
PreparedStatement prepareStatement(String sql)  //:創(chuàng)建一個預(yù)編譯語句對象. 此時參數(shù)sql:表示帶有占位符(?)的SQL語句的模板.
close()://釋放資源
  • Statement接口: 靜態(tài)SQL語句并返回它所生成結(jié)果.
    常用方法:
int executeUpdate(String sql)://執(zhí)行DDL/DML語句.
      //若當(dāng)前SQL是DDL語句,則返回0.
      //若當(dāng)前SQL是DML語句,則返回受影響的行數(shù).
ResultSet executeQuery(String sql)//:執(zhí)行DQL語句,返回結(jié)果集.
close()//:釋放資源
  • PreparedStatement接口:是Statemen接口的子接口-->享有Statement中的方法.表示預(yù)編譯的 SQL 語句的對象

常用方法:

void setXxx(int parameterIndex,Xxx value)//:設(shè)置第幾個占位符的真正參數(shù)值.
int executeUpdate()://執(zhí)行DDL/DML語句. 注意:沒有參數(shù)
      若當(dāng)前SQL是DDL語句,則返回0.
      若當(dāng)前SQL是DML語句,則返回受影響的行數(shù).
ResultSet executeQuery()//:執(zhí)行DQL語句,返回結(jié)果集.
//close():釋放資源
//Xxx表示數(shù)據(jù)類型,比如String,int,long,Date等.
  • ResultSet接口:通過執(zhí)行DQL語句查詢之后的結(jié)果對象.封裝了查詢之后的所有數(shù)據(jù).

    ResultSet 對象具有指向其當(dāng)前數(shù)據(jù)行的光標(biāo)。最初,光標(biāo)被置于第一行之前。next 方法將光標(biāo)移動到下一行;因?yàn)樵摲椒ㄔ?ResultSet 對象沒有下一行時返回 false,所以可以在 while 循環(huán)中使用它來迭代結(jié)果集

常用方法:

boolean next()://判斷當(dāng)前光標(biāo)是否能向下移動,如果能向下移動返回true,并同時將光標(biāo)移動到下一行.
Xxx getXxx(int columnIndex)://取出當(dāng)前光標(biāo)所在行的第columnIndex列的數(shù)據(jù)(columnIndex從1開始算).
Xxx getXxx(String columnName)://取出當(dāng)前光標(biāo)所在行的列名為columnName列的數(shù)據(jù),columnName可以是別名.
//Xxx表示數(shù)據(jù)類型,比如String,int,long,Date等. 推薦使用列名來取數(shù)據(jù).
close()://釋放資源

3.SQL語言的分類

SQL語言共分為四大類:數(shù)據(jù)查詢語言DQL,數(shù)據(jù)操縱語言DML,數(shù)據(jù)定義語言DDL,數(shù)據(jù)控制語言DCL*。

    1. 數(shù)據(jù)查詢語言DQL:數(shù)據(jù)查詢語言DQL基本結(jié)構(gòu)是由SELECT子句,F(xiàn)ROM子句,WHERE 子句組成的查詢塊: SELECT <字段名表> FROM <表或視圖名> WHERE <查詢條件>
    1. 數(shù)據(jù)操縱語言DML 數(shù)據(jù)操縱語言DML主要有三種形式: 1) 插入:INSERT 2) 更新:UPDATE 3) 刪除:DELETE
    1. 數(shù)據(jù)定義語言DDL:數(shù)據(jù)定義語言DDL用來創(chuàng)建數(shù)據(jù)庫中的各種對象-----表、視圖、 索引、同義詞、聚簇等如: CREATE TABLE/VIEW/INDEX/SYN/CLUSTER | | | | | 表 視圖 索引 同義詞 簇
      DDL操作是隱性提交的!不能rollback
    1. 數(shù)據(jù)控制語言DCL: 數(shù)據(jù)控制語言DCL用來授予或回收訪問數(shù)據(jù)庫的某種特權(quán),并控制 數(shù)據(jù)庫操縱事務(wù)發(fā)生的時間及效果,對數(shù)據(jù)庫實(shí)行監(jiān)視等。

如:

  1. GRANT:授權(quán)。
  2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一點(diǎn)。 回滾---ROLLBACK 回滾命令使數(shù)據(jù)庫狀態(tài)回到上次最后提交的狀態(tài)。其格式為: SQL>ROLLBACK;
  3. COMMIT [WORK]:提交。

4.JDBC的DDL(創(chuàng)建表和異常處理)

需求:
創(chuàng)建一張t_student表:id/name/age:

CREATE TABLE `t_student` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(20),`age` int(11));
  • 創(chuàng)建一張表
public void createTable() throws Exception{
        String sql="CREATE TABLE `t_student` (`id` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        //1.加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語句對象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL語句
        st.executeUpdate(sql);
        st.close();
        conn.close();
    }
  • 如何正確的處理JDBC異常

    public void createTableException(){
        String sql="CREATE TABLE `t_student` (`id1` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        //聲明資源
        Connection conn = null;
        Statement st = null;
        try{
            //可能出現(xiàn)異常
            Class.forName("com.mysql.jdbc.Driver");
            conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
            st=conn.createStatement();
            st.executeUpdate(sql);
            
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            //釋放資源
            try {
                if(st!=null){
                    st.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }finally {
                try {
                    if(conn!=null){
                        conn.close();
                    }
                } catch (Exception e3) {
                    e3.printStackTrace();
                }
            }
        }
    }
  • 使用Java7的自動資源關(guān)閉
    public void createEXceptionByJava7(){
        String sql="CREATE TABLE `t_student` (`id2` BIGINT (20) PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR (20),`age` INT (11))";
        try {
            //1.獲取連接對象
            Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
            //2.創(chuàng)建/獲取語句對象
            Statement st=conn.createStatement();
            //3.執(zhí)行SQL語句,可能會出現(xiàn)異常
            st.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5.JDBC的DML操作(增、刪、改)

  • 增加
    public void insert() throws Exception{
        String sql="INSERT INTO t_student(name,age) VALUES('jarry',20)";
        //1.加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語句對象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL
        st.execute(sql);
        //5.釋放資源
        st.close();
        conn.close();
    }
  • 修改
public void update()throws Exception{
        String sql="UPDATE t_student SET name='jihang' ,age=18 WHERE name='jarry'";
        //1.加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語句對象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL
        st.execute(sql);
        //5.釋放資源
        st.close();
        conn.close();
    }
  • 刪除
public void delete()throws Exception{
        String sql="DELETE FROM t_student WHERE name ='jihang'";
        //1.加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲取連接對象
        Connection conn=DriverManager.getConnection("jdbc:mysql:///jarry","root","123456");
        //3.創(chuàng)建/獲取語句對象
        Statement st=conn.createStatement();
        //4.執(zhí)行SQL
        st.execute(sql);
        //5.釋放資源
        st.close();
        conn.close();
    }

發(fā)現(xiàn):執(zhí)行DDL和DML的語句的操作模板是一模一樣的,僅僅是SQL語句不一樣.

6.JDBC的DQL操作(查詢)

  • 查詢總數(shù)
// 查詢數(shù)量
    public void queryCount() throws Exception {
        String sql = "SELECT COUNT(id) count FROM t_product";
        // 加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連接對象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
                "root", "123456");
        // 創(chuàng)建/獲取語句對象
        Statement st = conn.createStatement();
        // 執(zhí)行
        ResultSet rs = st.executeQuery(sql);
        if (rs.next()) {
            long rows = rs.getLong("count");
            //long rows = rs.getLong(1);
            System.out.println(rows);
        }
        rs.close();
        st.close();
        conn.close();
    }
  • 查詢單個細(xì)節(jié)
//查詢單個細(xì)節(jié)
    public void querySingle() throws Exception {
        String sql = "SELECT * FROM t_product WHERE id =1";
        // 加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連接對象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
                "root", "123456");
        // 創(chuàng)建/獲取語句對象
        Statement st = conn.createStatement();
        // 執(zhí)行
        ResultSet rs = st.executeQuery(sql);
        if (rs.next()) {
            long rows = rs.getLong("id");
            String name = rs.getString("name");
            String salePrice = rs.getString("sale_price");
            long type = rs.getInt("type");
            System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
        }
        rs.close();
        st.close();
        conn.close();
    }
  • 查詢?nèi)考?xì)節(jié)
//查詢?nèi)考?xì)節(jié)
    public void queryAll() throws Exception {
        String sql = "SELECT * FROM t_product";
        // 加載注冊驅(qū)動
        Class.forName("com.mysql.jdbc.Driver");
        // 獲取連接對象
        Connection conn = DriverManager.getConnection("jdbc:mysql:///jarry",
                "root", "123456");
        // 創(chuàng)建/獲取語句對象
        Statement st = conn.createStatement();
        // 執(zhí)行
        ResultSet rs = st.executeQuery(sql);
        while (rs.next()) {
            long rows = rs.getLong("id");
            String name = rs.getString("name");
            String salePrice = rs.getString("sale_price");
            long type = rs.getInt("type");
            System.out.println(rows+"--"+name+"--"+salePrice+"--"+type);
        }
        rs.close();
        st.close();
        conn.close();
    }

7.SQL和Java的對應(yīng)類型

java.util.Date和java.sql.Date有什么關(guān)系:
java.sql.Date是java.util.Date的子類.

Date的數(shù)據(jù)關(guān)系.png
數(shù)據(jù)庫和java的數(shù)據(jù)類型.png
數(shù)據(jù)庫的對應(yīng)類型.png

JavaWeb-目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容