package com.flong.codegenerator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
/***
*@Author:liangjilong
*@Date:2015年12月5日下午12:25:12
*@Email:jilongliang@sina.com
*@Version:1.0
*@CopyRight(c)Flong Intergrity Ltd.
*@Description:读取文properties
*/
public class PropertiesHelper {
private static final Map<String, String> properties = new HashMap<String, String>();
static {
try {
Properties pps = new Properties();
pps.load(PropertiesHelper.class.getClassLoader().getResourceAsStream("prop/DBSource.properties"));
//处理重复的值.
for (Entry<Object, Object> entry : pps.entrySet()) {
properties.put(entry.getKey().toString().trim(), entry.getValue().toString().trim());
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
*通过key值去获取值.
*/
public static String getValueByKey(String name) {
return properties.get(name);
}
}
package com.flong.codegenerator;
import java.io.File;
import java.io.FileWriter;
public class FileUtils {
/**
* 把生成的文件都保存.
* @param path
* @param data
*/
public static void save(String path, String data) {
try {
File file = new File(path);
File dir = new File(path.substring(0, path.lastIndexOf("/")));
if(!dir.exists()) {
dir.mkdirs();
}
FileWriter out = new FileWriter(file);
out.write(data);
out.flush();
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package com.flong.codegenerator;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
/***
*@Author:liangjilong
*@Date:2015年12月5日下午12:25:12
*@Email:jilongliang@sina.com
*@Version:1.0
*@CopyRight(c)Flong Intergrity Ltd.
*/
public class DBHelperUtils {
private static final Connection conn;
private static final String driverClass = PropertiesHelper.getValueByKey("jdbc.driver");
private static final String connectionUrl = PropertiesHelper.getValueByKey("jdbc.url");
private static final String username = PropertiesHelper.getValueByKey("jdbc.username");
private static final String password = PropertiesHelper.getValueByKey("jdbc.password");
private static DBHelperUtils instance = null;
/**
* 定义代码块.
*/
static {
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(connectionUrl, username, password);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**建立单例模式
* Single
* @return
*/
public static DBHelperUtils getInstance() {
if (instance == null) {
synchronized (DBHelperUtils.class) {
instance = new DBHelperUtils();
}
}
return instance;
}
/**
* 查询数据
* @param sql
* @param params
* @return
*/
public static ResultSet query(String sql, List<Object> params) {
System.out.println("sql: " + sql);
//System.out.println("params: " + params);
try {
PreparedStatement psmt = conn.prepareStatement(sql);
if(params != null) {
for (int i = 0; i < params.size(); i++) {
psmt.setObject(i+1, params.get(i));
}
}
return psmt.executeQuery();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/***
* 更新
* @param sql
* @param params
*/
public static void update(String sql, List<Object> params) {
System.out.println("sql: " + sql);
//System.out.println("params: " + params);
try {
PreparedStatement psmt = conn.prepareStatement(sql);
if(params != null) {
for (int i = 0; i < params.size(); i++) {
psmt.setObject(i+1, params.get(i));
}
}
psmt.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* 获取链接
* @return
*/
public static Connection getConnection(){
try {
Class.forName(driverClass);
return DriverManager.getConnection(connectionUrl, username, password);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
package com.flong.codegenerator;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
/***
*@Author:liangjilong
*@Date:2015年12月5日下午12:25:12
*@Email:jilongliang@sina.com
*@Version:1.0
*@CopyRight(c)Flong Intergrity Ltd.
*@Desction:★★★★★★★★★★★★★★★代码生成器实现思路★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
*
* ★★在快速开发的过程中,为了节省时间和成本很多人都会开发自己的代码生成器,而且成为程序员开发过程中必不可少的神器.
* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
* 第一种:先有数据库表,然后通过jdbc链接数据库再读取表的字段等属性出来生成Entity,Dao,Service,Controller,JSP等代码
* 这种必须是有数据库和表的思想,通过程序去读取数据库表的属性等信息,然后组织代码通过文件流生成文件.
*
* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
* 第二种:已经设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段实现
* Entity,Dao,Service,Controller,JSP,在过程中会借助Freemaker,Velocity去实现.三层和jsp,然后通过一下ORM(hibernate,
* ibatis,myibatis等)技术逆向生成数据库表.这种是无数据库表的思想. 在生成java的代码一般不建议建ORM映射主从表关系,通过
* SQL去建立关系,为啥?因为在一些大型的公司如:银行,阿里巴巴,电信等公司,很多项目开发过程中在数据库表很少建立表关系的
* 因为在些业务复杂的情况下通过SQL和程序控制的解决方案比ORM映射关系方案占优势.比如优化性能/维护/灵活性更加好等.
* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
*
* 此程序可以再优化的,为了有些初学者,就不作太多的处理和优化.一些高手会编程更好的生成器,此程序只提供参考和学习,如有什么
* 问题,可以多指出.共同学习和进步.谢谢!~
* ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
*/
@SuppressWarnings("all")
public class CodeGenerator {
/*************************变量****Begin************************************/
private static final String myEmail="jilongliang@sina.com";//Email
private static final String Version="1.0";//版本
private static final String Description=" ";//描述
public static final String ENTER = "\n";//换行
public static final String TAB = " ";//tab
public static final String NAME = "NAME";
public static final String TABLE_CAT = "TABLE_CAT";//表 catalog
public static final String TABLE_SCHEM = "TABLE_SCHEM";//表 schema
public static final String TABLE_NAME = "TABLE_NAME";//表名
public static final String TABLE_TYPE = "TABLE_TYPE";//表类型
public static final String REMARKS = "REMARKS";//表注释
public static final String TYPE = "TYPE";//表的类型
public static final String SIZE = "SIZE";//大小
public static final String CLASS = "CLASS";//类别
/*************************变量****End************************************/
public static final String NOW_DATE = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
/***************获取数据库的配置连接************/
public static final String DB_NAME = PropertiesHelper.getValueByKey("jdbc.url").substring(
PropertiesHelper.getValueByKey("jdbc.url").lastIndexOf("/")+1,
PropertiesHelper.getValueByKey("jdbc.url").indexOf("?") == -1?
PropertiesHelper.getValueByKey("jdbc.url").length():
PropertiesHelper.getValueByKey("jdbc.url").indexOf("?"));
//从配置获取工程的报名路径
public static final String ROOT_PACKAGE = PropertiesHelper.getValueByKey("rootPackage");
//获取作者.
public static final String AUTHOR = PropertiesHelper.getValueByKey("author");
//忽略表的后缀.
public static final List<String> IGNORE_TABLE_PREFIX = new ArrayList<String>();
/*******定义代码块*******/
static {
String ignoreTablePrefix = PropertiesHelper.getValueByKey("ignoreTablePrefix");
if(ignoreTablePrefix.length() > 0) {
String[] ignoreTablePrefixs = ignoreTablePrefix.split("\\s*\\,\\s*");
for (String elem : ignoreTablePrefixs) {
IGNORE_TABLE_PREFIX.add(elem);
}
}
}
/***
* 生成实体类的代码
* @param table
* @throws Exception
*/
public void createEntityClass(String table) throws Exception {
String tableConstantName = getTableConstantName(table);
String className = getClassName(tableConstantName);
StringBuilder sb = new StringBuilder();
sb.append("package " + ROOT_PACKAGE + ".entity;");
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
sb.append(" * @Version:").append(Version).append(ENTER);
sb.append(" * @Description:").append(className).append(ENTER);
sb.append(" * @Email:").append(myEmail).append("\n*/");
sb.append(ENTER);
sb.append("@Relation(" + className + ".TABLE)");
sb.append(ENTER);
sb.append("public class " + className + " extends Entity {");
sb.append(ENTER);
sb.append(ENTER);
sb.append(TAB);
sb.append("/** 表名常量 */");
sb.append(ENTER);
sb.append(TAB);
sb.append("public static final String TABLE = Table." + tableConstantName + ";");
sb.append(ENTER);
sb.append(ENTER);
sb.append(TAB);
sb.append("/**");
sb.append(ENTER);
sb.append(TAB);
sb.append(" * 列名常量");
sb.append(ENTER);
sb.append(TAB);
sb.append(" */");
sb.append(ENTER);
for (Map<String, Object> col : getCols(table)) {
String colName = col.get(NAME).toString().toUpperCase();
sb.append(TAB);//生成字段变量
sb.append("public static final String COL_" + colName + " = \"" + colName + "\";//"+col.get(REMARKS));
sb.append(ENTER);
}
sb.append(ENTER);
sb.append(TAB);
sb.append("/**");
sb.append(ENTER);
sb.append(TAB);
sb.append(" * 列属性");
sb.append(