/**
* 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)
分享到:
相关推荐
先说一下遇到的问题:通过使用GSON泛型进行报文转换的时候想要对部分关键字段加密,发现在封装好的方法中,对个别字段的加密满足不了。 解决过程:首先通过反射获取到bean下的对象名称。 对象名称获取到了之后需要...
在Java中运用反射+泛型,实现数据库的动态增删改查等功能,可以是Mysql, 也可以是SQL Server,oracle 也行。本代码是支持SQL Server和oracle的。
Java基础入门(四)-泛型、反射、注解
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
综合运用Java反射、泛型和注解实现的类似Spring的核心注入
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
对java泛型以及反射机制进行原理和应用上的讲解,帮助初学者对这两个概念进行更轻松的掌握
集合框架及泛型的介绍和基础理解,方便大家了解集合框架及泛型。
Java试题-3:反射和泛型的综合应用 Java反射 泛型都是比较高级的应用技术
java 一个关于泛型的简单例子 java 一个关于泛型的简单例子 java 一个关于泛型的简单例子
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
java的基于泛型+反射的通用DAO例子,原创,没事写着玩的,请多指教哈。。。
Java 反射与泛型教程 资源为视频教程资源 希望对你的 Java 学习有所帮助。
试用java.util.Stack泛型栈作为父类,用另一个泛型栈对象作为成员变量,模拟实现一个泛型子类Queue,当存储元素的第1个栈的元素超过dump时,再有元素入队列就倒入第2栈。除提供无参构造函数Queue( )外,其它所有队列...
Java1_5泛型,提高你的开发效率
Java 实现泛型List的源码,基本实现了List接口的全部所有方法。欢迎大家发表自己的观点和建议。
当我们声明了一个泛型的接口或类,或需要一个子类继承至这个泛型类,而我们又希望利用反射获取这些泛型参数信息。这是本文将要介绍的ReflectionUtil是为了解决这类问题的辅助工具类,为java.lang.reflect标准库的...
NULL 博文链接:https://zouwu85.iteye.com/blog/801921
Java Generics and Collections 英文版,详细描述java 泛型技术