最近在使用元数据开发页面,在开发的过程中遇到了一个问题,需要将数据库中的表字段以及相应的类型等信息转化为固定格式,并存入xml文件中。
刚开始的我,一本正经的在复制着每行的格式,然后对照着数据字典来一个一个添加。随着做的时间越来越长,最终当我遇到了一个表中有100多个字段的时候我崩溃了,撸完这么多内容我岂不是大半天都浪费了,而且也没什么成就感。不愿循规守矩的我决定自己写一个简单的工具类!
我先讲下我的大体思路,以便下面方便各位老师理解。首先将连接到相应数据库,然后读取相应表信息,读取之后将相应的信息整合,然后再按照自己所需要的格式输出到xml文件中。So easy!
闲话不多说,直接上代码。
首先是连接数据库
public DomainMetaBuildTest(String tableName) {
this.tableName = tableName;
try {
//驱动注册
Class.forName(DRIVERCLASSNAME);
if (connection == null || connection.isClosed()) {
//获得链接
connection = DriverManager.getConnection(URL, USER, PASSWORD);
}
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
System.out.println("Oh,not");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("Oh,not");
}
}
接下来是获取数据库表中的相应数据
/**
* 功能描述:获取数据库相应信息
*/
private List<String> doAction() {
String sql = "select * from " + tableName;
List<String> list = new ArrayList<String>();
try {
PreparedStatement statement = connection.prepareStatement(sql);
//获取数据库的元数据
ResultSetMetaData metadata = statement.getMetaData();
ResultSet rs = connection.getMetaData().getPrimaryKeys(null, null, tableName);
String id = "";
//获取组键字段
if (rs.next()) {
id = rs.getString(4);
}
//数据库的字段个数
int len = metadata.getColumnCount();
//字段名称
colNames = new String[len + 1];
//字段类型 --->已经转化为java中的类名称了
colTypes = new String[len + 1];
//字段长度
colLengths = new Integer[len + 1];
for (int i = 1; i <= len; i++) {
//获取字段名称
colNames[i] = metadata.getColumnName(i);
list.add(colNames[i]);
//获取字段类型
Integer displaySize = metadata.getColumnDisplaySize(i);
colTypes[i] = convertType(metadata.getColumnTypeName(i), displaySize);
colLengths[i] = displaySize;
}
list.add(id);
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
最后是将处理后的数据存入xml文件中,此处可以根据自己的相应的格式处理,此段可改成自动生成Java实体类。
private void createXml() {
try {
// 创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document document = db.newDocument();
// 不显示standalone="no"
document.setXmlStandalone(true);
Element root = document.createElement("attributes");
// 此处 for 循环可替换成 遍历 数据库表的结果集操作;
for (int i = 0; i < colNames.length; i++) {
// 创建节点 attribute
Element elements = document.createElement("attribute");
if (colNames[i] != null) {
// 给 attribute 节点添加属性
elements.setAttribute("columnName", colNames[i]);
elements.setAttribute("name", colNames[i]);
elements.setAttribute("title", "");
elements.setAttribute("type", colTypes[i]);
elements.setAttribute("iLength", String.valueOf(colLengths[i]));
root.appendChild(elements);
}
}
document.appendChild(root);
// 创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
// 创建 Transformer对象
Transformer tf = tff.newTransformer();
//设置首行缩进
tf.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "4");
// 输出内容是否使用换行
tf.setOutputProperty(OutputKeys.INDENT, "yes");
// 创建xml文件并写入内容
File file = new File("D:/MetaFiles/" + GetTuoFeng(tableName) + ".xml");
tf.transform(new DOMSource(document), new StreamResult(file));
System.out.println("生成" + GetTuoFeng(tableName) + ".xml成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("生成" + GetTuoFeng(tableName) + ".xml失败");
}
}
最后是在main方法中进行调用啦
public static void main(String[] args) {
DomainMetaBuildTest bean = new DomainMetaBuildTest("tableName");
bean.getClassStr();
}
有些地方仍需要优化,只是简单的写了个工具类,后面会慢慢优化下。请各位老师多多指教,一个努力的小白~