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データストレージのバインドマウントの詳細な説明
目次1. typeof演算子2. インスタンスオブ演算子3. typeof と instanceof...
目次構造継承(callで実装)プロトタイプチェーン継承(プロトタイプチェーンの助けを借りて実装)複合...
yum で vsftpd をインストールします [root@localhost など]# yum -...
目次結合アルゴリズム駆動テーブルと非駆動テーブルの違い1. 単純なネストループ結合、単純なネスト、イ...
写真といえば、まず背景画像が思い浮かびます。私たちの装飾の多くは背景画像を使用して実現されているから...
1. tomcatイメージをダウンロードする docker pull tomcat:8.5.29 2...
この記事では、登録またはログイン時に電子メール アドレスを入力する際のドロップダウン プロンプトのネ...
目次序文 👀リサーチを始めましょう🐱🏍オリジナル🧶 indexOf を使用した元の方法の最適化 ✍...
配列[1,8,5,4,3,9,2]が与えられた場合、配列の最大値9と最小値1を取得するアルゴリズムを...
ログイン dockerログインdocker login コマンドを実行し、ユーザー名、パスワード、メ...
概要: この記事では主に、Windows 環境に MySQL をインストールする方法について説明しま...
この記事は主に、以前のインストール方法を使用して MySQL 5.7.14 をインストールするときに...
目次歴史pushState() メソッドpushState() の使用シナリオreplaceStat...
:= と = の違い=設定および更新の場合にのみ、:= と同じ効果、つまり代入効果があり、それ以外の...
1. Docker 起動時の異常なパフォーマンス: 1. ステータスが繰り返し再起動している場合は、...