Heim  >  Artikel  >  Java  >  Beispielerklärung zur Implementierung von BaseDao in Java

Beispielerklärung zur Implementierung von BaseDao in Java

巴扎黑
巴扎黑Original
2017-09-08 09:37:312792Durchsuche

Der folgende Editor zeigt Ihnen ein einfaches BaseDao-Beispiel mit benutzerdefinierten Anmerkungen und Reflexion in Java. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Editor und werfen wir einen Blick darauf.

In gängigen ORM-Frameworks bieten die meisten von ihnen Annotationsmethoden, um eine Zuordnung zwischen Entitäten und Datenbanken zu erreichen. Hier verwenden wir einfach benutzerdefinierte Annotationen und Reflektion, um ausführbare SQL-Anweisungen zu generieren.

Dies ist die allgemeine Verzeichnisstruktur, die ursprünglich für die Überprüfung von Anmerkungen erstellt wurde^.^

Okay, lassen Sie uns zunächst die Idee festlegen.

1. Passen Sie die @Table @Column-Annotation an,

Wir imitieren leicht den Ruhezustand und lassen @Table auf die Klasse einwirken, um die Entität anzugeben Die Zuordnungsbeziehung zwischen der Klasse und der Datentabelle. Lassen Sie den Attributwert in @Table dem Namen der Datentabelle tableName zuordnen. Lassen Sie @Column auf das Attribut einwirken (die Set-Methode ist hier nicht implementiert), um die Zuordnung anzuzeigen zwischen dem Attribut und der Feldbeziehung der Datentabelle und lassen Sie den Attributwert in @Column einem Spaltennamen eines Felds in der Datentabelle zuordnen.

2. Wir müssen eine Dao-Ebene nachahmen,

Dieses Mal definieren wir zuerst einen Entitätsbenutzer mit Namens- und Passwortattributen und dann Definieren Sie ein UserDao. Es gibt eine Save-Methode (User-Benutzer) in UserDao und User. Wir rufen die Save-Methode von UserDao auf, übergeben unser User-Objekt und geben dieses SQL zurück Als „In Benutzer (Name, Passwort) VALUES('cai','123456') einfügen“ festgelegt, wobei „Benutzer“ der Name unserer Datentabelle ist, „Name“ und „Passwort“ Datentabellenfelder sind und „cai“, „123456“ Benutzer sind Objekteigenschaften.

--------------------------------0,0 Code-Trennlinie-------- -------------------------------------

//Spalte . 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


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();
 }


}

//UserDao.java


package com.shu.dao;

import com.shu.entity.User;

public class UserDao implements IBaseDao<User> {

}

//UserService.java


package com.shu.service;
import com.shu.dao.UserDao;
import com.shu.entity.User;

public class UserService {
 
 public static void main(String[] args) {
  // TODO Auto-generated constructor stub

  UserDao userDao = new UserDao();
  User user = new User();
  user.setName("cai");
  user.setPassword("123456");
  try {
   System.out.println(userDao.save(user));
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
}

-------------------------------- 0.0 Code-Trennlinie------------------------------- --

Hier definieren wir endlich eine Service-Schicht, lassen sie die Dao-Schicht aufrufen und die entsprechende SQL-Anweisung generieren. Sie können andere Entitäten anpassen, z. B. Order in meinem Verzeichnis, und dann ein OrderDao definieren, um IBaseDao zu implementieren Schnittstelle, definieren Sie einen OrderService, um die Speichermethode von OrderDao aufzurufen, und generieren Sie außerdem die SQL-Anweisung, die der Bestelltabelle entspricht.

Hier ist eine Zusammenfassung der Mängel:

1. Anmerkungen zum Ruhezustand können ohne Zuweisung verwendet werden, daher ist es meiner Meinung nach erforderlich, sie zu erhalten Der Name der Tabelle kann direkt ohne Zuweisung ermittelt werden. Alternativ kann der Name des Felds mithilfe von Reflektion ermittelt werden.

2. Hier wird nur die Speichermethode verwendet und die SQL-Anweisung wird dynamisch generiert, ohne mit der Datenbank zu interagieren. Eine Factory kann gepackt werden, um eine Persistenzmethode zum Ausführen der SQL-Anweisung bereitzustellen.

3. Das Spleißen von SQL ist hier relativ grob. Sie können darüber nachdenken, ob es andere effizientere Methoden gibt.

Das obige ist der detaillierte Inhalt vonBeispielerklärung zur Implementierung von BaseDao in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn