JavaでBaseDaoを実装する例の説明
以下のエディターは、Java でのカスタム アノテーションとリフレクションを使用した簡単な BaseDao の例を提供します。編集者はこれがとても良いと思ったので、参考として共有します。エディターに従って見てみましょう
一般的な ORM フレームワークでは、ほとんどの場合、エンティティとデータベース間のマッピングを実現するためのアノテーションが提供されています。ここでは、単純にカスタム アノテーションとリフレクションを使用して実行可能な SQL ステートメントを生成します。
これは全体的なディレクトリ構造です。元々はアノテーションをレビューするために作成されたプロジェクトです^.^
それでは、まずアイデアを決定しましょう。
1. @Table @Column アノテーションをカスタマイズします。
Hibernate を少し模倣し、@Table をクラスに作用させてエンティティ クラスとデータ テーブル間のマッピング関係を示し、属性値を入力させます。 @Table データ テーブル tableName の名前にマップします。@Column を属性に作用させて (set メソッドはここでは実装されていません)、属性とデータ テーブル フィールドの間のマッピング関係を示し、属性値を @Column にさせます。データテーブルフィールドの特定のフィールドにマッピングされます。
2. Dao レイヤーを模倣する必要があります
このとき、まず名前とパスワードの属性を持つエンティティ User を定義し、次に UserDao メソッドを定義します。 UserDao。UserDao と User をインスタンス化するとき、UserDao の save メソッドを呼び出し、User オブジェクトを渡し、SQL を「user (name,password) VALUES('cai に挿入する)」と設定します。 ' ,'123456')"、ここで user はデータ テーブルの名前、name、password はデータ テーブルのフィールド、'cai','123456' は User オブジェクトの属性です。
--------------------------------0.0コード分割線-------------------------- --------- ----------------------------------
//コラム。 java
package com.shu.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Column { String value(); }
//Table.java
package com.shu.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Table { String value(); }
//User.java
package com.shu.entity; import com.shu.annotation.Column; import com.shu.annotation.Table; @Table("t_user") public class User { @Column("name") private String name; @Column("password") private String password; public String getName() { return name; } public String getPassword() { return password; } public void setName(String name) { this.name = name; } public void setPassword(String password) { this.password = password; } }
//IBaseDao.java
// UserDao.java
package com.shu.dao; import java.lang.reflect.Field; import com.shu.annotation.Column; import com.shu.annotation.Table; public interface IBaseDao<T> { //最终目标:insert into user (NAME,password) VALUES('cai','123456'); default String save(T entity) throws IllegalArgumentException, IllegalAccessException{ //sql用于存放最终返回的sql语句 StringBuilder sql = new StringBuilder("insert into "); //tableName用于存放sql语句中表名部分 StringBuilder tableName; //columnName用于存放sql语句的字段部分 StringBuilder columnName = new StringBuilder("("); //values用于存放sql语句中的赋值部分 StringBuilder values = new StringBuilder("("); //获取对象user的class对象 Class clazz = entity.getClass(); //判断该User类是否有@Table注解 boolean isTable = clazz.isAnnotationPresent(Table.class); if(isTable) { //获取User类@Table注解的值value,该值我们定义为User表的表名称 Table t = (Table) clazz.getAnnotation(Table.class); tableName = new StringBuilder(t.value()); //拼接表名 sql.append(tableName+" "); //获取user对象的属性列表 Field[] fieldList = clazz.getDeclaredFields(); //遍历属性列表,分别拿出属性列表中被@Column注解的属性,并获取属性的值 for(int i=0;i<fieldList.length;i++){ Field f = fieldList[i]; boolean isColumn = f.isAnnotationPresent(Column.class); if(!isColumn){ continue; } Column column = f.getAnnotation(Column.class); f.setAccessible(true); Object columnValue = f.get(entity); if(i==fieldList.length-1){ columnName.append(column.value()+") VALUES "); values.append("'"+columnValue+"')"); sql.append(columnName); sql.append(values); continue; } columnName.append(column.value()+", "); values.append("'"+columnValue+"',"); } // boolean isColumn = clazz.isAnnotationPresent(annotationClass); } return sql.toString(); } }
//UserService.java
package com.shu.dao; import com.shu.entity.User; public class UserDao implements IBaseDao<User> { }
-------------------------------------- -----0.0 コード分割線 -------------------------------------- --------
ここで、最後にサービス層を定義しました。これで dao 層を呼び出し、対応する SQL ステートメントを生成します。ディレクトリ内の Order など、他のエンティティをカスタマイズして、 IBaseDao インターフェイスを実装する OrderDao と、OrderDao を呼び出す OrderService を定義する save メソッドは、注文テーブルに対応する SQL ステートメントを生成することもできます。
欠点の要約は次のとおりです:
1. Hibernate アノテーションは代入なしで取得できるため、代入せずにテーブルまたはフィールドの名前を直接取得するには、リフレクションを使用して取得できると思います。 。
2. ここでは save メソッドのみが使用されており、SQL ステートメントはデータベースと対話せずに動的に生成されます。これをファクトリにパッケージ化し、SQL ステートメントを実行するための永続化メソッドを提供します。
3. ここでの SQL のスプライシングは比較的大まかですが、他にもっと効率的な方法があるかどうかを考えることができます。
以上がJavaでBaseDaoを実装する例の説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
