ハイエンドでエレガントな注釈がどのように実現されているか<6>--カスタム永続層フレームワーク-クラスHibernate
6740 ワード
概要
前回は
カスタム注釈シリーズの記事それらのハイエンドで優雅な注釈はどのように実現されたのか<0>--注釈の分類 ハイエンドで優雅な注釈がどのように実現されているか<1>--カスタム注釈構文 それらのハイエンドで優雅な注釈はどのように実現されたのか<2>--解析注釈 ハイエンドで優雅な注釈がどのように実現されているか<3>-継承性@Inherited ハイエンドでエレガントな注釈がどのように実現されるか<4>--Annotaion Processing Toolを使用して注釈 を解析するハイエンドでエレガントな注釈はどのように実現されているのか<5>--Annotaion Processing Toolを使用してカスタム注釈 ハイエンドで優雅な注釈がどのように実現されているか<6>--カスタム永続層フレームワーク-クラスHibernate 需要には、ユーザid、ユーザ名、ニックネーム、年齢、性別、メールボックス、携帯電話番号などのフィールド を含むユーザテーブル(user)がある. をクエリする.
エンティティクラスを定義し、userテーブルとマッピング関係を形成する
定義
注釈の定義定義 定義
注釈を解析し、対応する論理コードを生成
最後にsql文を生成する必要があります.
次にqueryメソッドを定義し、注釈を解析し、sql文をパッチで完了します.
queryメソッドを呼び出し、sql文を取得
まとめ
完全なコードはgithubにアップロードします.上のコードの断片だけでは読めません.cloneを見てみましょう.
前回は
apt
を用いて,工場クラスを自動的に生成する例を実現した.この我々は反射方式を用いて持続層フレームワークを実現し,もちろんコアコードにすぎず,Hibernate
に類似して直接使用できるビジネスプロジェクトではない.カスタム注釈シリーズの記事
bean
クラスに含まれる情報クエリに基づいてuserテーブルに条件を満たすuser エンティティクラスを定義し、userテーブルとマッピング関係を形成する
定義
bean
クラスCustomer
@Table("user")
public class Customer {
//id
@Column("id")
private int id;
//
@Column("user_name")
private String userName;
//
@Column("age")
private int age;
//
@Column("city")
private String city;
//
@Column("email")
private String email;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Table
注釈を定義して、user
テーブルとCustomer
クラスとの間にマッピング関係を形成する必要があります.@Column
は、user
テーブルとCustomer
クラスのフィールドとの間にマッピング関係を形成するように定義する必要がある.注釈の定義
@Table
注記@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {
String value();
}
@Column
注記@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Column {
String value();
}
注釈を解析し、対応する論理コードを生成
最後にsql文を生成する必要があります.
select * from user where 1=1 and user_name='zhangsan' and age=18 and email in('[email protected],[email protected],[email protected]')
次にqueryメソッドを定義し、注釈を解析し、sql文をパッチで完了します.
public static String query(Object bean) {
// sql , sql
StringBuilder sb = new StringBuilder();
// bean class, Customer
Class> beanClass = bean.getClass();
// class table
boolean present = beanClass.isAnnotationPresent(Table.class);
if (!present) {
return "";
}
// class table
Table table = beanClass.getAnnotation(Table.class);
//
String tableName = table.value();
sb.append("select * from")
.append(" ")
.append(tableName)
.append(" ")
//
.append("where 1=1");
//
Field[] fields = beanClass.getDeclaredFields();
//
for (Field field : fields) {
// Colomn
boolean fieldPresent = field.isAnnotationPresent(Column.class);
// ,
if (!fieldPresent) {
continue;
}
// Column
Column column = field.getAnnotation(Column.class);
// Column , (user_name)
String columnName = column.value();
// , useName
String fieldName = field.getName();
// get
String fieldGetName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
Object value = null;
try {
// get
Method method = beanClass.getMethod(fieldGetName);
// get ,
value = method.invoke(bean);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// , and
if (value == null ||((value instanceof Integer)&& (Integer)value==0)) {
continue;
}
// and
sb.append(" ")
.append("and").append(" ")
.append(columnName)
;
// int
if (value instanceof Integer) {
sb.append("=").append(value);
} else if (value instanceof String) {
// , in
if (((String) value).contains(",")) {
String[] values = ((String) value).split(",");
// in
sb.append(" ").append("in('");
// ,
for (String item : values) {
sb.append(item).append(",");
}
//
sb.deleteCharAt(sb.length() - 1);
sb.append("')");
}
// = ,
else {
sb.append("='").append(value).append("'");
}
}
}
return sb.toString();
}
queryメソッドを呼び出し、sql文を取得
public static void main(String[] args) {
// new Customer,
Customer customer1 = new Customer();
customer1.setUserName("zhangsan");
customer1.setAge(18);
customer1.setEmail("[email protected],[email protected],[email protected]");
// query , sql
String sql1 = Query.query(customer1);
// sql
System.out.println(sql1);
}
まとめ
完全なコードはgithubにアップロードします.上のコードの断片だけでは読めません.cloneを見てみましょう.