Java學(xué)習(xí)筆記 26 - JDBC技術(shù)、DBUtils工具類

本文主要內(nèi)容
1按价、JDBC
2餐茵、DBUtils

01JDBC概念和數(shù)據(jù)庫驅(qū)動(dòng)程序

  • A: JDBC概念和數(shù)據(jù)庫驅(qū)動(dòng)程序
    • a: JDBC概述
      • JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API炬转,
        可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成算灸。是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范
        • JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級(jí)的工具和接口扼劈,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
        • JDBC需要連接驅(qū)動(dòng)菲驴,驅(qū)動(dòng)是兩個(gè)設(shè)備要進(jìn)行通信荐吵,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定赊瞬,
          設(shè)備提供商為設(shè)備提供驅(qū)動(dòng)軟件先煎,通過軟件可以與該設(shè)備進(jìn)行通信。
        • 本文主要使用的是mysql的驅(qū)動(dòng)mysql-connector-java-5.1.39-bin.jar
      • b: 總結(jié)
        • JDBC是java提供給開發(fā)人員的一套操作數(shù)據(jù)庫的接口
        • 數(shù)據(jù)庫驅(qū)動(dòng)就是實(shí)現(xiàn)該接口的實(shí)現(xiàn)類

02JDBC原理

  • A: JDBC原理
    • a: 描述
      • Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC巧涧,而生產(chǎn)廠商提供規(guī)范的實(shí)現(xiàn)類稱為驅(qū)動(dòng)
      • JDBC是一套API接口(Sun公司定義的類或接口)薯蝎,驅(qū)動(dòng)是接口的實(shí)現(xiàn),沒有驅(qū)動(dòng)將無法完成數(shù)據(jù)庫連接褒侧,從而不能操作數(shù)據(jù)庫良风!
        每個(gè)數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動(dòng),用來連接自己公司的數(shù)據(jù)庫闷供,也就是說驅(qū)動(dòng)一般都由數(shù)據(jù)庫生成廠商提供烟央。

03準(zhǔn)備數(shù)據(jù)

  • A: 準(zhǔn)備數(shù)據(jù)
    • a: 創(chuàng)建數(shù)據(jù)庫和表結(jié)構(gòu)

        #創(chuàng)建數(shù)據(jù)庫
        create database mybase;
        #使用數(shù)據(jù)庫
        use mybase;
        ###創(chuàng)建分類表
        create table sort(
          sid int PRIMARY KEY AUTO_INCREMENT,
          sname varchar(100),
          sprice DOUBLE,
          sdesc VARCHAR(500)
        );
      
    • b: 向表中插入數(shù)據(jù)

        #初始化數(shù)據(jù)
        insert into sort(sname,sprice,sdesc) values('家電',2000, '優(yōu)惠的促銷');
        insert into sort(sname,sprice,sdesc) values('家具',8900, '家具價(jià)格上調(diào),原材料漲價(jià)');
        insert into sort(sname,sprice,sdesc) values('兒童玩具',290, '賺家長(zhǎng)的錢');
        insert into sort(sname,sprice,sdesc) values('生鮮',500.99, '生鮮商品');
        insert into sort(sname,sprice,sdesc) values('服裝',24000, '換季銷售');
        insert into sort(sname,sprice,sdesc) values('洗滌',50, '洗發(fā)水促銷');          
      

04JDBC的開發(fā)步驟

  • A: JDBC的開發(fā)步驟
    • a: 步驟介紹
      1.注冊(cè)驅(qū)動(dòng)
      告知JVM使用的是哪一個(gè)數(shù)據(jù)庫的驅(qū)動(dòng)
      2.獲得連接
      使用JDBC中的類,完成對(duì)MySQL數(shù)據(jù)庫的連接
      3.獲得語句執(zhí)行平臺(tái)
      通過連接對(duì)象獲取對(duì)SQL語句的執(zhí)行者對(duì)象
      4.執(zhí)行sql語句
      使用執(zhí)行者對(duì)象,向數(shù)據(jù)庫執(zhí)行SQL語句
      獲取到數(shù)據(jù)庫的執(zhí)行后的結(jié)果
      5.處理結(jié)果
      6.釋放資源 一堆close()

05導(dǎo)入mysql數(shù)據(jù)庫驅(qū)動(dòng)程序jar包

  • A: Eclipse導(dǎo)入mysql數(shù)據(jù)庫驅(qū)動(dòng)程序jar包
    • a: 步驟
      • 創(chuàng)建lib目錄,用于存放當(dāng)前項(xiàng)目需要的所有jar包
      • 選擇jar包歪脏,右鍵執(zhí)行build path / Add to Build Path

06注冊(cè)數(shù)據(jù)庫驅(qū)動(dòng)程序

  • A: 注冊(cè)數(shù)據(jù)庫驅(qū)動(dòng)程序
    • a: 案例代碼

        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.注冊(cè)驅(qū)動(dòng) 反射技術(shù),將驅(qū)動(dòng)類加入到內(nèi)容
                // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
                // Diver是一個(gè)接口,參數(shù)傳遞,MySQL驅(qū)動(dòng)程序中的實(shí)現(xiàn)類
                //DriverManager.registerDriver(new Driver());
                //驅(qū)動(dòng)類源代碼,注冊(cè)2次驅(qū)動(dòng)程序
                Class.forName("com.mysql.jdbc.Driver");                 
            }
        }
      

07獲取數(shù)據(jù)庫的連接對(duì)象

  • A:獲取數(shù)據(jù)庫的連接對(duì)象
    • a: 案例代碼

        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.注冊(cè)驅(qū)動(dòng) 反射技術(shù),將驅(qū)動(dòng)類加入到內(nèi)容
                // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
                // Diver是一個(gè)接口,參數(shù)傳遞,MySQL驅(qū)動(dòng)程序中的實(shí)現(xiàn)類
                //DriverManager.registerDriver(new Driver());
                //驅(qū)動(dòng)類源代碼,注冊(cè)2次驅(qū)動(dòng)程序
                Class.forName("com.mysql.jdbc.Driver");
                
                //2.獲得數(shù)據(jù)庫連接  DriverManager類中靜態(tài)方法
                //static Connection getConnection(String url, String user, String password)  
                //返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動(dòng)程序
                //url: 數(shù)據(jù)庫地址  jdbc:mysql://連接主機(jī)IP:端口號(hào)//數(shù)據(jù)庫名字
                String url = "jdbc:mysql://localhost:3296/mybase";
                //用戶名和密碼用自己的
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                System.out.println(con);                    
            }
        }
      

08獲取SQL語句的執(zhí)行對(duì)象對(duì)象

  • A: 獲取SQL語句的執(zhí)行對(duì)象對(duì)象
    • a: 案例代碼

        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.注冊(cè)驅(qū)動(dòng) 反射技術(shù),將驅(qū)動(dòng)類加入到內(nèi)容
                // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
                // Diver是一個(gè)接口,參數(shù)傳遞,MySQL驅(qū)動(dòng)程序中的實(shí)現(xiàn)類
                //DriverManager.registerDriver(new Driver());
                //驅(qū)動(dòng)類源代碼,注冊(cè)2次驅(qū)動(dòng)程序
                Class.forName("com.mysql.jdbc.Driver");
                
                //2.獲得數(shù)據(jù)庫連接  DriverManager類中靜態(tài)方法
                //static Connection getConnection(String url, String user, String password)  
                //返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動(dòng)程序
                //url: 數(shù)據(jù)庫地址  jdbc:mysql://連接主機(jī)IP:端口號(hào)//數(shù)據(jù)庫名字
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                
                //3.獲得語句執(zhí)行平臺(tái), 通過數(shù)據(jù)庫連接對(duì)象,獲取到SQL語句的執(zhí)行者對(duì)象
                // con對(duì)象調(diào)用方法   Statement createStatement() 獲取Statement對(duì)象,將SQL語句發(fā)送到數(shù)據(jù)庫
                // 返回值是 Statement接口的實(shí)現(xiàn)類對(duì)象,,在mysql驅(qū)動(dòng)程序
                Statement stat = con.createStatement();
                System.out.println(stat);
            }
        }
      

09執(zhí)行insert語句獲取結(jié)果集

  • A: 執(zhí)行insert語句獲取結(jié)果集
    • a: 案例代碼

        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.注冊(cè)驅(qū)動(dòng) 反射技術(shù),將驅(qū)動(dòng)類加入到內(nèi)容
                // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
                // Diver是一個(gè)接口,參數(shù)傳遞,MySQL驅(qū)動(dòng)程序中的實(shí)現(xiàn)類
                //DriverManager.registerDriver(new Driver());
                //驅(qū)動(dòng)類源代碼,注冊(cè)2次驅(qū)動(dòng)程序
                Class.forName("com.mysql.jdbc.Driver");
                
                //2.獲得數(shù)據(jù)庫連接  DriverManager類中靜態(tài)方法
                //static Connection getConnection(String url, String user, String password)  
                //返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動(dòng)程序
                //url: 數(shù)據(jù)庫地址  jdbc:mysql://連接主機(jī)IP:端口號(hào)//數(shù)據(jù)庫名字
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                
                //3.獲得語句執(zhí)行平臺(tái), 通過數(shù)據(jù)庫連接對(duì)象,獲取到SQL語句的執(zhí)行者對(duì)象
                // con對(duì)象調(diào)用方法   Statement createStatement() 獲取Statement對(duì)象,將SQL語句發(fā)送到數(shù)據(jù)庫
                // 返回值是 Statement接口的實(shí)現(xiàn)類對(duì)象,,在mysql驅(qū)動(dòng)程序
                Statement stat = con.createStatement();
                //  4.執(zhí)行sql語句
                // 通過執(zhí)行者對(duì)象調(diào)用方法執(zhí)行SQL語句,獲取結(jié)果
                // int executeUpdate(String sql)  執(zhí)行數(shù)據(jù)庫中的SQL語句, insert delete update
                // 返回值int,操作成功數(shù)據(jù)表多少行
                int row = stat.executeUpdate
                        ("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽車用品',50000,'瘋狂漲價(jià)')");
                System.out.println(row);
                
                //6.釋放資源  一堆close()
                stat.close();
                con.close();
            }
        }
      

10 執(zhí)行select語句獲取結(jié)果集

  • A: 執(zhí)行select語句獲取結(jié)果集
    • a: 案例代碼

        public class JDBCDemo1 {
            public static void main(String[] args) throws Exception{
                //1. 注冊(cè)驅(qū)動(dòng)
                Class.forName("com.mysql.jdbc.Driver");
                //2. 獲取連接對(duì)象
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                //3 .獲取執(zhí)行SQL 語句對(duì)象
                Statement stat = con.createStatement();
                // 拼寫查詢的SQL
                String sql = "SELECT * FROM sort";
                //4. 調(diào)用執(zhí)行者對(duì)象方法,執(zhí)行SQL語句獲取結(jié)果集
                // ResultSet executeQuery(String sql)  執(zhí)行SQL語句中的select查詢
                // 返回值ResultSet接口的實(shí)現(xiàn)類對(duì)象,實(shí)現(xiàn)類在mysql驅(qū)動(dòng)中
                ResultSet rs = stat.executeQuery(sql);
                //5 .處理結(jié)果集
                // ResultSet接口方法 boolean next() 返回true,有結(jié)果集,返回false沒有結(jié)果集
                while(rs.next()){
                    //獲取每列數(shù)據(jù),使用是ResultSet接口的方法 getXX方法參數(shù)中,建議寫String列名
                    System.out.println(rs.getInt("sid")+"   "+rs.getString("sname")+
                            "   "+rs.getDouble("sprice")+"   "+rs.getString("sdesc"));
                }
                
                rs.close();
                stat.close();
                con.close();
            }
        }
      

11 SQL注入攻擊

  • A: SQL注入攻擊
    • a: 注入問題
      • 假設(shè)有登錄案例SQL語句如下:

      • SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸?shù)拿艽a;

      • 此時(shí)疑俭,當(dāng)用戶輸入正確的賬號(hào)與密碼后,查詢到了信息則讓用戶登錄婿失。
        但是當(dāng)用戶輸入的賬號(hào)為XXX 密碼為:XXX’ OR ‘a(chǎn)’=’a時(shí)钞艇,則真正執(zhí)行的代碼變?yōu)椋?br> SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;

      • 此時(shí),上述查詢語句時(shí)永遠(yuǎn)可以查詢出結(jié)果的豪硅。那么用戶就直接登錄成功了哩照,顯然我們不希望看到這樣的結(jié)果,這便是SQL注入問題懒浮。

      • b: 案例演示

        CREATE TABLE users(
             id INT PRIMARY KEY AUTO_INCREMENT,
             username VARCHAR(100),
             PASSWORD VARCHAR(100)
         );
         INSERT INTO users (username,PASSWORD) VALUES ('a','1'),('b','2');
         SELECT * FROM users;
        
         -- 登錄查詢
         SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu'1 
        OR 1=1
        
        SELECT * FROM users WHERE username='a' AND PASSWORD='1'OR'1=1'
        鍵盤錄入: 1
              1'OR' 1=1
        

12 SQL注入攻擊用戶登錄案例

  • A: SQL注入攻擊用戶登錄案例
    • a: 案例代碼

        public class JDBCDemo2 {
            public static void main(String[] args)throws Exception {
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username = "root";
                String password = "123";
                Connection con = DriverManager.getConnection(url, username, password);
                Statement stat = con.createStatement();
                
                Scanner sc = new Scanner(System.in);
                String user = sc.nextLine();
                String pass = sc.nextLine();
                
                //執(zhí)行SQL語句,數(shù)據(jù)表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗
        //      String sql = "SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' OR 1=1";
                String sql = "SELECT * FROM users WHERE username='"+user+"' AND PASSWORD='"+pass+"'";
                System.out.println(sql);
                ResultSet rs = stat.executeQuery(sql);
                while(rs.next()){
                    System.out.println(rs.getString("username")+"   "+rs.getString("password"));
                }
                
                rs.close();
                stat.close();
                con.close();
            }
        }
      

13 PrepareStatement接口預(yù)編譯SQL語句

  • A: PrepareStatement接口預(yù)編譯SQL語句
    • a: 預(yù)處理對(duì)象

      • 使用PreparedStatement預(yù)處理對(duì)象時(shí)飘弧,建議每條sql語句所有的實(shí)際參數(shù),都使用逗號(hào)分隔砚著。
      • String sql = "insert into sort(sid,sname) values(?,?)";;
      • PreparedStatement預(yù)處理對(duì)象代碼:
      • PreparedStatement psmt = conn.prepareStatement(sql)
    • b: 執(zhí)行SQL語句的方法介紹

      • int executeUpdate(); --執(zhí)行insert update delete語句.

      • ResultSet executeQuery(); --執(zhí)行select語句.

      • boolean execute(); --執(zhí)行select返回true 執(zhí)行其他的語句返回false.

      • c: 設(shè)置實(shí)際參數(shù)

        • void setXxx(int index, Xxx xx) 將指定參數(shù)設(shè)置為給定Java的xx值次伶。在將此值發(fā)送到數(shù)據(jù)庫時(shí),驅(qū)動(dòng)程序?qū)⑺D(zhuǎn)換成一個(gè) SQL Xxx類型值稽穆。
        • 例如:
          • setString(2, "家用電器") 把SQL語句中第2個(gè)位置的占位符冠王? 替換成實(shí)際參數(shù) "家用電器"
      • d: 案例代碼

              /*
         *  Java程序?qū)崿F(xiàn)用戶登錄,用戶名和密碼,數(shù)據(jù)庫檢查
          *  防止注入攻擊
         *  Statement接口實(shí)現(xiàn)類,作用執(zhí)行SQL語句,返回結(jié)果集
         *  有一個(gè)子接口PreparedStatement  (SQL預(yù)編譯存儲(chǔ),多次高效的執(zhí)行SQL) 
         *  PreparedStatement的實(shí)現(xiàn)類數(shù)據(jù)庫的驅(qū)動(dòng)中,如何獲取接口的實(shí)現(xiàn)類
        *  
        *  是Connection數(shù)據(jù)庫連接對(duì)象的方法
        *  PreparedStatement prepareStatement(String sql) 
                
         */
        
           public class JDBCDemo3 {
          public static void main(String[] args)throws Exception 
                         {
              Class.forName("com.mysql.jdbc.Driver");
              String url = "jdbc:mysql://localhost:3296/mybase";
              String username = "root";
              String password = "123";
              Connection con = DriverManager.getConnection(url, username, password);
              Scanner sc = new Scanner(System.in);
              String user = sc.nextLine();
              String pass = sc.nextLine();
              
              //執(zhí)行SQL語句,數(shù)據(jù)表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗
              String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
              //調(diào)用Connection接口的方法prepareStatement,獲取PrepareStatement接口的實(shí)現(xiàn)類
              //方法中參數(shù),SQL語句中的參數(shù)全部采用問號(hào)占位符
              PreparedStatement pst =  con.prepareStatement(sql);
              System.out.println(pst);
              //調(diào)用pst對(duì)象set方法,設(shè)置問號(hào)占位符上的參數(shù)
              pst.setObject(1, user);
              pst.setObject(2, pass);
              
              //調(diào)用方法,執(zhí)行SQL,獲取結(jié)果集
              ResultSet rs = pst.executeQuery();
              while(rs.next()){
                  System.out.println(rs.getString("username")+"   "+rs.getString("password"));
              }
              
              rs.close();
              pst.close();
              con.close();
          }
        }
        

14 PrepareStatement接口預(yù)編譯SQL語句執(zhí)行修改

  • A: PrepareStatement接口預(yù)編譯SQL語句執(zhí)行修改
    • 案例代碼

        /*
         *  使用PrepareStatement接口,實(shí)現(xiàn)數(shù)據(jù)表的更新操作
         */
        public class JDBCDemo {
            public static void main(String[] args) throws Exception{
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);  
                
                //拼寫修改的SQL語句,參數(shù)采用?占位
                String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
                //調(diào)用數(shù)據(jù)庫連接對(duì)象con的方法prepareStatement獲取SQL語句的預(yù)編譯對(duì)象
                PreparedStatement pst = con.prepareStatement(sql);
                //調(diào)用pst的方法setXXX設(shè)置?占位
                pst.setObject(1, "汽車美容");
                pst.setObject(2, 49988);
                pst.setObject(3, 7);
                //調(diào)用pst方法執(zhí)行SQL語句
                pst.executeUpdate();
                
                pst.close();
                con.close();
            }
        }
      

15 PrepareStatement接口預(yù)編譯SQL語句執(zhí)行查詢

  • A: PrepareStatement接口預(yù)編譯SQL語句執(zhí)行查詢
    • a: 案例代碼

        /*
         *  PrepareStatement接口實(shí)現(xiàn)數(shù)據(jù)表的查詢操作
         */
        public class JDBCDemo1 {
            public static void main(String[] args) throws Exception{
                Class.forName("com.mysql.jdbc.Driver");
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);  
                
                String sql = "SELECT * FROM sort";
                
                PreparedStatement pst = con.prepareStatement(sql);
                
                //調(diào)用pst對(duì)象的方法,執(zhí)行查詢語句,Select
                ResultSet rs=pst.executeQuery();
                while(rs.next()){
                    System.out.println(rs.getString("sid")+"  "+rs.getString("sname")+"  "+rs.getString("sprice")+"  "+rs.getString("sdesc"));
                }
                rs.close();
                pst.close();
                con.close();
            }
        }
      

16 JDBC的工具類和測(cè)試

  • A: JDBC的工具類和測(cè)試
    • a: 案例代碼

        //JDBCUtils工具類代碼
        public class JDBCUtils {
            private JDBCUtils(){}
            private static Connection con ;
            
            static{
                try{
                    Class.forName("com.mysql.jdbc.Driver");
                    String url = "jdbc:mysql://localhost:3296/mybase";
                    String username="root";
                    String password="123";
                    con = DriverManager.getConnection(url, username, password);
                }catch(Exception ex){
                    throw new RuntimeException(ex+"數(shù)據(jù)庫連接失敗");
                }
            }
            
            /*
             * 定義靜態(tài)方法,返回?cái)?shù)據(jù)庫的連接對(duì)象
             */
            public static Connection getConnection(){
                return con;
            }
            
            
            public static void close(Connection con,Statement stat){
                 
                 if(stat!=null){
                     try{
                         stat.close();
                     }catch(SQLException ex){}
                 }
                 
                 if(con!=null){
                     try{
                         con.close();
                     }catch(SQLException ex){}
                 }
                 
            }
            
            
            public static void close(Connection con,Statement stat , ResultSet rs){
                 if(rs!=null){
                     try{
                         rs.close();
                     }catch(SQLException ex){}
                 }
                 
                 if(stat!=null){
                     try{
                         stat.close();
                     }catch(SQLException ex){}
                 }
                 
                 if(con!=null){
                     try{
                         con.close();
                     }catch(SQLException ex){}
                 }
                 
            }
        }
      //測(cè)試JDBCUtils工具類的代碼
      public class TestJDBCUtils {
        public static void main(String[] args)throws Exception {
            Connection con = JDBCUtils.getConnection();
            PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");
            ResultSet rs = pst.executeQuery();
            while(rs.next()){
                System.out.println(rs.getString("sname"));
            }
            JDBCUtils.close(con, pst, rs);
        }
      

      }

17 數(shù)據(jù)表數(shù)據(jù)存儲(chǔ)對(duì)象

  • A: 數(shù)據(jù)表數(shù)據(jù)存儲(chǔ)對(duì)象
    • a: 準(zhǔn)備工作
      • 導(dǎo)入jar包

      • 使用上述定義的工具類JDBCUtils

      • b: 案例代碼

          //定義實(shí)體類Sort
          public class Sort {
          private int sid;
          private String sname;
          private double sprice;
          private String sdesc;
          public Sort(int sid, String sname, double sprice, String sdesc) {
              this.sid = sid;
              this.sname = sname;
              this.sprice = sprice;
              this.sdesc = sdesc;
          }
          public Sort(){}
          public int getSid() {
              return sid;
          }
          public void setSid(int sid) {
              this.sid = sid;
          }
          public String getSname() {
              return sname;
          }
          public void setSname(String sname) {
              this.sname = sname;
          }
          public double getSprice() {
              return sprice;
          }
          public void setSprice(double sprice) {
              this.sprice = sprice;
          }
          public String getSdesc() {
              return sdesc;
          }
          public void setSdesc(String sdesc) {
              this.sdesc = sdesc;
          }
          @Override
          public String toString() {
              return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
          }               
        }
        
        /*
         *  JDBC讀取數(shù)據(jù)表sort,每行數(shù)據(jù)封裝到Sort類的對(duì)象中
         *  很多個(gè)Sort類對(duì)象,存儲(chǔ)到List集合中
         */
        public class JDBCDemo {
          public static void main(String[] args) throws Exception{
              //使用JDBC工具類,直接獲取數(shù)據(jù)庫連接對(duì)象
              Connection con = JDBCUtils.getConnection();
              //連接獲取數(shù)據(jù)庫SQL語句執(zhí)行者對(duì)象
              PreparedStatement pst = con.prepareStatement("SELECT * FROM sort");
              //調(diào)用查詢方法,獲取結(jié)果集
              ResultSet rs = pst.executeQuery();
              //創(chuàng)建集合對(duì)象
              List<Sort> list = new ArrayList<Sort>();
              while(rs.next()){
                  //獲取到每個(gè)列數(shù)據(jù),封裝到Sort對(duì)象中
                  Sort s = new Sort(rs.getInt("sid"),rs.getString("sname"),rs.getDouble("sprice"),rs.getString("sdesc"));
                  //封裝的Sort對(duì)象,存儲(chǔ)到集合中
                  list.add(s);
              }
              JDBCUtils.close(con, pst, rs);
              //遍歷List集合
              for(Sort s : list){
                  System.out.println(s);
              }
          }
        }
        

18 properties配置文件

  • A: properties配置文件
    • a: 相關(guān)介紹
      • 開發(fā)中獲得連接的4個(gè)參數(shù)(驅(qū)動(dòng)、URL舌镶、用戶名柱彻、密碼)通常都存在配置文件中豪娜,方便后期維護(hù),程序如果需要更換數(shù)據(jù)庫绒疗,
        只需要修改配置文件即可侵歇。
      • 通常情況下,我們習(xí)慣使用properties文件吓蘑,此文件我們將做如下要求:
        1. 文件位置:任意惕虑,建議src下
        2. 文件名稱:任意,擴(kuò)展名為properties
        3. 文件內(nèi)容:一行一組數(shù)據(jù)磨镶,格式是“key=value”.
        a) key命名自定義溃蔫,如果是多個(gè)單詞,習(xí)慣使用點(diǎn)分隔琳猫。例如:jdbc.driver
        b) value值不支持中文伟叛,如果需要使用非英文字符,將進(jìn)行unicode轉(zhuǎn)換脐嫂。

19 properties文件的創(chuàng)建和編寫

  • A: properties文件的創(chuàng)建和編寫
    • a: properties文件的創(chuàng)建

      • src路徑下建立database.properties(其實(shí)就是一個(gè)文本文件)
    • b: properties文件的編寫(內(nèi)容如下)

        driverClass=com.mysql.jdbc.Driver
        url=jdbc:mysql://localhost:3296/mybase
        username=root
        password=123        
      

20 加載配置文件

  • A: 加載配置文件
    • a: 案例代碼

         /*
          *  加載properties配置文件
          *  IO讀取文件,鍵值對(duì)存儲(chǔ)到集合
          *  從集合中以鍵值對(duì)方式獲取數(shù)據(jù)庫的連接信息,完成數(shù)據(jù)庫的連接
          */
         public class PropertiesDemo {
             public static void main(String[] args) throws Exception{
                 FileInputStream fis = new FileInputStream("database.properties");
                 System.out.println(fis);
                 //使用類的加載器
                 InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
                 System.out.println(in);
                 Properties pro = new Properties();
                 pro.load(in);
                 System.out.println(in);                 
             }
         }
      

21 通過配置文件連接數(shù)據(jù)庫

  • A: 通過配置文件連接數(shù)據(jù)庫
    • a: 案例代碼

        /*
         *  加載properties配置文件
         *  IO讀取文件,鍵值對(duì)存儲(chǔ)到集合
         *  從集合中以鍵值對(duì)方式獲取數(shù)據(jù)庫的連接信息,完成數(shù)據(jù)庫的連接
         */
        public class PropertiesDemo {
            public static void main(String[] args) throws Exception{
                FileInputStream fis = new FileInputStream("database.properties");
                System.out.println(fis);
                //使用類的加載器
                InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
                System.out.println(in);
                Properties pro = new Properties();
                pro.load(in);
                //獲取集合中的鍵值對(duì)
                String driverClass=pro.getProperty("driverClass");
                String url = pro.getProperty("url");
                String username = pro.getProperty("username");
                String password = pro.getProperty("password");
                Class.forName(driverClass);
                Connection con = DriverManager.getConnection(url, username, password);
                System.out.println(con);
                
            }
        }
      

22 讀取配置文件的工具類

  • A: 讀取配置文件的工具類
    • a: 案例代碼

        /*
         *  編寫數(shù)據(jù)庫連接的工具類,JDBC工具類
         *  獲取連接對(duì)象采用讀取配置文件方式
         *  讀取文件獲取連接,執(zhí)行一次,static{}
         */
        public class JDBCUtilsConfig {
            private static Connection con ;
            private static String driverClass;
            private static String url;
            private static String username;
            private static String password;
            
            static{
                try{
                    readConfig();
                    Class.forName(driverClass);
                    con = DriverManager.getConnection(url, username, password);
                }catch(Exception ex){
                    throw new RuntimeException("數(shù)據(jù)庫連接失敗");
                }
            }
            
            private static void readConfig()throws Exception{
                InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");
                 Properties pro = new Properties();
                 pro.load(in);
                 driverClass=pro.getProperty("driverClass");
                 url = pro.getProperty("url");
                 username = pro.getProperty("username");
                 password = pro.getProperty("password");
            }
            
            
            public static Connection getConnection(){
                return con;
            }
            
        }           
      

23 測(cè)試工具類

  • A: 測(cè)試工具類
    • a: 案例代碼

        public class TestJDBCUtils {
            public static void main(String[] args) {
                Connection con = JDBCUtilsConfig.getConnection();
                System.out.println(con);
            }
        }
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末统刮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子账千,更是在濱河造成了極大的恐慌侥蒙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匀奏,死亡現(xiàn)場(chǎng)離奇詭異鞭衩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娃善,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門论衍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人聚磺,你說我怎么就攤上這事坯台。” “怎么了瘫寝?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蜒蕾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我矢沿,道長(zhǎng)滥搭,這世上最難降的妖魔是什么酸纲? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任捣鲸,我火速辦了婚禮,結(jié)果婚禮上闽坡,老公的妹妹穿的比我還像新娘栽惶。我一直安慰自己愁溜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布外厂。 她就那樣靜靜地躺著冕象,像睡著了一般。 火紅的嫁衣襯著肌膚如雪汁蝶。 梳的紋絲不亂的頭發(fā)上渐扮,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音掖棉,去河邊找鬼墓律。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幔亥,可吹牛的內(nèi)容都是我干的耻讽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼帕棉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼针肥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起香伴,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤慰枕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瞒窒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捺僻,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年崇裁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匕坯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拔稳,死狀恐怖葛峻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巴比,我是刑警寧澤术奖,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站轻绞,受9級(jí)特大地震影響采记,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜政勃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一唧龄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奸远,春花似錦既棺、人聲如沸讽挟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耽梅。三九已至,卻和暖如春胖烛,著一層夾襖步出監(jiān)牢的瞬間眼姐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工佩番, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妥凳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓答捕,卻偏偏與公主長(zhǎng)得像逝钥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拱镐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 預(yù)編譯sql處理(防止sql注入) Statement : 執(zhí)行SQL命令CallableStatement : ...
    奮斗的老王閱讀 1,144評(píng)論 2 52
  • 本文內(nèi)容 1.什么是JDBC以及為什么要使用JDBC 2.JDBC核心API的講解 3.使用JDBC核心API進(jìn)行...
    Vincilovfang閱讀 1,216評(píng)論 0 11
  • 刷朋友圈的時(shí)候沃琅,突然看到麥片發(fā)了這樣一條:“我的女朋友酥餅哗咆,你的男朋友很想你。希望看到這條的朋友們能幫忙轉(zhuǎn)告那位小...
    概率論2018閱讀 597評(píng)論 0 0
  • 桑樹益眉,只有在夏天才是它最美好的季節(jié)晌柬。如果您見過桑樹、吃過桑葚郭脂,就一定會(huì)同意我的看法的年碘。 當(dāng)然,春天的桑樹也很美展鸡。因...
    阿蓬阿霞閱讀 4,016評(píng)論 45 43
  • 曾子說屿衅,孝要走心,孔子說孝不但要走心莹弊,還要走對(duì)方向…… 一 孔子的學(xué)生曾子涤久,是個(gè)大孝子。 曾子家里比較貧苦忍弛,但他奉...
    小伢兒國(guó)學(xué)閱讀 419評(píng)論 0 2