Afinalデータベースモジュール実装(一)_注記Annotationと反射はSQL文を生成します.


Afinalフレームのデータベースモジュールは注釈をサポートしています.便利なカスタム主語表名(@Tableを使用して)、メインキー(@idを使用して)が見られます.しかし、これは一体どうやって実現されますか?前に翻訳したことがあります.JavaのAnnotationを紹介する文章があります.Annotationを知らない友達は先に見てもいいです.http://blog.csdn.net/u011638883/article/details/13168799.
          はい、まず知りたいのはAnnotationがよく反射と関連しています.JavaのAPIドキュメントを調べて、langパッケージのクラスで方法が見られます.           
         同様に、反射パケットreflectにおけるMethodおよびFieldクラスには、get Annotation(Class<A>が定義されている. アンノテート・クラス)の方法.
         私たちは一体どのように注釈を使うべきですか?ここでは、Afinalのエンティティ類のデータテーブル名をカスタマイズした例を説明します.
         一つの注釈のタイプを定義します.MyTable Annotationといいます.
package com.wly.annotationtest;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *        ,           
 * @author wly
 *
 */
@Target(ElementType.TYPE) //                java  
@Retention(RetentionPolicy.RUNTIME) //     , Runtime  
public @interface MyTableAnnotation {

	//                      
	public String name();
}
         二、実体Beanオブジェクトを定義することをUserといいます.
package com.wly.annotationtest;

/**
 *    
 * @author wly
 *
 */
@MyTableAnnotation(name="abc") //       
public class User {

	private String name;
	private int age;
	
	public User() {
		
	}
	
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
          三、エンティティBenからデータベースステートメントを生成するツールクラスSql Stringを定義する.
package com.wly.annotationtest;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 *                
 * @author wly
 *
 */
public class SqlString {

	
	
	public String getInsertSql(Object obj) throws Exception{
		
		//String sql = "insert into table_name (field1,field2...) values(value1,value2...)";
		
		Class clazz = obj.getClass();
		
		StringBuilder _sb = new StringBuilder();
		_sb.append("INSERT INTO TABLE ");
		//    ,       Annotation   
		MyTableAnnotation annotation = (MyTableAnnotation)clazz.getAnnotation(MyTableAnnotation.class);
		if(annotation.name() == null || annotation.name().length() == 0) {
			System.out.println("    ,     !");
			return null;
		} else {
			_sb.append(annotation.name() + " ");
		}
		_sb.append("(");
		//     ,  getFields() getDeclaredFields()   ,      public    ,              
		Field[] fields = clazz.getDeclaredFields(); 
		for(Field f:fields) {
			_sb.append(f.getName() + ",");
			
		}
		//     ","
		_sb.deleteCharAt(_sb.length()-1);
		_sb.append(") values(");
		
		//             value 
		for(Field f:fields) {
			Method method = clazz.getMethod("get" + upperFirstCase(f.getName()), null);
			Object value = method.invoke(obj, null);

			if(f.getType() == String.class) {
				_sb.append("\"" + value.toString() + "\",");
			} else if(f.getType() == int.class) { //***     int.class,   Integer.class***
				_sb.append(value.toString() + ",");
			}
		}
		//     ","
		_sb.deleteCharAt(_sb.length()-1);
		_sb.append(");");
				
		return _sb.toString();
	}
	
	/**
	 *           ,   get  
	 * @param string
	 * @return
	 */
	private String upperFirstCase(String string) {
		StringBuffer sb = new StringBuffer(string);
		sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
		return sb.toString();

	}
}
 
           四、テストクラスのTestを作成します.ここでコードを簡潔にするために、データを追加するテストを作成しました.
package com.wly.annotationtest;

/**
 *    
 * @author wly
 * @date 2013-10-27
 */
public class Test {

	public static void main(String[] args) {
		//                ,             
		User user = new User("   ", 12);
		SqlString sqlStr = new SqlString();
		try {
			System.out.println(sqlStr.getInsertSql(user));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
          五、出力結果:
INSERT INTO TABLE abc (name,age) values("   ",12);
          O啦~~
          転帖は出典を保留してください.http://write.blog.csdn.net/postedit/13214485
          プロジェクトの住所:http://download.csdn.net/detail/u011638883/6462119
          ありがとうございます.