ホームページ Java &#&チュートリアル JavaでBaseDaoを実装する例の説明

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

Sep 08, 2017 am 09:37 AM
java

以下のエディターは、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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

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

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

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

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

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

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

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

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

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

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

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

See all articles