1. 背景
在公司做项目,特别是业务系统的时候,大量的表单和增删改查,而且后台Ui经常用一些easyui等jquery ui框架,数据库一张表对应一个domian.表字段对应domain的属性,也对应这前台js json等数据。这样后台代码和json都是有规律可循。大量的复制粘贴 很枯燥麻烦,因此决定做一个代码自动生成工具。
1. 界面
2.用到的技术与核心代码
2.1 jdbc DatabaseMetaData(连接数据库 读取表结构)
public Connection getConnection() {
/** 声明Connection连接对象 */
Connection conn = null;
try {
/** 使用Class.forName()方法自动创建这个驱动程序的实例且自动调用DriverManager来注册它 */
Class.forName(DB_DRIVER);
/** 通过DriverManager的getConnection()方法获取数据库连接 */
Properties props = new Properties();
props.put("user", DB_USERNAME);
props.put("password", DB_PASSWORD);
props.put("remarksReporting", "true");//设置能读取到 column comment
conn = DriverManager.getConnection(DB_URL, props);
} catch (Exception ex) {
pane.setText("error:" + ex.toString()
+ "查看控制台");
ex.printStackTrace();
}
return conn;
}
public HashMap
HashMap
List
dbCon = new DBConnection(this.dbUrl, this.dbDriver, this.dbUser,
this.dbPwd, this.pane);
Connection con = dbCon.getConnection();
ResultSet rs;
try {
DatabaseMetaData dbmd = con.getMetaData();
rs = dbmd.getColumns(null, "%", table, "%");
while (rs.next()) {
HashMap
map.put("COLUMN_NAME", rs.getString("COLUMN_NAME")
.toLowerCase());
map.put("REMARKS", rs.getString("REMARKS"));
map.put("TYPE_NAME", rs.getString("TYPE_NAME"));
list.add(map);
}
rs = dbmd.getTables(null, "%", table, new String[] { "TABLE" });
if (rs.next()) {
root.put("tableComment", rs.getString("REMARKS"));// table
// comment
}
root.put("list", list);
root.put("title", tableName);// tableName
root.put("domainName", domainName);
return root;
} catch (Exception e) {
pane.append("error:" + e.toString() + "查看控制台\n");
e.printStackTrace();
} finally {
dbCon.closeConnection(con);
}
return root;
}
2.2 freemarker (根据订制的模版生成 文件)
/**
* 初始化
*/
public void init() {
File file = new File("bin/resource/template");
cfg = new Configuration();
try {
cfg.setDirectoryForTemplateLoading(file);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
pane.append("error:" + e.toString() + "查看控制台\n");
}
}
/**
* 生成新文件
*
* @param root
* 信息封装
* @param newFileName
* 新文件名字
* @param templeName
* 模版名字
* @param newFilePath
* 新文件路径
*/
public void startMake(HashMap
String templeName, String newFilePath) {
Template t;
try {
t = cfg.getTemplate(templeName);
Writer out = new OutputStreamWriter(new FileOutputStream(
newFilePath + "/" + newFileName), "utf-8");
t.process(root, out);
out.flush();
out.close();
pane.append(newFilePath + "/" + newFileName + "生成成功\n");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
pane.append("error:" + e.toString() + "查看控制台\n");
}
}
public void begin() {
HashMap
this.startMake(root, "I" + this.domainName + "Svc.java", "svc.ftl",
svcPath);// 生成svc文件
this.startMake(root, this.domainName + "Impl.java", "Impl.ftl",
implPath);// 生成Impl文件
this.startMake(root, this.domainName + "_Form.html", "Form.ftl",
pagesPath);// 生成form 页面
this.startMake(root, this.domainName + "_View.html", "View.ftl",
pagesPath);// 生成view 页面
this.startMake(root, this.domainName + ".html", "mainhtml.ftl",
pagesPath);// 生成main.html 页面
this.startMake(root, this.domainName + ".js", "js.ftl",
pagesPath);// 生成js 页面
}
2.3美化swing界面 substance 皮肤包
SubstanceLookAndFeel.setSkin(new CremeSkin());//substance skin
截图
下载连接 点击下载