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 データベース リンクと関連メソッドのカプセル化の詳細な例です。ご質問がある場合は、メッセージを残すか、このサイトのコミュニティで議論してください。お読みいただきありがとうございます。皆様のお役に立てれば幸いです。このサイトをサポートしていただき、ありがとうございます。 以下もご興味があるかもしれません:
|
<<: ReactでCSSスタイルを動的に変更する2つの方法の詳細な説明
>>: Dockerデータストレージのバインドマウントの詳細な説明
フォーム入力ボックスの入力をdisable属性に設定して送信すると、入力ボックスの値を取得できなくな...
この記事では、角を丸くするためのjsキャンバスの具体的なコードを参考までに紹介します。具体的な内容は...
まず問題の説明から始めましょう:同じページで、1 つのタブに float:left が必要で、もう ...
この記事では、例を使用して、MySQL データベースの一般的な基本操作について説明します。ご参考まで...
1. ランナーコンテナを作成する mk@mk-pc:~/Desktop$ docker run -d...
目次1. 概要1.1 Functionコンストラクタを使用して関数を作成する1.2 機能と目的2. ...
目次考える1. 貪欲な蛇の効果画像2. スネークの分析2.1 ゲーム開始機能2.2 運動機能2.2....
<br />内容はインターネットから転載したものです。どこから見つけたのか忘れてしまいま...
概要リレーショナル データベースでは、インデックスは、データベース テーブル内の 1 つ以上の列の値...
症状Centos7 ホストに crontab タスクを設定しましたが、時間が来るとメールを実行して「...
序文MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステー...
目次主に使用されるPostmanの機能データの暗号化と復号化さまざまなパラメータ設定実際に送信された...
目次1. 接続管理2. オプティマイザレベルでの改善3. 機能の改善4. パフォーマンススキーマの最...
1. メニューバーで「編集」→「仮想ネットワーク エディター」を選択して仮想ネットワーク エディタ...
フロントエンド開発を行うと、PCとモバイル端末の適応に必然的に直面することになります。このような問題...