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といいます.
四、テストクラスのTestを作成します.ここでコードを簡潔にするために、データを追加するテストを作成しました.
転帖は出典を保留してください.http://write.blog.csdn.net/postedit/13214485
プロジェクトの住所:http://download.csdn.net/detail/u011638883/6462119
ありがとうございます.
はい、まず知りたいのは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
ありがとうございます.