//映射的过程:

package com.ly.orm;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap; public class ClassMapper {
private String[] cols; public String[] getCols() {
return cols;
} private String schema; private ClassMapper() {
} public String getSchema() {
return schema;
} public static ClassMapper get(Class<?> source, HashMap<String, Class<?>[]> map) {
Field[] fs = source.getDeclaredFields();
ArrayList<String> temp = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for (Field f : fs) {// fuck these endless for and ifelse
if (f.getAnnotation(I.class) != null) {
continue;
}
Class<?> cls = f.getType();
for (String key : map.keySet()) {
boolean found = false;
Class<?>[] classes = map.get(key);
for (Class<?> c : classes) {
if (!c.equals(cls)) {
continue;
}
found = true;
String col, str;
C a = f.getAnnotation(C.class);
if (a == null || a.getName().length() == 0) {
col = f.getName();
} else {
col = a.getName();
}
str = col + ' ' + key;
if (a != null && a.getDesc().length() > 0) {
str += ' ' + a.getDesc();
}
temp.add(col);
sb.append(str + ',');
break;
}
if (found) {
break;
}
}
}
if (sb.length() == 0) {
return null;
}
sb.setLength(sb.length() - 1);
T a = source.getAnnotation(T.class);
String t = a == null ? source.getSimpleName() : a.getName();
ClassMapper result = new ClassMapper();
result.schema = String.format("create table %s(%s);", t, sb);
result.cols = new String[temp.size()];
temp.toArray(result.cols);
return result;
}
}

//还有三个Annotation:

package com.ly.orm;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /*
* 用来标注表。
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface T {
String getName();
}
package com.ly.orm;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 可以用来标注字段。
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface C {
final static String PRIMARY_KEY = "primary key";
final static String AUTOINCREMENT = "autoincrement";
final static String NOT_NULL = "not null";
final static String DEFAULT_NOW = "default datetime('now','localtime')"; String getName() default ""; String getDesc() default "";
}
package com.ly.orm;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* 标注不应被忽略的字段。
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface I {
}

//最后测试一下:

import com.ly.orm.C;
import com.ly.orm.ClassMapper;
import com.ly.orm.I;
import com.ly.orm.SQLiteMapper;
import com.ly.orm.T; @T(getName = "ggggod")
public class God {
@C(getDesc = C.PRIMARY_KEY + ' ' + C.AUTOINCREMENT)
int a;
String aa;
@C(getName = "qwe123")
public int aaa;
@I
public String aaaa; public static void main(String[] args) {
ClassMapper m = com.ly.orm.ClassMapper.get(God.class, SQLiteMapper.get());
System.out.println(m.getSchema());
}
}

//输出结果:
create table ggggod(a integer primary key autoincrement,aa text,qwe123 integer);

java实现的类和表持久化的更多相关文章

  1. Java I/O---Properties类(持久化键值对)

    1.Properties类简介 Properties类(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ...

  2. 高速创建和mysql表相应的java domain实体类

    今天创建了一个表有十几个字段,创建完之后必定要写一个与之相应的java domain实体类. 这不是反复的工作吗?为什么不先把这个表的全部的字段查出来,然后放到linux环境下,用sed工具在每一行的 ...

  3. 《深入理解Java虚拟机》类文件结构

    上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...

  4. Java常用工具类题库

    一.    填空题 在Java中每个Java基本类型在java.lang包中都在一个相应的包装类,把基本类型数据转换为对象,其中包装类Integer是___Number__的直接子类. 包装类Inte ...

  5. Java中Properties类的操作

    知识学而不用,就等于没用,到真正用到的时候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写,外加 ...

  6. Java中Properties类的操作配置文件

    知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...

  7. Java:日历类、日期类、数学类、运行时类、随机类、系统类

    一:Calendar类 java.util 抽象类Calendar   1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int ...

  8. Java中Properties类的学习总结

    学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 一.认识prope ...

  9. Java中Properties类

    1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...

随机推荐

  1. java实现ftp文件的上传与下载

    最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ...

  2. c# 动态调用.net编写的webservices接口

    创建类WebServiceHelper: public class WebServiceHelper { #region 动态调用WebService动态调用地址 /// < summary&g ...

  3. <input type='file'/>把默认样式改成框框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. java 入门学习

    想要学习java,首先你要明白java是干嘛的,它有什么吸引之处,懂程序的都应该知道,java是很多计算机语言的根本,无论在什么时代,科技如何更新,java都不会落后,现在的我在学习初级java,下面 ...

  5. python 学习随笔

    要求: 用户输入一个数,比如输入387. 需要把387打乱,然后将这三个数组合成最大数输出. 如果最大值和用户输入的等大,输出-1. 方法一: #!/user/bin/env python # _*_ ...

  6. 2016年12月28日 星期三 --出埃及记 Exodus 21:23

    2016年12月28日 星期三 --出埃及记 Exodus 21:23 But if there is serious injury, you are to take life for life,若有 ...

  7. ZJOI2007矩阵游戏

    题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: 行交 ...

  8. 解决小米、红米及其他 Android 手机无法在 Mac 下进行真机调试的问题(转)

    转自:http://ju.outofmemory.cn/entry/103522 Begin iOS 2014-08-19 271 阅读 手机 Android 小米 mac 调试 在 Mac OSX ...

  9. 一文说尽C++赋值运算符重载函数(operator=)

    写在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是,内容大多雷同且不全面.面对这一局面,在下在整合各种资源及融入个人理解的基础上,整理出一篇较 ...

  10. 1.NSNotification|远程通知|本地通知|激光推送

    1.   通知在iOS中应用非常广泛,合理的应用通知可以减少冗余代码,使我们的代码层次结构变了更加的清晰明了,利于程序猿读写.它主要分为不可见通知可见通知两种: 1.1 不可见通知,主要是有系统发出的 ...