设为首页 加入收藏

TOP

反射+枚举+freemarker,自动生成实体类,自动建表建索引 之建表建索引,注解和DatabaseMetaData 获取信息 (九)
2014-11-24 11:54:45 】 浏览:2505
Tags:反射 枚举 freemarker 自动生成 实体 自动 索引 注解 DatabaseMetaData 获取 信息
引类
* @author Lufeng
*
*/
public class GenDB {
private String sourceDir; // 配置源文件夹

public GenDB(String source) {
this.sourceDir = source;
}

/**
* 获取不同类型默认长度
* @param clazz
* @param obj
* @param type
* @return
* @throws Exception
*/
public int getDefaultLength(String type) throws Exception {
int length = 0;
if(type == null) {
throw new RuntimeException("不能识别的类型:" + type);
}

// 根据不同类型返回不同默认长度
if("int".equals(type)) {
length = TYPE_DEFUALT_INT;;
} else if("long".equals(type)) {
length = TYPE_DEFUALT_LONG;
} else if("String".equals(type)) {
length = TYPE_DEFUALT_STRING;
}

return length;
}

public String getSqlType(String type) {
String result = "";
if("int".equals(type)) {
result = "integer";
} else if("long".equals(type)) {
result = "bigint";
} else if("String".equals(type)) {
result = "varchar";
}

return result;
}

/**
* 获取配置类中的所有字段名
* @param clazz
* @return
*/
public List getColumns(Class< > clazz) {
List result = new ArrayList();

// 获得所有枚举字段成员(id, account, name, profession...),并遍历获取字段名
Object[] enums = clazz.getEnumConstants();
result.add("id"); // id是默认添加的
for (Object e : enums) {
result.add(e.toString());
}

return result;
}

/**
* 获取所有约束信息
* @param clazz
* @param obj
* @return
* @throws Exception
*/
public Map getFieldInfo(Class< > clazz, Object obj) throws Exception {
Map result = new HashMap();

// 获取所有约束信息
String name = obj.toString();
String typeName = ((Class< >) GenUtils.getFieldValue(clazz, obj, TYPE)).getSimpleName();
String type = getSqlType(typeName);

int length = (Integer) GenUtils.getFieldValue(clazz, obj, LENGTH);
boolean index = (Boolean) GenUtils.getFieldValue(clazz, obj, INDEX);
String nullable = (Boolean) GenUtils.getFieldValue(clazz, obj, NULLABLE) == true "NULL" : "NOT NULL";

//默认值
Object def = GenUtils.getFieldValue(clazz, obj, DEFAULTS);
String defaults = def == null "" : " DEFAULT '" + def.toString() + "'";

// 如果长度为0,即没设长度,则提取默认值
if(length == 0) {
length = getDefaultLength(typeName);
}

result.put("name", name);
result.put(TYPE, type);
result.put(LENGTH, length);
result.put(INDEX, index);
result.put(NULLABLE, nullable);
result.put(DEFAULTS, defaults);

return result;
}

/**
* 获取表中所有字段信息
* @param clazz
* @return
* @throws Exception
*/
public List> getTableInfo(Class< > clazz) throws Exception {
List> tableInfo = new ArrayList>();

// 获得所有枚举字段成员(id, account, name, profession...),并遍历获取信息
Object[] enums = clazz.getEnumConstants();
for (Object e : enums) {
// 获取字段约束信息
Map field = getFieldInfo(clazz, e);
tableInfo.add(field);
}

return tableInfo;
}

/**
* 获取某个字段的约束信息
* @param clazz
* @param name
* @return
* @throws Exception
*/
public Map getOneFieldInfo(Class< > clazz, String name) throws Exception {
Map fieldInfo = new HashMap();
//返回所有枚举类型
Enum< >[] enums = (Enum[]) clazz.getEnumConstants();

for (Enum< > e : enums) {
// 如果不是想要的字段信息, 则跳过
if(!e.toString().equals(name)) {
continue;
}
// 获取字段约束信息
fieldInfo = getFieldInfo(clazz, e);
}

return fieldInfo;
}

/**
* 获取配置表中需要创建索引的字段
* @param clazz
* @return
* @throws Exception
*/
public List getIndexField(Class< > clazz) throws Exception {
List result = new ArrayList();
result.add("id"); // 默认id是索引

// 找出class中所有需要创建索引的字段
Object[] fields = clazz.getEnumCons

首页 上一页 6 7 8 9 10 11 下一页 尾页 9/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇java 中调用C的函数 下一篇Java基础01 从HelloWorld到面向对..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目