使用有限多例模式管理数据库结构信息(三)
al = rs.getString("DECIMAL_DIGITS");//精度
f.setDecimal(decimal);
String defaultValue = rs.getString("COLUMN_DEF");
f.setDefaultValue(defaultValue);
String remark = rs.getString("REMARKS");
f.setRemark(remark);
String nullable = rs.getString("NULLABLE");//取值0||1,1允许空值,0不允许空值
if ("0".equals(nullable)) {
f.setNullable(false);
}
if ("1".equals(nullable)) {
f.setNullable(true);
}
field_map.put(name.toLowerCase(), f);
}
table.setFieldMap(field_map);//字段名:Field对象的映射表;
//获取字段名数组
Object[] o = fieldSet.toArray();
String[] fields = new String[o.length];
for (int i = 0; i < o.length; i++) {
fields[i] = ((String) o[i]).toLowerCase();
}
table.setFields(fields);
//主键部分,开始
ResultSet rsk = dm.getPrimaryKeys(catalog, null, tableName); //均通过新版SQL Server和MySQL的jdbc驱动的测试,返回所有主键 //ResultSet rsk = dm.getPrimaryKeys(catalog, "%", tableName);//早期版本的MySQL jdbc驱动程序中通过测试,返回所有主键 //
while (rsk.next()) {
String name = rsk.getString("COLUMN_NAME");//主键名
keySet.add(lowerCase(name.toLowerCase()));//
}
Object[] k = keySet.toArray();
String[] keys = new String[k.length];
for (int i = 0; i < k.length; i++) {
keys[i] = (String) k[i];
}
table.setKeys(keys);
//主键部分,结束
///给Field属性typeClassName赋值
String squeryFieldTypeClassName = "select * from " + tableName.toLowerCase() + " where " + table.getFields()[0] + " is null";
if (table.getKeys().length > 0) {
squeryFieldTypeClassName = "select * from " + tableName.toLowerCase() + " where " + table.getKeys()[0] + " is null";
}
Statement stmt0 = con.createStatement();
ResultSet rscname = stmt0.executeQuery(squeryFieldTypeClassName);
ResultSetMetaData rsmd = rscname.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
String fieldNmae = rsmd.getColumnName(i);
field_map.get(fieldNmae.toLowerCase()).setTypeClassName(rsmd.getColumnClassName(i));//通过mssql、mysql、derby
}
stmt0.close();
}
tableMap.put(tableName.toLowerCase(), table);//初始化Table
}
在基于HashMap关系数据映射技术的JadePool的实现中,Db族类通过有限多例模式动态提取和管理数据库结构信息,是JadePool的大管家。这是HRM产品与ORM产品最根本的区别所在。是JadePool之所以做到高效、简洁、智能化的重要前提。
顺便说一下DbAccess负责提取管理非事务型数据库的数据库结构信息。
使用DbCenter和DbAccess的重要区别在于数据库是否支持事务,在事务型的数据库中,可以通过ResultSet rsk = dm.getPrimaryKeys(catalog, null, tableName);语句提取主键信息,而非事务的数据库目前不支持这种操作。目前JadePool将非事务型数据库的表的第一个字段当做主键对待。
如何实例化DbCenter
ProcessVO是JadePool的核心类,主要用于实现数据库的CRUD或DML操作。目前,该类有三个构造函数
1、ProcessVO();它将实例化DbCenter中的defaultDb实例
2、ProcessVO(Connection con);它将实例化DbCenter中的userDb实例
3、ProcessVO(Connection con, int connectionType);它将根据connectionType的值,如:根据cn.jadepool.sql.DbConnectionType.USING_DB_01实例化db_01,根据cn.jadepool.sql.DbConnectionType.USING_DB_02实例化db_02。
例如:
ProcessVO pvo=new ProcessVO();
Db db=pvo.getDb();
......
此时,用户可以通过db来访问数据库的结构信息、表的结构信息以及字段的结构信息。