`

【转】java 利用注解、反射模拟ORM实现

阅读更多
  1. /** 
  2.  * org.crazystone.annotation 
  3.  * 
  4.  * Function: TODO  
  5.  * 
  6.  *   ver     date           author 
  7.  * ────────────────────────────────── 
  8.  *           2012-9-11      zhangzenglun 
  9.  * 
  10.  * Copyright (c) 2012, TNT All Rights Reserved. 
  11.  */  
  12.   
  13. package org.crazystone.annotation;  
  14.   
  15. import java.lang.annotation.ElementType;  
  16. import java.lang.annotation.Retention;  
  17. import java.lang.annotation.RetentionPolicy;  
  18. import java.lang.annotation.Target;  
  19.   
  20. /** 
  21.  *  
  22.  * @author zhangzenglun 
  23.  * @version 1.0 
  24.  * @since v1.0 
  25.  * @Date 2012-9-11 下午2:06:08 
  26.  */  
  27.   
  28. /** 
  29.  * @Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。 
  30.  * 只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。 
  31.  *  
  32.  * @Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等 
  33.  */  
  34.   
  35. @Retention(RetentionPolicy.RUNTIME)  
  36. @Target(ElementType.TYPE)  
  37. public @interface Table {  
  38.     String tableName();  
  39. }  



Java代码  收藏代码
  1. /** 
  2.  * TableField.java 
  3.  * org.crazystone.annotation 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2012-9-11      zhangzenglun 
  10.  * 
  11.  * Copyright (c) 2012, TNT All Rights Reserved. 
  12.  */  
  13.   
  14. package org.crazystone.annotation;  
  15.   
  16. import java.lang.annotation.ElementType;  
  17. import java.lang.annotation.Retention;  
  18. import java.lang.annotation.RetentionPolicy;  
  19. import java.lang.annotation.Target;  
  20.   
  21. /** 
  22.  * ClassName:TableField 
  23.  *  
  24.  * @author zhangzenglun 
  25.  * @version 1.0 
  26.  * @since v1.0 
  27.  * @Date 2012-9-11 下午2:14:41 
  28.  */  
  29.   
  30. @Retention(RetentionPolicy.RUNTIME)  
  31. @Target({ElementType.FIELD,ElementType.METHOD})  
  32. public @interface TableField {  
  33.     public String name();  
  34.   
  35.     public boolean isPrimaryKey() default false;  
  36. }  



Java代码  收藏代码
  1. /** 
  2.  * User.java 
  3.  * org.crazystone.annotation 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2012-9-11      zhangzenglun 
  10.  * 
  11.  * Copyright (c) 2012, TNT All Rights Reserved. 
  12.  */  
  13.   
  14. package org.crazystone.annotation;  
  15.   
  16. /** 
  17.  * ClassName:User 
  18.  *  
  19.  * @author zhangzenglun 
  20.  * @version 1.0 
  21.  * @since v1.0 
  22.  * @Date 2012-9-11 下午2:01:06 
  23.  */  
  24.   
  25. @Table(tableName = "user")  
  26. public class User {  
  27.     @TableField(name = "user_id", isPrimaryKey = true)  
  28.     private int userId;  
  29.     @TableField(name = "user_name")  
  30.     private String userName;  
  31.     @TableField(name = "user_age")  
  32.     private int age;  
  33.   
  34.     public int getUserId() {  
  35.         return userId;  
  36.     }  
  37.   
  38.     public void setUserId(int userId) {  
  39.         this.userId = userId;  
  40.     }  
  41.   
  42.     public String getUserName() {  
  43.         return userName;  
  44.     }  
  45.   
  46.     public void setUserName(String userName) {  
  47.         this.userName = userName;  
  48.     }  
  49.   
  50.     public int getAge() {  
  51.         return age;  
  52.     }  
  53.   
  54.     public void setAge(int age) {  
  55.         this.age = age;  
  56.     }  
  57.   
  58. }  



Java代码  收藏代码
  1. /** 
  2.  * BaseOrmSupport.java 
  3.  * org.crazystone.annotation 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2012-9-11      zhangzenglun 
  10.  * 
  11.  * Copyright (c) 2012, TNT All Rights Reserved. 
  12. */  
  13.   
  14. package org.crazystone.annotation;  
  15.   
  16. import java.lang.reflect.Field;  
  17. import java.lang.reflect.Method;  
  18.   
  19. /** 
  20.  * ClassName:BaseOrmSupport 
  21.  * 
  22.  * @author   zhangzenglun 
  23.  * @version  1.0 
  24.  * @since    v1.0 
  25.  * @Date     2012-9-11 下午3:27:00  
  26.  */  
  27. public abstract  class BaseOrmSupport<T> {  
  28.     public  void save(T o){  
  29.         Class<? extends Object> entityClass = o.getClass();  
  30.         StringBuffer sql = new StringBuffer();  
  31.           
  32.         sql.append("insert into ");  
  33.           
  34.         Table a = (Table)entityClass.getAnnotation(Table.class);  
  35.         if (a!=null) {  
  36.             sql.append(a.tableName());  
  37.         } else {  
  38.             sql.append(entityClass.getName().substring(entityClass.getName().lastIndexOf(".")+1));  
  39.         }  
  40.           
  41.         sql.append(" (");  
  42.           
  43.         Field[] fields = entityClass.getDeclaredFields();  
  44.         String temp = "";  
  45.         StringBuffer valueSql = new StringBuffer();  
  46.         for (Field f:fields) {  
  47.             TableField tf = f.getAnnotation(TableField.class);  
  48.           
  49.             //获得字段第一个字母大写   
  50.             String firstLetter = f.getName().substring(0,1).toUpperCase();   
  51.             //转换成字段的get方法  
  52.             String getMethodName = "get"+firstLetter+f.getName().substring(1);   
  53.             try {  
  54.                   
  55.                 Method getMethod = entityClass.getMethod(getMethodName, new Class[] {});  
  56.                 //这个对象字段get方法的值   
  57.                 Object value = getMethod.invoke(o, new Object[] {});   
  58.                   
  59.                 if (f.getType().getName().equals(java.lang.String.class.getName())) {  
  60.                     valueSql.append(temp+"'"+value+"'");  
  61.                 } else {  
  62.                     valueSql.append(temp+value);  
  63.                 }  
  64.                   
  65.             } catch (Exception e) {  
  66.             }  
  67.   
  68.             if (tf != null) {  
  69.                 sql.append(temp+tf.name());  
  70.             } else {  
  71.                 sql.append(temp+f.getName());  
  72.             }   
  73.             temp = ",";  
  74.         }  
  75.           
  76.         sql.append(")values(");  
  77.         sql.append(valueSql);  
  78.         sql.append(")");  
  79.           
  80.         System.out.println(sql.toString());  
  81.     }  
  82. }  



Java代码  收藏代码
  1. /** 
  2.  * User.java 
  3.  * org.crazystone.annotation 
  4.  * 
  5.  * Function: TODO  
  6.  * 
  7.  *   ver     date           author 
  8.  * ────────────────────────────────── 
  9.  *           2012-9-11      zhangzenglun 
  10.  * 
  11.  * Copyright (c) 2012, TNT All Rights Reserved. 
  12.  */  
  13.   
  14. package org.crazystone.annotation;  
  15.   
  16. /** 
  17.  * ClassName:User 
  18.  *  
  19.  * @author zhangzenglun 
  20.  * @version 1.0 
  21.  * @since v1.0 
  22.  * @Date 2012-9-11 下午2:01:06 
  23.  */  
  24.   
  25. public class UserDAO extends BaseOrmSupport<User>{  
  26.   
  27. }  



测试类 

Java代码  收藏代码
  1. package org.crazystone.annotation;  
  2.   
  3. import junit.framework.TestCase;  
  4.   
  5. public class AppTest   
  6.     extends TestCase  
  7. {  
  8.   
  9.     public void testApp()  
  10.     {  
  11.         User user = new User();  
  12.         user.setAge(100);  
  13.         user.setUserName("skylun");  
  14.         user.setUserId(1);  
  15.           
  16.         UserDAO userDao = new UserDAO();  
  17.         userDao.save(user);  
  18.     }  
  19.       
  20. }  



测试输出结果: 
insert into user (user_id,user_name,user_age)values(1,'skylun',100)

 

原文有附件。

转自:http://lunzi.iteye.com/blog/1675871

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics