ホームページ  >  記事  >  Java  >  JavaでBaseDaoを実装する例の説明

JavaでBaseDaoを実装する例の説明

巴扎黑
巴扎黑オリジナル
2017-09-08 09:37:312792ブラウズ

以下のエディターは、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(&#39;cai&#39;,&#39;123456&#39;);
 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("&#39;"+columnValue+"&#39;)");
     sql.append(columnName);
     sql.append(values);
     continue;
    }
    columnName.append(column.value()+", ");
    values.append("&#39;"+columnValue+"&#39;,");
   }
   
//   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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。