以下のエディターは、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 サイトの他の関連記事を参照してください。