29_Java_データベース_29日目(JDBC、DBUtils)講義

28338 ワード

今日の内容紹介1、JDBC 2、DBUtils
01 JDBCコンセプトとデータベースドライバ
* A: JDBC          
    * a: JDBC       
        * JDBC(Java Data Base Connectivity,java     )       SQL   Java API,
                            ,     Java           。 Java          
        * JDBC       ,               ,                   。
        * JDBC      ,            ,          ,            ,
                          ,              。
        *       mysql   mysql-connector-java-5.1.39-bin.jar
    * b:   
        * JDBC java                  
        *                 
        

02 JDBC原理
* A: JDBC  
    * a:   
        * Java           JDBC,                 
        * DBC   ,        ,              ,         !
                             ,            ,                   。
        *    day29_source/JDBC    .JPG
                

03データの準備
* A:     
    * a:          
        #     
        create database mybase;
        #     
        use mybase;
        ###     
        create table sort(
          sid int PRIMARY KEY AUTO_INCREMENT,
          sname varchar(100),
          sprice DOUBLE,
          sdesc VARCHAR(500)
        );
        
    * b:        
        #     
        insert into sort(sname,sprice,sdesc) values('  ',2000, '     ');
        insert into sort(sname,sprice,sdesc) values('  ',8900, '      ,     ');
        insert into sort(sname,sprice,sdesc) values('    ',290, '     ');
        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, '     ');          
        

04 JDBCの開発手順
* A: JDBC     
    * a:     
        1.    
              JVM             
        2.    
              JDBC   ,   MySQL      
        3.        
                     SQL        
        4.  sql  
                   ,      SQL  
                         
        5.    
        6.        close()
                    

05 mysqlデータベースドライバjarパッケージのインポート
* A:   mysql       jar 
    * a:   
        *   lib  ,             jar 
        *   jar ,    build path / Add to Build Path

06データベースドライバの登録
* A:          
    * a:     
        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.         ,         
                //   java.sql.DriverManager      registerDriver(Driver driver)
                // Diver     ,    ,MySQL         
                //DriverManager.registerDriver(new Driver());
                //      ,  2     
                Class.forName("com.mysql.jdbc.Driver");                 
            }
        }

07データベースの接続先を取得する
* A:          
    * a:     
        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.         ,         
                //   java.sql.DriverManager      registerDriver(Driver driver)
                // Diver     ,    ,MySQL         
                //DriverManager.registerDriver(new Driver());
                //      ,  2     
                Class.forName("com.mysql.jdbc.Driver");
                
                //2.         DriverManager      
                //static Connection getConnection(String url, String user, String password)  
                //    Connection      , mysql    
                //url:        jdbc:mysql://    IP:   //     
                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文の実行オブジェクトの取得
* A:   SQL         
    * a:     
        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.         ,         
                //   java.sql.DriverManager      registerDriver(Driver driver)
                // Diver     ,    ,MySQL         
                //DriverManager.registerDriver(new Driver());
                //      ,  2     
                Class.forName("com.mysql.jdbc.Driver");
                
                //2.         DriverManager      
                //static Connection getConnection(String url, String user, String password)  
                //    Connection      , mysql    
                //url:        jdbc:mysql://    IP:   //     
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                
                //3.        ,          ,   SQL        
                // con         Statement createStatement()   Statement  , SQL        
                //      Statement        ,, mysql    
                Statement stat = con.createStatement();
                System.out.println(stat);
            }
        }

09 insert文取得結果セットの実行
* A:   insert       
    * a:     
        public class JDBCDemo {
            public static void main(String[] args)throws ClassNotFoundException,SQLException{
                //1.         ,         
                //   java.sql.DriverManager      registerDriver(Driver driver)
                // Diver     ,    ,MySQL         
                //DriverManager.registerDriver(new Driver());
                //      ,  2     
                Class.forName("com.mysql.jdbc.Driver");
                
                //2.         DriverManager      
                //static Connection getConnection(String url, String user, String password)  
                //    Connection      , mysql    
                //url:        jdbc:mysql://    IP:   //     
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                
                //3.        ,          ,   SQL        
                // con         Statement createStatement()   Statement  , SQL        
                //      Statement        ,, mysql    
                Statement stat = con.createStatement();
                //  4.  sql  
                //              SQL  ,    
                // int executeUpdate(String sql)         SQL  , insert delete update
                //    int,          
                int row = stat.executeUpdate
                        ("INSERT INTO sort(sname,sprice,sdesc) VALUES('    ',50000,'    ')");
                System.out.println(row);
                
                //6.        close()
                stat.close();
                con.close();
            }
        }
        

10 select文の実行結果セットの取得
* A:   select       
    * a:     
        public class JDBCDemo1 {
            public static void main(String[] args) throws Exception{
                //1.     
                Class.forName("com.mysql.jdbc.Driver");
                //2.       
                String url = "jdbc:mysql://localhost:3296/mybase";
                String username="root";
                String password="123";
                Connection con = DriverManager.getConnection(url, username, password);
                //3 .    SQL     
                Statement stat = con.createStatement();
                //      SQL
                String sql = "SELECT * FROM sort";
                //4.          ,  SQL       
                // ResultSet executeQuery(String sql)    SQL    select  
                //    ResultSet        ,    mysql   
                ResultSet rs = stat.executeQuery(sql);
                //5 .     
                // ResultSet     boolean next()   true,    ,  false     
                while(rs.next()){
                    //      ,   ResultSet      getXX     ,   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:     
        *        SQL    :
        * SELECT * FROM     WHERE NAME =          AND PASSWORD =       ;
        *   ,              ,            。
                       XXX    :XXX’  OR ‘a’=’a ,          :
            * SELECT * FROM     WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;
        *   ,                 。            ,     
        *          ,   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();
                
                //  SQL  ,   ,        ,    ,    ,       
        //      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インタフェースSQL文のプリコンパイル
* A: PrepareStatement     SQL  
    * a:      
        *   PreparedStatement      ,    sql         ,       。
        * String sql = "insert into sort(sid,sname) values(?,?)";;
        * PreparedStatement       :
        * PreparedStatement psmt = conn.prepareStatement(sql)
        
    * b:   SQL       
        * int executeUpdate(); --  insert update delete  .
        * ResultSet executeQuery(); --  select  .
        * boolean execute(); --  select  true          false.
    * c:       
        * void setXxx(int index, Xxx xx)           Java xx 。           ,            SQL Xxx   。
        *   :
            * setString(2, "    ")  SQL    2       ?         "    "
    * d:     
        /*
         *  Java        ,      ,     
         *        
         *  Statement     ,    SQL  ,     
         *        PreparedStatement  (SQL     ,       SQL) 
         *  PreparedStatement           ,          
         *  
         *   Connection          
         *  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();
                
                //  SQL  ,   ,        ,    ,    ,       
                String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
                //  Connection     prepareStatement,  PrepareStatement      
                //     ,SQL               
                PreparedStatement pst =  con.prepareStatement(sql);
                System.out.println(pst);
                //  pst  set  ,           
                pst.setObject(1, user);
                pst.setObject(2, pass);
                
                //    ,  SQL,     
                ResultSet rs = pst.executeQuery();
                while(rs.next()){
                    System.out.println(rs.getString("username")+"   "+rs.getString("password"));
                }
                
                rs.close();
                pst.close();
                con.close();
            }
        }

14 PrepareStatementインタフェースSQL文の事前コンパイルによる変更
* A: PrepareStatement     SQL      
    *     
        /*
         *    PrepareStatement  ,          
         */
        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  ,    ?  
                String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
                //         con   prepareStatement  SQL        
                PreparedStatement pst = con.prepareStatement(sql);
                //  pst   setXXX  ?  
                pst.setObject(1, "    ");
                pst.setObject(2, 49988);
                pst.setObject(3, 7);
                //  pst    SQL  
                pst.executeUpdate();
                
                pst.close();
                con.close();
            }
        }

15 PrepareStatementインタフェースSQL文プリコンパイルクエリー
* A: PrepareStatement     SQL      
    * a:     
        /*
         *  PrepareStatement            
         */
        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);
                
                //  pst     ,      ,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のツールクラスとテスト
* A: JDBC       
    * 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+"       ");
                }
            }
            
            /*
             *       ,          
             */
            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){}
                 }
                 
            }
        }
    //  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データテーブルデータストアオブジェクト
* A:          
    * a:     
        *   jar 
        *   day32      JDBCUtils
        
    * b:     
        //     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     sort,       Sort     
         *     Sort   ,   List   
         */
        public class JDBCDemo {
            public static void main(String[] args) throws Exception{
                //  JDBC   ,           
                Connection con = JDBCUtils.getConnection();
                //       SQL       
                PreparedStatement pst = con.prepareStatement("SELECT * FROM sort");
                //      ,     
                ResultSet rs = pst.executeQuery();
                //      
                List list = new ArrayList();
                while(rs.next()){
                    //        ,   Sort   
                    Sort s = new Sort(rs.getInt("sid"),rs.getString("sname"),rs.getDouble("sprice"),rs.getString("sdesc"));
                    //   Sort  ,      
                    list.add(s);
                }
                JDBCUtils.close(con, pst, rs);
                //  List  
                for(Sort s : list){
                    System.out.println(s);
                }
            }
        }

18 propertiesプロファイル
* A: properties         
    * a:     
        *         4   (  、URL、   、  )          ,      ,           ,
                       。
        *      ,      properties  ,           :
            1.      :  ,  src 
            2.      :  ,    properties
            3.      :      ,   “key=value”.
                a)  key     ,       ,       。  :jdbc.driver
                b)  value      ,           ,   unicode  。

19 propertiesファイルの作成と作成
* A: properties        
    * a: properties     
        * src     database.properties(          )
    * b: properties     (    )
        driverClass=com.mysql.jdbc.Driver
        url=jdbc:mysql://localhost:3296/mybase
        username=root
        password=123        

20プロファイルのロード
* A:       
    * a:            
        /*
         *    properties    
         *  IO    ,        
         *                      ,        
         */
        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プロファイルによるデータベース接続
* A:            
    * a:     
        /*
         *    properties    
         *  IO    ,        
         *                      ,        
         */
        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);
                //         
                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:     
        /*
         *             ,JDBC   
         *                  
         *          ,    ,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("       ");
                }
            }
            
            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テストツールクラス
* A:      
    * a:     
        public class TestJDBCUtils {
            public static void main(String[] args) {
                Connection con = JDBCUtilsConfig.getConnection();
                System.out.println(con);
            }
        }

ジョブテスト
JDBCUtilsツールクラスを独立して書くことができ、JDBCUtilsツールクラスで機能を完成できることを保証し、JDBCUtilsツールクラスツールクラスを使わなくても機能を完成できることを保証しなければならない.
1.mapには次のようなデータがあります(ユーザー名=パスワード)
[liuyan=123456,wangbaoqiang=123321,fangbian=abcd,miejueshitai=123abc321]
 ip 127.0.0.1     stdb,             :admin 123456    userinfo      (id,username,password)
(1) map                
    *     map   keySet()       key   Set  ,   
(2)  map        userinfo           "      ",                   userinfo  
(map         )
    *       
    *    
    drop database stdb;
    create database stdb;
    use stdb;
    create table userinfo(
        id int(10) primary key auto_increment,
        username varchar(200),
        password varchar(200)
    );      
        

2.データベースstdb、ユーザー名adminパスワード123456すでに存在するテーブルstudentに5人の学生の情報、名前、性別、年齢、点数.
id(varchar(20))       name(varchar(20))      sex(varchar(20))     score(int(10))
 1                                                            80
 2                                                             75
 3                                                             95
 4                                                            55
 5                                                            68
 6                                                             50
 7                                                            32
(1)    ,  80       
(2)             100
(3)      60   ,    ,  ,  
(4)             ,              
(5)                          (id-name-sex-score),               (           )(id-name-sex-score)   studentInfo.txt   (    :id-name-sex-score)
(6)           public List getAllStudent(){}
(7)    id       public Student getStudentById(String id){}
(8)    id       public int deleteStudentById(String id){}//             ,      
(9)         public int addStudent(){}//               ,     
(10)    id       public int updateStudentById(String id){}//             ,