java实现的类和表持久化
//映射的过程:
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实现的类和表持久化的更多相关文章
- Java I/O---Properties类(持久化键值对)
1.Properties类简介 Properties类(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ...
- 高速创建和mysql表相应的java domain实体类
今天创建了一个表有十几个字段,创建完之后必定要写一个与之相应的java domain实体类. 这不是反复的工作吗?为什么不先把这个表的全部的字段查出来,然后放到linux环境下,用sed工具在每一行的 ...
- 《深入理解Java虚拟机》类文件结构
上节学习回顾 在上一节当中,主要以自己的工作环境简单地介绍了一下自身的一些调优或者说是故障处理经验.所谓百变不离其宗,这个宗就是我们解决问题的思路了. 本节学习重点 在前面几章,我们宏观地了解了虚拟机 ...
- Java常用工具类题库
一. 填空题 在Java中每个Java基本类型在java.lang包中都在一个相应的包装类,把基本类型数据转换为对象,其中包装类Integer是___Number__的直接子类. 包装类Inte ...
- Java中Properties类的操作
知识学而不用,就等于没用,到真正用到的时候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用Java来写,外加 ...
- Java中Properties类的操作配置文件
知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...
- Java:日历类、日期类、数学类、运行时类、随机类、系统类
一:Calendar类 java.util 抽象类Calendar 1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int ...
- Java中Properties类的学习总结
学习目标: 1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 一.认识prope ...
- Java中Properties类
1 简介: JDK提供的java.util.Properties类继承自Hashtable类并且实现了Map接口,用map来存储key-value数据,所以存入的数据是无序的.其中键和值都是字符串类型 ...
随机推荐
- Java数据结构之字符串模式匹配算法---KMP算法2
直接接上篇上代码: //KMP算法 public class KMP { // 获取next数组的方法,根据给定的字符串求 public static int[] getNext(String sub ...
- [已解决] git 重命名文件夹
git mv oldfolder newfolder 原文地址:http://www.cnblogs.com/gifisan/p/5980608.html
- Comparable和Comparator的区别
Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...
- jquery+javaScript完成瀑布流图片页面效果
效果如图: html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- java.sql.SQLException: ORA-00001: 违反唯一约束条件 (SCOTT.SYS_C0011456)
我tb_user数据库的主键是id,在这个java程序中: String sql="insert into tb_user(id,USER_NAME,USER_PASSWORD) value ...
- Angular--页面间切换及传值的四种方法
1. 基于ui-router的页面跳转传参(1) 在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers.html)放置了多个produce ...
- oracle 删除用户时的坑
ORACLE在使用 SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME='dt_zntg_trade' 删除会话时,一定要注意dt_zntg_trade的 ...
- wcscpy_s与wcsncpy
今天运行以下代码时一直出错 void Foo(const wchar_t* lpch, int len) { ... wchar_t *str = ]; wcscpy_s(str, len, lpch ...
- ubuntu一些常用的命令
1.docker里的ubuntu不知道密码,更新密码 sudo passwd 2.解压zip文件 unzip xx.zip 3.安装LAMP (1)sudo apt-get install apach ...
- CentOS搭建NodeJS环境
事件驱动,承受高并发……这些耀眼的光环,使前端开发者不能不去学习NodeJS. 今天就在开发环境把NodeJS搭建起来了. 1. 下载node wget http://nodejs.org/dist/ ...