mysql詳細学習(二)

54693 ワード

7.索引
インデックス(index)によるグループ化により、データの構造を効率的に取得
:文の主幹を抽出し、インデックスの本質を得ることができる:インデックスはデータ構造である
7.1インデックスの分類
1つのテーブルのプライマリ・キー・インデックスは1つのみで、一意のインデックスは1つだけではありません.
  • プライマリ・キー・インデックス
  • 一意の識別子で、重複することはできません.1つの列だけがプライマリ・キー
  • です.
  • ユニークインデックス
  • 重複する列の出現を回避し、重複することができ、複数の列は一意のインデックス
  • を識別することができる.
  • 通常インデックス(key/index)
  • デフォルトindex,keyキーワード
  • を設定
  • 全文インデックス:(fulltext)
  • は特定のデータベースエンジンにのみ存在し、
  • 快速位置決めデータ

  • 基礎文法
    --     :
    
    --              
    
    --     ,    
    --         
    show index from table1
    --        (   )  
    1. alert    .table add fulltext index     (  )
    2. create index     on table (   )
    explain   sql    
    explain select * from table1; ---     
    explain select * from table1 where match (   ) against ('      '

    7.2インデックスのテスト
    delilmiter $$  --      ,  
    create function mock_data()
    return int  
    begin 
    end
    
    
           ,      ,   
    
    

    7.3インデックスの原則
  • インデックスは多ければ多いほど良いわけではありません
  • 小さなデータはインデックス
  • を必要としません.
  • インデックスは、クエリのフィールドに一般的に追加される
  • プロセスが変動するフィールドにインデックスを付けない
  • インデックスのデータ構造:
    INNodb:Btree
    8.権限管理とバックアップ
    8.1ユーザー管理
    SQLyog可視化ユーザ管理
    SQLコマンド:
    ユーザーテーブル:mysql.user
    本質:ユーザーテーブルの削除と変更
    --    
    create user    identitfied by   
    --    
    --1.    
    set password = password('mima')
    --2.    
    set password for    = password('mima')
    --    
    rename user     to    
    --      
    --all privileges:      ,       ;
    --*.*:    , ,
    grant all privileges on *.* to   
    --        
    show grants for   
    --      
    show grants  for root@localhost
    --    
    revoke all privileges on *.*  from   
    

    8.2データベースバックアップ
  • 重要なデータが失われないことを保証する
  • データ転送
  • バックアップ方法:
  • 直接コピー物理ファイル(data)
  • sqlyogビジュアル化ツールで
  • を手動でエクスポート
  • コマンドラインエクスポート:mysqldump
  • mysqldump -h    -u     -p           >                    --     
    mysqldump -h    -u     -p          123 >          --     
    mysqldump -h    -u     -p         >                    --     
    --  
    --      ,         
    --source     
    source   
    
    

  • 9規範データベース設計
    データベースが複雑な場合は、設計が必要です.
    悪いデータベース設計:
  • データ冗長、スペースを浪費するデータ挿入と削除が面倒、異常マルチプログラム性能差
  • 優れたデータベース:
  • メモリ節約
  • データベースの整合性を保証する
  • 便利開発
  • 設計:
  • 分析需要:業務と処理のデータベースを分析する需要
  • 概要設計:設計関係図,e_r図


  • 手順(ブログサイト):
  • 情報収集、需要分析
  • ユーザテーブル(ユーザ登録、個人情報、ブログ作成、分類作成)
  • 分類表(文章分類)
  • コメント表
  • 記事表(記事の情報)
  • 友鎖表(友鎖情報)
  • カスタムテーブル
  • IDエンティティ(需要をフィールドにドロップ)
  • エンティティ間の関係を識別します:
  • ブログを書く:user->blog
  • 分類の作成:user->category
  • 注:user->user
  • 友鎖:links
  • コメントテーブルuser->user-blog

  • データベースの3つのパターン
    第1パターン(1 NF):原子性、各列は分けられない
    第2のパターン:前提:第1のパターンを満たし、各テーブルには1つのことしか記述されていません.
    第3のパターン:第2のパターンが前提です.各プロパティがプライマリ・キーに直接関連していることを確認します.
    10 JDBC
    アプリケーション–JDBC----データベースドライバ--データベース
    開発者にとってjdbcは勉強しなければならないという.
    java.sql
    javax.sql
  • JDBCをインストールjarパッケージ
  • をインポート
    [外部チェーン画像の転送に失敗しました.ソース局に盗難防止チェーン機構がある可能性があります.画像を保存して直接アップロードすることをお勧めします(img-WJPeAcER-15292309360936593999)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-2020061620415244.png)]
  • は、まず自分が作成したlibフォルダにコピーし、ADD as library
  • にコピーする.
  • テストコード:
    //1 .    
    Class.forName("com.mysql.jdbc.Driver")
    //2.     URL
        jdbc:mysql://    :3306/    ?  1&  2&  3.
    String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&charaterEncoding"
    String username = "root";
    String password = "123";
    //3     ,connection:     
    //connection      ,        ,  ,,,,
    Connection connection = DriverManager.getConnection(url,username,password);
    //4.  sql  ,statement :  sql   
    Statement   statement  = connection.createStatement();
    //5. SQL  
    String sql  = "select * from users"
    //6   sql    statement  ,  ,        
    ResultSet resultset = statement.executeQuery(sql);//     
    // 7    
    result.closes();
    statement.close();
    connection.close();
    
    //connection      ,               ,  ,,,,
    //statement:sQL  
    statement.executeQuery()//  ,     
    statement.execute();//      
    statement.executeUpdate();//  ,  ,  ,       
    
    // resultset    
     resultset.getObject();//         ,              。
     resultset.getString();
     resultset.getInt();
    ...
    
    
    // resultset
      : resultset.next():        
         resultset.previous():      
         resultset.absolute(row):     
    
  • statementオブジェクト
    jdbc中:statementオブジェクトはデータベースにSQL文を送信するために使用され、データベースの削除変更を完了するには、このオブジェクトがデータベースにクエリー文を送信するだけでよい.
    //    ------executeUpdate
    //executeUpdate      
    Statement st = connection.createStatement();
    String sql = "insert into  user(...)values(....)";
    int num = st,executeUpdate(sql);
    if (num>0){
        system.out.ptint("    ")
    }
    ————————————————————————————————————————————
    //executeUpdate      
    Statement st = connection.createStatement();
    String sql = "delete from user where id = 1";
    int num = st,executeUpdate(sql);
    if (num>0){
        system.out.ptint("    ")
    }
    
    ______________________________________________
    //executeUpdate       
    Statement st = connection.createStatement();
    String sql = "update user set name = "hhh" where name = "dd";
    int num = st,executeUpdate(sql);
    if (num>0){
        system.out.ptint("    ")
    }    
        
    
    
    
    //   executeQuery,     
    Statement st = connection.createStatement();
    String sql  = "select * from users"
    ResultSet resultset = st.executeQuery(sql);//     
    

    一般的な書き方:
    Java上のsrcファイルディレクトリの下にpropertiesプロファイルを作成する
    //       db.propeties
    driver = com.mysql.jdbc.Driver
    url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&charaterEncoding"
    username = "root";
    password = "123";
    
    
    //      ,      ,    
    public class jdbcUtils{
        private static String driver = null; //     ,    static,    
        private static String url = null;
        private static String usename = null;
        private static String password = null;
        static{
            try{
                IntpuStream in  = jdbcUtils.class.getClassLoader().getResourceAsStream("db.propeties");
                //      jdbcUtils             
                Properties properties = new Properties();//       
                properties.load(in);//     
                driver = properties.getProperty("driver");
                url = properties.getProperty("driver");
                usename = properties.getProperty("driver");
                password = properties.getProperty("driver");
                class.forName("driver");//    
                
            }catch(Exception e){
                e.printStackTrace ();
                
            }
        }
        
        //    
        public static Connection getConnection() throws SQLException{
            return  DriverManager.getConnection(url,username,password);
        }
        //    
        public void  static release(Connection conne,Statement st,ResultSet rs ){
            if(rs!=null){
                rs.close();
                
            } if(st!=null){
                st.close();
                
            }
        }if(conn!=null)
        {
            conn.close();
        }
    }
    //   ,java     
    

    SQL注入の問題
    sqlに脆弱性があり、データの漏洩を招く:SQL文がつなぎ合わされるor、
    PreparedStatement:SQL注入を防止し、効率が高い
    Statementのサブクラスです
    //       db.propeties
    driver = com.mysql.jdbc.Driver
    url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&charaterEncoding"
    username = "root";
    password = "123";
    
    
    //      ,      ,    
    public class jdbcUtils{
        private static String driver = null; //     ,    static,    
        private static String url = null;
        private static String usename = null;
        private static String password = null;
        static{
            try{
                IntpuStream in  = jdbcUtils.class.getClassLoader().getResourceAsStream("db.propeties");
                //      jdbcUtils             
                Properties properties = new Properties();//       
                properties.load(in);//     
                driver = properties.getProperty("driver");
                url = properties.getProperty("driver");
                usename = properties.getProperty("driver");
                password = properties.getProperty("driver");
                class.forName("driver");//    
                
            }catch(Exception e){
                e.printStackTrace ();
                
            }
        }
        
        //    
        public static Connection getConnection() throws SQLException{
            return  DriverManager.getConnection(url,username,password);
        }
        //    
        public void  static release(Connection conne,Statement st,ResultSet rs ){
            if(rs!=null){
                rs.close();
                
            } if(st!=null){
                st.close();
                
            }
        }if(conn!=null)
        {
            conn.close();
        }
    }
    //   ,java       
    public class testInsert{
        public static void main(string [] args){
            Connection conn  = null;//     
            PrepareStatement st = null;//  PrepareStatement  
            try{
                conn = jdbcUtils.getConnection();
                //  
                //  ?       
                String sql  = "insert into user (id,name,password,birthday) values (?,?,?,?)"
                    st = conn.prepareStatement(sql);//   SQL,  ,      
                //       
                st.setInt(1,4);
                st.setString(2,"  ");
                 st.setString(3,"123");
                //  :             date,   java   
                //  new Date().getTime()   。
                 st.setDate(4,new java.sql.Date(new Date().getTime()));
                //  
                int i = st.executeUpdate();
                if (i>0){
                    System.out.print("    ")
                }
                
            }catch(Excetipn e){
                e.printStackTrae();
            }finally{
                jdbcUtils.release(conn,st.rs);
            }
        }
    }
    //   java       
    public class testInsert{
        public static void main(string [] args){
            Connection conn  = null;//     
            PrepareStatement st = null;//  PrepareStatement  
            try{
                conn = jdbcUtils.getConnection();
                //  
                //  ?       
                String sql  = "delete from user where id =?"
                    st = conn.prepareStatement(sql);//   SQL,  ,      
                //       
                st.setInt(1,4);
               
                int i = st.executeUpdate();
                if (i>0){
                    System.out.print("    ")
                }
                
            }catch(Excetipn e){
                e.printStackTrae();
            }finally{
                jdbcUtils.release(conn,st.rs);
            }
        }
    }
    // ⑤ java       
    public class testInsert{
        public static void main(string [] args){
            Connection conn  = null;//     
            PrepareStatement st = null;//  PrepareStatement  
            try{
                conn = jdbcUtils.getConnection();
                //  
                //  ?       
                String sql  = "update user set name = ? where id = ?"
                    st = conn.prepareStatement(sql);//   SQL,  ,      
                //       
                
                st.setString(2,"  ");
                 st.setString(3,"123");
               
                
                //  
               int i = st.executeUpdate();
                if (i>0){
                    System.out.print("    ")
                }
                
            }catch(Excetipn e){
                e.printStackTrae();
            }finally{
                jdbcUtils.release(conn,st.rs);
            }
        }
    }
    //java  
    public class testInsert{
        public static void main(string [] args){
            Connection conn  = null;//     
            PrepareStatement st = null;//  PrepareStatement  
            ResultSet rs = null;
            try{
                conn = jdbcUtils.getConnection();
                //  
                //  ?       
                String sql  = "select * from user where id = ?"
                    st = conn.prepareStatement(sql);//   SQL,  ,      
                //       
                st.setInt(1,4);
             
                 rs = st.executeQuery();
                while (rs.next()){
                    System.out.print(rs.getString("name"));
                }
                
            }catch(Excetipn e){
                e.printStackTrae();
            }finally{
                jdbcUtils.release(conn,st.rs);
            }
        }
    }
    

    prepareStatement注入防止の本質:伝達されたパラメータを文字とする
    エスケープ文字が直接無視されます
    データベース接続プール
    ≪データベース|Database|ldap≫:≪接続|Connection|ldap≫:≪リソースの解放|Release Resources|ldap≫:リソースの浪費
    プール化テクノロジー:
    事前のリソースを用意して、来たら接続して準備します.
    最小接続数
    最大接続数
    待ち時間
    接続プールを作成し、インタフェースDataSourceを実現
    オープンソースデータソース実装
  • DBcp
  • C3p0
  • Druid:アリ
  • これらのデータベース接続プールを使用すると、プロジェクト開発でデータベースに接続するコードを記述しないでください.
    DBCP
    まず対応jarパッケージをインポートし、対応する方法でドライバをロードし、