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データストレージのバインドマウントの詳細な説明

推薦する

Alibaba CloudにMySQLをインストールする方法の詳細な説明

軽量のオープンソース データベースである MySQL は、エンタープライズ レベルのアプリケーション...

MySQL マスタースレーブの原理と構成の詳細

MySQLのマスタースレーブ構成と原理、参考までに具体的な内容は以下のとおりです。 1. 環境の選択...

一般的でない js 演算演算子の概要

目次2. カンマ演算子3. JavaScript Null 結合演算子 (??) 4. JavaSc...

JavaScript を使用してカルーセル効果を実装する

この記事では、カルーセルマップの特殊効果を実現するためのJavaScriptの具体的なコードを参考ま...

MySQLの半同期の詳細な説明

目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...

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

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

高品質なJavaScriptコードの書き方

目次1. 読みやすいコード1. 統一コード形式2. マジックナンバーを削除する3. 単一機能原則2....

UTF8 でエンコードされた Web ページにファイルが含まれている場合の、ページの前の空白行の解決方法

<br />このページはUTF8エンコードを使用しており、ヘッダーとフッターはテンプレー...

リクエスト数を制限するために Ajax 同時リクエストを実装するために js を使用するサンプル コード

問題の説明: 非同期リクエストの数が不確定な場合、数百の http リクエストが瞬時に発生したときに...

HTML要素を非表示にするいくつかの方法

1. CSSを使用するコードをコピーコードは次のとおりです。スタイル="display:n...

CentOS プラットフォーム上で LAMP 環境を素早く構築する方法

この記事では、例を使用して、CentOS プラットフォーム上で LAMP 環境を迅速に構築する方法に...

Linux で Scala 環境を構築し、簡単な Scala プログラムを書く

Linux に Scala 環境をインストールするのは非常に簡単です。Ubuntu 環境であれば、さ...

vue3.2 で追加された defineCustomElement の基本原理の詳細な説明

目次Webコンポーネントカスタム要素概要HTMLTemplateElement コンテンツ テンプレ...

JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...

HTML における Div と table の違い (あらゆる側面から詳細に説明)

1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...