`

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

    博客分类:
  • j2ee
阅读更多
/**
 * org.crazystone.annotation
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2012-9-11 		zhangzenglun
 *
 * Copyright (c) 2012, TNT All Rights Reserved.
 */

package org.crazystone.annotation;

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

/**
 * 
 * @author zhangzenglun
 * @version 1.0
 * @since v1.0
 * @Date 2012-9-11 下午2:06:08
 */

/**
 * @Retention用来声明注解的保留策略,有CLASS、RUNTIME和SOURCE这三种,分别表示注解保存在类文件、JVM运行时刻和源代码中。
 * 只有当声明为RUNTIME的时候,才能够在运行时刻通过反射API来获取到注解的信息。
 * 
 * @Target用来声明注解可以被添加在哪些类型的元素上,如类型、方法和域等
 */

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
	String tableName();
}


/**
 * TableField.java
 * org.crazystone.annotation
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2012-9-11 		zhangzenglun
 *
 * Copyright (c) 2012, TNT All Rights Reserved.
 */

package org.crazystone.annotation;

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

/**
 * ClassName:TableField
 * 
 * @author zhangzenglun
 * @version 1.0
 * @since v1.0
 * @Date 2012-9-11 下午2:14:41
 */

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD})
public @interface TableField {
	public String name();

	public boolean isPrimaryKey() default false;
}


/**
 * User.java
 * org.crazystone.annotation
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2012-9-11 		zhangzenglun
 *
 * Copyright (c) 2012, TNT All Rights Reserved.
 */

package org.crazystone.annotation;

/**
 * ClassName:User
 * 
 * @author zhangzenglun
 * @version 1.0
 * @since v1.0
 * @Date 2012-9-11 下午2:01:06
 */

@Table(tableName = "user")
public class User {
	@TableField(name = "user_id", isPrimaryKey = true)
	private int userId;
	@TableField(name = "user_name")
	private String userName;
	@TableField(name = "user_age")
	private int age;

	public int getUserId() {
		return userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	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;
	}

}


/**
 * BaseOrmSupport.java
 * org.crazystone.annotation
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2012-9-11 		zhangzenglun
 *
 * Copyright (c) 2012, TNT All Rights Reserved.
*/

package org.crazystone.annotation;

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

/**
 * ClassName:BaseOrmSupport
 *
 * @author   zhangzenglun
 * @version  1.0
 * @since    v1.0
 * @Date	 2012-9-11 下午3:27:00 
 */
public abstract  class BaseOrmSupport<T> {
	public  void save(T o){
		Class<? extends Object> entityClass = o.getClass();
    	StringBuffer sql = new StringBuffer();
    	
    	sql.append("insert into ");
    	
    	Table a = (Table)entityClass.getAnnotation(Table.class);
    	if (a!=null) {
    		sql.append(a.tableName());
    	} else {
    		sql.append(entityClass.getName().substring(entityClass.getName().lastIndexOf(".")+1));
    	}
    	
    	sql.append(" (");
    	
    	Field[] fields = entityClass.getDeclaredFields();
    	String temp = "";
    	StringBuffer valueSql = new StringBuffer();
    	for (Field f:fields) {
    		TableField tf = f.getAnnotation(TableField.class);
    	
    		//获得字段第一个字母大写 
    		String firstLetter = f.getName().substring(0,1).toUpperCase(); 
    		//转换成字段的get方法
    	    String getMethodName = "get"+firstLetter+f.getName().substring(1); 
			try {
				
				Method getMethod = entityClass.getMethod(getMethodName, new Class[] {});
				//这个对象字段get方法的值 
				Object value = getMethod.invoke(o, new Object[] {}); 
				
				if (f.getType().getName().equals(java.lang.String.class.getName())) {
					valueSql.append(temp+"'"+value+"'");
				} else {
					valueSql.append(temp+value);
				}
				
			} catch (Exception e) {
			}

    		if (tf != null) {
    			sql.append(temp+tf.name());
    		} else {
    			sql.append(temp+f.getName());
    		} 
    		temp = ",";
    	}
    	
    	sql.append(")values(");
    	sql.append(valueSql);
    	sql.append(")");
    	
    	System.out.println(sql.toString());
	}
}



/**
 * User.java
 * org.crazystone.annotation
 *
 * Function: TODO 
 *
 *   ver     date      		author
 * ──────────────────────────────────
 *   		 2012-9-11 		zhangzenglun
 *
 * Copyright (c) 2012, TNT All Rights Reserved.
 */

package org.crazystone.annotation;

/**
 * ClassName:User
 * 
 * @author zhangzenglun
 * @version 1.0
 * @since v1.0
 * @Date 2012-9-11 下午2:01:06
 */

public class UserDAO extends BaseOrmSupport<User>{

}


测试类
package org.crazystone.annotation;

import junit.framework.TestCase;

public class AppTest 
    extends TestCase
{

    public void testApp()
    {
    	User user = new User();
    	user.setAge(100);
    	user.setUserName("skylun");
    	user.setUserId(1);
    	
    	UserDAO userDao = new UserDAO();
    	userDao.save(user);
    }
    
}


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

相关推荐

    java 面试经验.docx

    - **技术细节**: 对于项目中使用的关键技术点,能够深入讲解其实现原理及遇到的问题和解决方案。 #### 六、沟通能力与团队合作 - **表达能力**: 清晰、有条理地表达自己的想法,能够用简单的语言解释复杂的技术...

    asm2.2.2 asm-commons-2.2.2 asm-util-2.2.1 cglib-nodep-2.1_3

    这些工具能够帮助开发者处理更复杂的字节码操作,特别是在处理Java 5引入的泛型和注解时。 4. **CGlib Nodep(cglib-nodep-2.1_3.jar)**:CGlib是一个基于ASM的代码生成库,主要用于扩展Java类和实现AOP(面向切面...

    java用到的单词大全

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

    java学习路线.pdf

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

    Java开发手册(嵩山版)灵魂15问.rar

    - **List, Set, Queue**:各自的特点及常用实现类,如ArrayList, LinkedList, HashSet, TreeSet, ArrayDeque等。 - **Map接口**:HashMap, TreeMap, LinkedHashMap的区别与使用。 - **泛型**:类型安全的容器,...

    spring3.0架包

    7. `org.springframework.core-3.0.0.RELEASE`:Spring 3.0的核心工具包,包含各种通用的工具类和API,用于处理反射、泛型、集合操作等。 8. `org.springframework.expression-3.0.0.RELEASE`:Spring表达式语言...

    yuyukong3:康卡斯特面试题

    5. **反射与注解** - 反射:了解如何在运行时动态获取类的信息,创建和调用对象,以及修改私有属性和方法。 - 注解:理解注解的声明、使用和处理,以及自定义注解的元注解。 6. **设计模式** - 常见设计模式:...

    Java-Development-Learning:2020年

    1. **Java核心技术**:Java SE(标准版)是基础,包括面向对象编程概念、类与对象、封装、继承、多态、接口、异常处理、集合框架(List、Set、Map)、IO流、线程、反射、注解等。 2. **Java 8及以后版本的新特性**...

    Java学习笔记-个人整理的

    {13.3}连接Oracle数据库及操作}{192}{section.13.3} {13.4}批处理模式}{195}{section.13.4} {13.5}分页查询}{196}{section.13.5} {13.5.1}MySQL}{198}{subsection.13.5.1} {13.6}连接池}{199}{section.13.6} {...

Global site tag (gtag.js) - Google Analytics