JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

JDBCデータベースリンクと関連メソッドのカプセル化の詳細な説明

MySQL データベースを使用して、まずドライバー クラスをインポートし、次にデータベース URL とユーザー名およびパスワードに基づいてデータ リンクを取得します。 MySQL データベースが使用されるため、その URL は通常、jdbc:mysql:// ホスト アドレス:ポート番号/ライブラリ名 になります。

以下は、ジェネリックとリフレクションを使用する特定のカプセル化されたクラスです。ただし、まだいくつかの問題があります。使用されるジェネリック オブジェクトにはいくつかの制限があります。ジェネリック クラス オブジェクトの属性名がデータベース テーブルの列名と同じオブジェクトにのみ使用でき、オブジェクトを初期化するメソッドは、set+属性名メソッドである必要があります。本来は戻り値の型とパラメータリストでプロパティの初期化方法を決めたいと思っていました。しかし、今までの学習が少なすぎて3週間しか勉強していないため、実装できていません。この方法はまだ非常にレベルが低く、今後改善する必要があると感じています。もともとインターネットで、クエリされた列を保存し、それを直接オブジェクトに変換するために map を使用する便利な beanUtils パッケージを見ましたが、私は新しく学んだリフレクションを試してみたかったのです。さらに、最終的なガベージ コレクターは C++ デストラクタと同じにはできないため、データベース接続が閉じられる場所も改善する必要があります。

実装コード:

パブリッククラスConsql {
 private static Consql consql=null;//シングルトン設計パターン private Connection conn=null;//データベースリンク private final String url;//データベースURL
 private final String username;//データベースのユーザー名 private final String password;//データベースのパスワード //ドライバークラスの読み込み static{//ドライバークラスを静的コードブロックの形式で読み込みます。静的コードブロックは、クラスが読み込まれたときに 1 回だけ実行されます try {
   クラス.forName("com.mysql.jdbc.Driver");
  } キャッチ (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 //コンストラクタ private Consql(String url,String username,String password) throws SQLException{
  this.url = url;
  this.username = ユーザー名;
  this.password = パスワード;
  open(); //接続を作成する}
 プライベート接続 open() は SQLException をスローします
 {
  try{//ドライバーはデータベース リンクを取得します。conn=DriverManager.getConnection(url, username, password);
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   //e.printStackTrace();
   eを投げる;
  }  
  conn を返します。  
 }
 /**
  * 制限条件付きで検索 * プレースホルダー付きの @param sql? SQL ステートメント * @param t は関連する型オブジェクトのクラスを返します (T.class)
  * @param params は動的配列であるプレースホルダーデータを置き換えます * @return ArrayList<T>
  * @throwsSQLException 例外をスローします 
  */
 パブリック <T> ArrayList<T> select(String sql,Class<T> t,Object...params) は SQLException をスローします
 // クラス T のすべてのパブリック メソッドを取得します Method[] declarationdMethods = t.getDeclaredMethods();
  //このタイプのオブジェクトを保持するArrayList<T>コレクションを作成します。arrayList=new ArrayList<>();
  試してください (PreparedStatement pStatement=conn.prepareStatement(sql);)
  {   
   for(int i=0;i<params.length;i++)
   {
    pStatement.setObject(i+1, パラメータ[i]);
   }   
   ResultSet rSet を pStatement.executeQuery() で実行します。 
   {
    ResultSetMetaData rData=rSet.getMetaData();
    //クエリ結果テーブル内の列数を取得します。int columnCount = rData.getColumnCount();    
    (rSet.next()) の間 {
     T a=t.newInstance(); //ジェネリッククラスインスタンスを作成する for(int i=0;i<columnCount;i++)
     // 正方形配列で set メソッドを取得します。これにより制限が発生します。データベース テーブルの列名のみがオブジェクト名と一致でき、set メソッド String aString="set"+rData.getColumnName(i+1); のみ一致できます。
      for (メソッド method : 宣言されたメソッド) {
       メソッド.getParameterCount()==1&&メソッド.getReturnType().toString().equals("void")&&メソッド.getName().equalsIgnoreCase(aString))
       ここで問題があります。最初の 2 つの判定条件は基本的に役に立ちません。主な理由は、上記の文字列メソッドを使用して、パラメータ method.setAccessible(true); のメソッドを呼び出すかどうかを判断したくなかったためです。
        //リフレクションメソッドを使用してこのメ​​ソッドを呼び出します。invoke(a, rSet.getObject(i+1));
        壊す;
       }
      }
     }
     配列リストを追加します(a);
    }
   } キャッチ (InstantiationException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } キャッチ (IllegalAccessException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } キャッチ (IllegalArgumentException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } キャッチ (InvocationTargetException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } 
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
  配列リストを返します。  
 }
 /**
  *データ挿入* プレースホルダー付きの @param sql? SQL ステートメント * @param params はプレースホルダー データを置き換えます。動的配列 * @throws SQLException
  */
 パブリック void insert(String sql,Object...params) は SQLException をスローします
 {
  試してください(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   for(int i=0;i<params.length;i++)
   {
    pStatement.setObject(i+1, パラメータ[i]);
   }
   pStatement.executeUpdate();
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
 }
 /**
  *データ更新* プレースホルダー付きの @param sql? SQL ステートメント * @param params はプレースホルダー データを置き換えます。動的配列 * @throws SQLException
  */
 パブリック void update(String sql,Object...params) は SQLException をスローします
 {
  試してください(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   for(int i=0;i<params.length;i++)
   {
    pStatement.setObject(i+1, パラメータ[i]);
   }
   pStatement.executeUpdate();
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
 }
 /**
  * 制限条件付きで削除 * プレースホルダー付きの @param sql? SQL ステートメント * @param params はプレースホルダー データを置き換えます。動的配列 * @throws SQLException
  */
 パブリック void delete(String sql,Object...params) は SQLException をスローします
 {
  試してください(PreparedStatement pStatement=conn.prepareStatement(sql);) {
   
   for(int i=0;i<params.length;i++)
   {
    pStatement.setObject(i+1, パラメータ[i]);
   }
   pStatement.executeUpdate();
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
 }
 /**
  * 制限なしですべて削除 * @param sql
  * @throwsSQLException 例外をスローします
  */
 パブリック void deleteall(String sql) は SQLException をスローします
 {
  試してください(PreparedStatement pStatement=conn.prepareStatement(sql);) {      
   pStatement.executeUpdate();
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
 }
 /**
  * 無制限検索 * @param sql 
  * @param t ジェネリッククラス T.class
  * @return ArrayList<T>
  * @throwsSQLException 例外をスローします 
  */
 パブリック <T> ArrayList<T> select(String sql,Class<T> t) は SQLException をスローします
 {
  メソッド[]宣言されたメソッド = t.getDeclaredMethods();
  ArrayList<T> arrayList=新しいArrayList<>();
  試してください (PreparedStatement pStatement=conn.prepareStatement(sql);)
  {      
   ResultSet rSet を pStatement.executeQuery() で実行します。 
   {
    ResultSetMetaData rData=rSet.getMetaData();
    int 列数 = rData.getColumnCount();    
    (rSet.next()) の間 {
     T a = t.newInstance();
     for(int i=0;i<列数;i++)
     {
      文字列 aString="set"+rData.getColumnName(i+1);
      for (メソッド method : 宣言されたメソッド) {
       (method.getName().equalsIgnoreCase(aString)) の場合
       {
        メソッド.setAccessible(true);
        メソッドを呼び出します(a、rSet.getObject(i+1));
        壊す;
       }
      }
     }
     配列リストを追加します(a);
    }
   } キャッチ (InstantiationException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } キャッチ (IllegalAccessException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } キャッチ (IllegalArgumentException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } キャッチ (InvocationTargetException e) {
    // TODO 自動生成されたキャッチブロック
    e.printStackTrace();
   } 
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
  配列リストを返します。 
 }
 /**
  * テーブル内の行数を返します * @param tableName データベーステーブル名 * @return 行数 * @throws SQLException
  */
 パブリック int count(String tableName) は SQLException をスローします
 {
  文字列 sql="select count(*) from "+tableName;
  試してください(PreparedStatement pStatement=conn.prepareStatement(sql);
    結果セット rsSet = pStatement.executeQuery(); )
  {  
   rsSet.next() の場合
   {
    rsSet.getInt(1) を返します。
   }   
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
  0を返します。
 }
 /**
  * データが存在するかどうかを判断します * @param sql にプレースホルダーが含まれていますか? SQL文 * @param paramsはプレースホルダーデータを置き換えます、動的配列 * @return boolean
  * @throwsSQLException 例外をスローします
  */
 パブリック ブール isExist(String sql,Object...params) は SQLException をスローします
 {  
  試してください(PreparedStatement pStatement=conn.prepareStatement(sql);)
  {
   for(int i=0;i<params.length;i++)
   {
    pStatement.setObject(i+1, パラメータ[i]);
   }
   ResultSet rsSet = pStatement.executeQuery(); を試してください。
    rsSet.next() の場合
    {
     true を返します。
    }
   ついに
    
   }
  } キャッチ (SQLException e) {
   // TODO 自動生成されたキャッチブロック
   eを投げる;
  }
  false を返します。  
 }
 /**
  * インスタンスを作成 * @param url データベースのURL
  * @param username ユーザー名 * @param password パスワード * @return consql オブジェクト * @throws SQLException
  */
 パブリック静的Consql getnewInstance(String url,String username,String password) はSQLExceptionをスローします
 {
  if(consql==null)
   consql = 新しい Consql (URL、ユーザー名、パスワード);
  consql を返します。  
 }
 //ガベージコレクション、デストラクタの効果を達成できないようです protected void finalize() throws Throwable
 {
  if(conn!=null)
  {
   接続を閉じる();  
  }
  super.finalize();
 }
}

上記は、JDBC データベース リンクと関連メソッドのカプセル化の詳細な例です。ご質問がある場合は、メッセージを残すか、このサイトのコミュニティで議論してください。お読みいただきありがとうございます。皆様のお役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。

以下もご興味があるかもしれません:
  • JDBC のシンプルなカプセル化 (例の説明)
  • 単純な一般的なJDBC補助クラスのカプセル化(例)
  • JDBC カプセル化に基づく BaseDao (サンプル コード)
  • Java JDBC シンプルなカプセル化方法

<<:  ReactでCSSスタイルを動的に変更する2つの方法の詳細な説明

>>:  Dockerデータストレージのバインドマウントの詳細な説明

推薦する

MySQL が起動直後にシャットダウンする問題 (ibdata1 ファイルの破損が原因) に対する完璧な解決策

コンピュータ ルームのサーバー上の mysql がしばらく実行されていたのですが、突然、再起動しても...

MySQLは、統計クエリを最適化するために、sum、case、whenを巧みに使用します。

私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...

jsを呼び出すいくつかの方法が整理され、使用が推奨されています

a タグではクリック イベントがよく使用されます。 1. href="javascript...

MySQLオンラインデッドロック分析練習

序文MySQL を学習する際に、MySQL のロック メカニズムについて簡単に理解したことがあると思...

Nginx で Angular プロジェクトを展開する際の落とし穴

コンパイル後にAngularプロジェクトをNginxにデプロイする方法をオンラインで検索すると、ほと...

MySQL テーブル自動増分 ID オーバーフロー障害レビュー ソリューション

問題: MySQLテーブル内の自動増分IDのオーバーフローによりビジネスブロックが発生した背景: t...

WeChatアプレットがSMS認証コード送信のカウントダウンを実装

この記事では、WeChatアプレットがSMS認証コードのカウントダウンを送信するための具体的なコード...

VMware Workstation 14 Pro インストール Ubuntu 16.04 チュートリアル

この記事では、VMware Workstation14 ProにUbuntu 16.04をインストー...

Windows での MySQL の詳細なインストール手順と基本的な使用方法

目次1. MySQLをダウンロードする2. MySQLをインストールする3. MySQL の基本的な...

Linuxで権限が拒否された場合の解決策の詳細な説明

許可が拒否されました:その理由は、ファイルの読み取り、書き込み、作成、削除などの権限がないためです。...

HTML テーブル マークアップ チュートリアル (14): テーブル ヘッダー

<br />HTML 言語では、タグを使用してテーブルにタイトルを自動的に追加できます。...

Alibaba Cloud Server への Web プロジェクトのデプロイについて (5 つの手順)

1.まずAlibaba Cloudのウェブサイトにログインしてアカウントを登録し、サーバータイプを...

実行中の時計を実装するための純粋な CSS3 コード

操作効果コードの実装html <div id="ウォッチ"> <...

Nginx は gzip 圧縮に基づいてアクセス速度を向上します

1. nginx はなぜ gzip を使用するのですか? 1. 圧縮の役割:ページがgzipで圧縮さ...

JavaScript オブジェクトからプリミティブ値への変換の詳細な説明

目次オブジェクトプロトタイプの値()オブジェクトプロトタイプtoString()シンボル.toPri...