`

【转】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

分享到:
评论

相关推荐

    利用java反射、注解及泛型模拟ORM实现

    这篇博文“利用java反射、注解及泛型模拟ORM实现”旨在探讨如何结合这三种技术来实现对象关系映射(ORM),这是一种将数据库表与Java对象之间进行绑定的技术,简化了数据操作。 首先,我们来理解一下这三个概念: ...

    反射+注解自定义ORM

    总之,通过Java反射和注解自定义ORM框架,可以实现更加灵活、定制化的数据库操作。这种方式不仅提高了开发效率,还降低了代码的耦合度,使得项目维护更加容易。在实际应用中,可以根据项目的具体需求进行适当的调整...

    自定义Orm框架的实现

    本项目旨在实现一个基于JDK5.0注解的小型ORM框架,模拟Hibernate的部分功能。 首先,我们要理解ORM的基本原理。ORM的核心思想是将数据库中的表映射为Java对象,将表中的记录映射为对象的实例,这样就可以通过操作...

    hibernate注解功能模拟

    通过这样的模拟,你不仅可以深入理解Hibernate的工作原理,还能提高对Java注解和反射机制的理解。 总之,"hibernate注解功能模拟"是一个综合性的学习项目,它涵盖了Java的高级特性以及ORM框架的核心思想。通过实践...

    java模拟hibernate实现

    2. **Java注解**: 注解是一种元数据,可以为编译器或运行时环境提供有关代码的附加信息。在本项目中,注解可能被用来标记实体类及其属性,模拟Hibernate的@Entity和@Column等注解,以便自动识别哪些类和字段对应...

    模拟hibernate注解功能

    这不仅锻炼了开发者对Java注解和反射的理解,也提供了在没有Hibernate的情况下实现ORM(对象关系映射)的实践经验。对于希望深入理解Java底层机制以及ORM框架原理的开发者来说,这是一个非常有价值的实践项目。

    JAVA反射教程有代码

    - **测试工具**:JUnit等测试框架利用反射来调用私有方法或模拟对象。 6. **案例研究** - "reflection_proxy.ppt"可能是一个包含详细讲解和示例代码的PPT文件,可能涵盖如何创建和使用动态代理,以及如何通过反射...

    java_源码,java_源码

    以上只是Java源码中涉及的部分关键知识点,实际Java编程涉及的内容远不止这些,还包括注解、反射、序列化、垃圾回收、内存管理、性能优化等多个方面。深入理解并熟练掌握这些知识点,是成为一名优秀Java开发者的必备...

    JAVA中里10种常见库.zip

    Apache Commons Lang是一个实用工具库,提供了对Java语言的扩展,包括字符串处理、日期和时间操作、数组工具、反射辅助类等。它简化了许多常见的编程任务,使得开发更加高效。 2. **Guava**: Google的Guava库...

    Java_面试题总结(2011版)

    - **反射与注解**:了解Java反射机制和注解的使用,能够在运行时分析类信息和动态调用方法。 ### 数据库管理 在Java软件开发中,数据库管理是一项重要的技能,特别是对于企业级应用的开发。求职者应当熟悉以下内容...

    支持多数据库的ORM框架ef-orm.zip

    EF-ORM是一个轻量,便捷的Java ORM框架。并且具备若干企业级的应用特性,如分库分表、JTA事务等。 代码生成插件for eclipse(请在eclipse中Help/Install new software后输入地址并安装)...

    JAVA SMART系统-系统框架设计与开发.zip

    Spring MVC是Java领域中最流行的实现,它提供了丰富的功能,如依赖注入、AOP(面向切面编程)、数据验证等。 3. **Spring框架**:Spring是Java企业级应用的核心框架,它提供了一个全面的基础设施,支持开发和部署...

    java学习路线图

    - **扩展注解的支持:** Java 9增强了对注解的支持,包括元注解等新特性。 **1.3 实战数据结构** - **数据结构实战训练:** 数据结构是计算机科学的基础之一,这里会通过实际案例讲解数组、链表等常见数据结构的...

    java 面试经验.docx

    - **模拟面试**: 与朋友或同事进行模拟面试,提高应对面试压力的能力。 - **准备问题**: 准备一些关于职位和公司的提问,以便在面试结束时提出。 #### 八、心态调整 - **保持自信**: 相信自己的能力和经验,积极...

    常用Java开发jar包一

    JDK(Java Development Kit)安装后,会附带一些基础的jar包,如rt.jar(包含Java核心API的实现)、charsets.jar(字符集支持)、jfxrt.jar(JavaFX相关)等。这些jar包构成了Java运行环境的基础,开发者无需单独...

    java学习路线.pdf

    ### Java学习路线详解 #### 一、基础学习阶段 **1. Java 语言的基本语法、数据类型、运算符等基础知识** - **基本语法**: Java 的语法结构与 C 和 C++ 类似,但更加简洁易懂。 - **数据类型**: 包括基本数据类型...

    java用到的单词大全

    Java是一种广泛使用的面向对象的编程语言,以其平台独立性、高效性和丰富的类库而闻名。在Java开发过程中,掌握一些核心的Java单词是至关重要的,这不仅有助于理解代码,还能提高编程效率。以下是对"java用到的单词...

    Java面试试题(二).docx

    - **AOP实现**:例如Spring AOP利用动态代理实现切面编程,增强目标类的功能。 - **性能测试**:模拟对象行为进行性能测试或调试。 - **序列化与反序列化** - **实现方式**: - **Serializable接口**:实现了此...

    TextInput-0.0.66.zip

    Ellie,作为一个开源项目,其核心理念在于提供一种编译时的ORM实现,这意味着在编译阶段就能完成数据库模型到Java对象的映射,从而避免了运行时反射带来的性能损失。这使得应用程序在运行时更加轻量级,提高了执行...

    java学习路线

    - **反射与注解**:反射是Java动态特性的体现,注解则是元数据的一种形式,二者都是Java高级编程的重要组成部分。 #### 二、数据库&JDBC编程 **1. SQL基础(重点)** - **SQL基础**:包括SQL语句的基本结构、数据...

Global site tag (gtag.js) - Google Analytics