package com.flong.codegenerator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.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);
}
}
public static String get(String name) {
return properties.get(name);
}
}
?
?
package com.flong.codegenerator;
import java.io.File;
import java.io.FileWriter;
public class FileUtils {
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;
/**
* 定义代码块.
*/
static {
try {
String driverClass = PropertiesHelper.get("jdbc.driver");
String connectionUrl = PropertiesHelper.get("jdbc.url");
String username = PropertiesHelper.get("jdbc.username");
String password = PropertiesHelper.get("jdbc.password");
Class.forName(driverClass);
conn = DriverManager.getConnection(connectionUrl, username, password);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 查询数据
* @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);
}
}
public static Connection getConnection(){
String driverClass = PropertiesHelper.get("jdbc.driver");
String connectionUrl = PropertiesHelper.get("jdbc.url");
String username = PropertiesHelper.get("jdbc.username");
String password = PropertiesHelper.get("jdbc.password");
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,Contronller,JSP等代码
* 这种必须是有数据库和表的思想
*
* 第二种:已经设计好数据库表文档,把所有表的字段属性配置到excel或者csv格式的文件通过jxl/poi技术去读取文件的字段实现
* Entity,Dao,Service,Contronller,JSP,在过程中会借助Freemaker,Velocity去实现.三层和jsp,然后通过一下ORM(hibernate,
* ibatis,myibatis等)技术逆向生成数据库表.这种是无数据库思想. 在生成java的代码一般不建议建ORM映射主从表关系,通过sql去
* 建立关系,为啥?因为在一些大型的公司如:银行,阿里巴巴,电信等公司,项目开发过程中在数据库表很少建立表关系的.因为在些
* 业务复杂的情况下sql解决方案比orm方案占优势.比如优化性能/维护等.
*/
@SuppressWarnings("all")
public class CodeGenerator {
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";//类别
public static final String NOW_DATE = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
public static final String DB_NAME = PropertiesHelper.get("jdbc.url").substring(PropertiesHelper.get("jdbc.url").lastIndexOf("/")+1,
PropertiesHelper.get("jdbc.url").indexOf("?") == -1?
PropertiesHelper.get("jdbc.url").length():PropertiesHelper.get("jdbc.url").indexOf("?"));
public static final String ROOT_PACKAGE = PropertiesHelper.get("rootPackage");//从配置获取工程的报名路径
public static final String AUTHOR = PropertiesHelper.get("author");//获取作者.
public static final List<String> IGNORE_TABLE_PREFIX = new ArrayList<String>();
static {
String ignoreTablePrefix = PropertiesHelper.get("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 * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\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(ENTER);
sb.append(TAB);
sb.append(" */");
sb.append(ENTER);
for (Map<String, Object> col : getCols(table)) {
sb.append(TAB);
sb.append("/** */");
sb.append(ENTER);
if(col.get(NAME).toString().equalsIgnoreCase("ID")) {
sb.append(TAB);
sb.append("@Id");
sb.append(ENTER);
}
sb.append(TAB);
sb.append("@Column(COL_" + col.get(NAME).toString().toUpperCase() + ")");
sb.append(ENTER);
sb.append(TAB);
sb.append("private ");
if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID")) {
sb.append("Long");
} else if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) ||
Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
sb.append("Date");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
sb.append(col.get(CLASS));
} else {
sb.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
}
// sb.append(" " + getFieldName(col.get(NAME).toString()) + ";");
sb.append(" " + col.get(NAME).toString() + ";");
sb.append(ENTER);
}
sb.append(ENTER);
for (Map<String, Object> col : getCols(table)){
sb.append(TAB);
sb.append("public ");
if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID")) {
sb.append("Long");
} else if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) ||
Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
sb.append("Date");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
sb.append(col.get(CLASS));
} else {
sb.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
}
sb.append(" ").append("get").append(col.get(NAME).toString().replaceFirst("\\b(\\w)|\\s(\\w)", col.get(NAME).toString().substring(0,1).toUpperCase()));
sb.append("() {");
sb.append(ENTER);
sb.append(TAB);
sb.append(TAB);
sb.append("return ").append(col.get(NAME).toString()).append(";");
sb.append(ENTER);
sb.append(TAB);
sb.append("}");
sb.append(ENTER);
sb.append(TAB);
sb.append("public void ").append("set").append(col.get(NAME).toString().replaceFirst("\\b(\\w)|\\s(\\w)", col.get(NAME).toString().substring(0,1).toUpperCase()));
sb.append("(");
if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID")) {
sb.append("Long");
} else if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) ||
Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
sb.append("Date");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
sb.append(col.get(CLASS));
} else {
sb.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
}
sb.append(" ").append(col.get(NAME).toString());
sb.append(") {");
sb.append(ENTER);
sb.append(TAB);
sb.append(TAB);
sb.append("this.").append(col.get(NAME).toString()).append(" = ").append(col.get(NAME).toString()).append(";");
sb.append(ENTER);
sb.append(TAB);
sb.append("}");
sb.append(ENTER);
}
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/entity/" + className + ".java", sb.toString());
}
/***
* 生成dao层java类的代码
* @param table
* @throws Exception
*/
public void createDaoClass(String table) throws Exception {
String className = getClassName(getTableConstantName(table));
String objectName = StringUtils.uncapitalize(className);
StringBuilder sb = new StringBuilder();
sb.append("package " + ROOT_PACKAGE + ".dao;").append(ENTER);
sb.append("import java.io.Serializable;").append(ENTER);
sb.append("import java.util.List;").append(ENTER);
sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
sb.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER);
sb.append("import com.flong.modules.pojo."+className+";").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\n */");
sb.append(ENTER);
sb.append("public interface " + className + "Dao extends EntityDao<" + className + "> {").append(ENTER);
sb.append("/**查询*/").append(ENTER);
sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER);
sb.append("/**保存数据*/").append(ENTER);
sb.append(" public void saveData("+className+" "+objectName+");").append(ENTER);
sb.append("/**更新数据*/").append(ENTER);
sb.append(" public void updateData("+className+" "+objectName+");").append(ENTER);
sb.append("/**删除数据*/").append(ENTER);
sb.append(" public void deleteData(Serializable pk);").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/" + className + "Dao.java", sb.toString());
}
/***
* 生成dao的实现类的代码
* @param table
* @throws Exception
*/
public void createDaoImplClass(String table) throws Exception {
String className = getClassName(getTableConstantName(table));
String objectName = StringUtils.uncapitalize(className);
String tableName = StringUtils.lowerCase(getTableConstantName(table));//获取表名
StringBuilder sb = new StringBuilder();
sb.append("package " + ROOT_PACKAGE + ".dao.impl;").append(ENTER);
sb.append("import java.io.Serializable;").append(ENTER);
sb.append("import org.apache.commons.lang3.StringUtils;").append(ENTER);
sb.append("import org.springframework.stereotype.Repository;").append(ENTER);
sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
sb.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER);
sb.append("import com.flong.modules.dao."+className+"Dao;").append(ENTER);
sb.append("import com.flong.modules.pojo."+className+";").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\n */");
sb.append(ENTER);
sb.append("@Repository");
sb.append(ENTER);
sb.append("public class " + className + "DaoImpl extends EntityDaoSupport<" + className + "> implements " + className + "Dao {");
sb.append("/**查询*/").append(ENTER);
sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER);
sb.append(" String sql = ").append("\" select * from ").append(tableName).append(" where 1=1; \" ").append(ENTER);//这个TABLE是实体类的变量
sb.append(" List<"+className+"> list= DaoQuery.query(sql,"+className+".class,simplePage);").append(ENTER);
sb.append(" return list;").append(ENTER);
sb.append("}").append(ENTER);//查询的结束{
sb.append("/**保存数据*/").append(ENTER);
sb.append(" public void saveData("+className+" "+objectName+"){").append(ENTER);
sb.append(" try {").append(ENTER);
sb.append(" saveOrUpdate("+className+");").append(ENTER);
sb.append(" } catch (DaoAccessException e) {").append(ENTER);
sb.append(" e.printStackTrace();").append(ENTER);
sb.append(" }").append(ENTER);
sb.append("}");
sb.append("/**更新数据*/").append(ENTER);
sb.append(" public void updateData("+className+" "+objectName+"){").append(ENTER);
sb.append(" try {").append(ENTER);
sb.append(" saveOrUpdate("+className+");").append(ENTER);
sb.append(" } catch (DaoAccessException e) {").append(ENTER);
sb.append(" e.printStackTrace();").append(ENTER);
sb.append(" }").append(ENTER);
sb.append("}");
sb.append("/**删除数据*/").append(ENTER);
sb.append(" public void deleteData(Long pk){").append(ENTER);
sb.append(" try {").append(ENTER);
sb.append(" delete(pk);").append(ENTER);
sb.append(" } catch (DaoAccessException e) {").append(ENTER);
sb.append(" e.printStackTrace();").append(ENTER);
sb.append(" }").append(ENTER);
sb.append("}");
sb.append(ENTER);
sb.append(ENTER);
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/impl/" + className + "DaoImpl.java", sb.toString());
}
/***
* 创建Service的接口
* createServiceClass
* @param table
*/
public void createServiceClass(String table) {
String className = getClassName(getTableConstantName(table));
String objectName = StringUtils.uncapitalize(className);
StringBuilder sb = new StringBuilder();
sb.append("package " + ROOT_PACKAGE + ".service;");
sb.append("import java.io.Serializable;").append(ENTER);
sb.append("import java.util.List;").append(ENTER);
sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
sb.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER);
sb.append("import com.flong.modules.pojo."+className+";").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\n */");
sb.append(ENTER);
sb.append("public interface " + className + "Service {");
sb.append("/**查询*/").append(ENTER);
sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER);
sb.append("/**保存数据*/").append(ENTER);
sb.append(" public void saveData("+className+" "+objectName+");").append(ENTER);
sb.append("/**更新数据*/").append(ENTER);
sb.append(" public void updateData("+className+" "+objectName+");").append(ENTER);
sb.append("/**删除数据*/").append(ENTER);
sb.append(" public void deleteData(Long pk);").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/" + className + "Service.java", sb.toString());
}
/***
* 创建Service层的实现类
* createServiceImplClass
* @param table
*/
public void createServiceImplClass(String table) {
String className = getClassName(getTableConstantName(table));
String objectName = StringUtils.uncapitalize(className);
StringBuilder sb = new StringBuilder();
sb.append("package " + ROOT_PACKAGE + ".service.impl;");
sb.append("import java.io.Serializable;").append(ENTER);
sb.append("import java.util.List;").append(ENTER);
sb.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER);
sb.append("import org.springframework.stereotype.Service;").append(ENTER);
sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
sb.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER);
sb.append("import com.flong.modules.dao."+className+"Dao;").append(ENTER);
sb.append("import com.flong.modules.pojo."+className+";").append(ENTER);
sb.append("import com.flong.modules.service."+className+"Service;").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\n */");
sb.append(ENTER);
sb.append("@Service");
sb.append(ENTER);
sb.append("public class " + className + "ServiceImpl extends EntityDaoSupport implements " + className + "Service {").append(ENTER);
sb.append("@Autowired "+className+"Dao "+objectName+"Dao;");
sb.append("/**查询*/").append(ENTER);
sb.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER);
sb.append(" return "+objectName+"Dao.list(simplePage,"+objectName+");").append(ENTER);
sb.append("}").append(ENTER);//查询的结束{
sb.append("/**保存数据*/").append(ENTER);
sb.append(" public void saveData("+className+" "+objectName+"){").append(ENTER);
sb.append( objectName+"Dao.saveData("+objectName+");").append(ENTER);
sb.append("}");
sb.append("/**更新数据*/").append(ENTER);
sb.append(" public void updateData("+className+" "+objectName+"){").append(ENTER);
sb.append( objectName+"Dao.updateData("+objectName+");").append(ENTER);
sb.append("}");
sb.append("/**删除数据*/").append(ENTER);
sb.append(" public void deleteData(Long pk){").append(ENTER);
sb.append( objectName+"Dao.deleteData(pk);").append(ENTER);
sb.append("}");
sb.append(ENTER);
sb.append(ENTER);
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/impl/" + className + "ServiceImpl.java", sb.toString());
}
/***
* 创建控制层类Controller
* @param table
*/
public void createControllerClass(String table){
String className = getClassName(getTableConstantName(table));
//通过 org.apache.commons.lang3.StringUtils的uncapitalize方法把类名第一个字母转换成小写
String objectName = StringUtils.uncapitalize(className);
//通过 org.apache.commons.lang3.StringUtils的lowerCase方法把类名整个单词转化成小写然后为springmvc的路径返回jsp请求.
String BASE_PATH="modules/"+StringUtils.lowerCase(className)+"/";//modules+模块名
StringBuilder sb = new StringBuilder();
sb.append("import java.util.List;").append(ENTER);
sb.append("import javax.servlet.http.HttpServletRequest;").append(ENTER);
sb.append("import javax.servlet.http.HttpServletResponse;").append(ENTER);
sb.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER);
sb.append("import org.springframework.stereotype.Controller;").append(ENTER);
sb.append("import org.springframework.web.bind.annotation.RequestMapping;").append(ENTER);
sb.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
sb.append("import com.flong.commons.web.BaseController;").append(ENTER);
sb.append("import com.flong.modules.pojo."+className+";").append(ENTER);
sb.append("import com.flong.modules.service."+className+"Service;").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\n */");
sb.append(ENTER);
sb.append("@Controller").append(ENTER);
sb.append("@RequestMapping(\""+className+"\")");
sb.append(ENTER);
sb.append("public class " + className + "Controller extends BaseController {");
sb.append(ENTER);
sb.append(ENTER);
sb.append(" @Autowired "+className+"Service " +className+"Service");
sb.append(ENTER);
//创建一个默认的查询..
sb.append(ENTER);
sb.append(" @RequestMapping(value=\"list\")").append(ENTER);
sb.append(" public String list("+className+" "+objectName+",SimplePage simplePage ,HttpServletRequest request ,HttpServletResponse response){");
sb.append(ENTER);
sb.append(" List<"+className+"> list = "+className+"Service.list(simplePage, "+objectName+");");
sb.append(ENTER);
sb.append(" request.setAttribute(\""+objectName+"\", object);");
sb.append(ENTER);
sb.append(" request.setAttribute(\"page\", simplePage);");
sb.append(ENTER);
sb.append(" request.setAttribute(\"list\", list);");
sb.append(ENTER);
sb.append(" return \""+BASE_PATH+"list\";");
sb.append(ENTER);
sb.append(" }");
sb.append(ENTER);
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/controller/" + className + "Controller.java", sb.toString());
}
/***
* 创建JSP页面.
* 以bootstrap3.x为主.
* @param table
*/
public void createJspView(String table)throws Exception{
String tableConstantName = getTableConstantName(table);
String className = getClassName(tableConstantName);
//通过 org.apache.commons.lang3.StringUtils的uncapitalize方法把类名第一个字母转换成小写
String objectName = StringUtils.uncapitalize(className);
StringBuilder sb = new StringBuilder();
sb.append(" <%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\" pageEncoding=\"UTF-8\"%>").append(ENTER);
sb.append(" <%@ include file=\"/WEB-INF/views/include/taglib.jsp\"%>").append(ENTER);
sb.append(" <!DOCTYPE htm>").append(ENTER);
sb.append(" <html>").append(ENTER);
sb.append(" <head>").append(ENTER);
sb.append(" <%@ include file=\"/WEB-INF/views/include/meta.jsp\"%>").append(ENTER);
sb.append(" <%@ include file=\"/WEB-INF/views/include/include.jsp\"%>").append(ENTER);
sb.append(" <title></title>").append(ENTER);
sb.append(" <style>").append(ENTER);
sb.append(" .breadcrumb{").append(ENTER);
sb.append(" background-color: #fff;").append(ENTER);
sb.append(" }").append(ENTER);
sb.append(" .form-search{").append(ENTER);
sb.append(" background-color: #fff;").append(ENTER);
sb.append(" }").append(ENTER);
sb.append(" .form-search1{").append(ENTER);
sb.append(" padding: 8px 15px;").append(ENTER);
sb.append(" background-color: #f5f5f5;").append(ENTER);
sb.append(" }").append(ENTER);
sb.append(" </style>").append(ENTER);
sb.append(" </head>").append(ENTER);
sb.append("<body>").append(ENTER);
sb.append("<ul class=\"nav nav-tabs\">").append(ENTER);
sb.append( "<li class=\"active\"><a href=\"${basePath}email/list\">Email列表</a></li>").append(ENTER);
sb.append("</ul>").append(ENTER);
sb.append( " <form:form id=\"searchForm\" modelAttribute=\"email\" action=\"${basePath}email/list\" method=\"post\" class=\"breadcrumb form-search form-inline\">").append(ENTER);
sb.append(" <div style=\"margin-bottom: 20px;\" class=\"form-search1\">").append(ENTER);
sb.append(" <label>Email :</label><form:input path=\"email\" htmlEscape=\"false\" maxlength=\"50\" class=\"input-medium form-control\" placeholder=\"Email\"/>").append(ENTER);
sb.append(" <input id=\"btnSubmit\" class=\"btn btn-info\" type=\"submit\" value=\"查询\"/>").append(ENTER);
sb.append("</div>").append(ENTER);
sb.append("<table id=\"contentTable\" class=\"table table-striped table-bordered table-hover\">").append(ENTER);
sb.append("<thead>").append(ENTER);
sb.append("<tr>").append(ENTER);
for (Map<String, Object> col : getTableRemarks(table)) {
for (String k : col.keySet()){
String colName = col.get(k).toString();
sb.append("<th>").append(colName).append("</th>");
sb.append(ENTER);
}
}
sb.append("<th>操作</th> ");
sb.append(ENTER);
sb.append("</tr>").append(ENTER);
sb.append("</thead>").append(ENTER);
sb.append("<tbody>").append(ENTER);
sb.append(" <c:forEach items=\"${list}\" var=\""+objectName+"\" varStatus=\"row\">").append(ENTER);
sb.append(" <tr>").append(ENTER);
sb.append(" <td>${row.index+1 }</td>").append(ENTER);
for (Map<String, Object> col : getCols(table)) {
sb.append(" <td>");
if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
sb.append("<fmt:formatDate value=\"${"+objectName+"."+col.get(NAME).toString()+"}\" type=\"date\" dateStyle=\"long\"/>");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
sb.append(" ${"+objectName+"."+col.get(NAME).toString()+"}" );
}else{
sb.append(" ${"+objectName+"."+col.get(NAME).toString()+"}" );
}
sb.append("</td>");
sb.append(ENTER);
}
sb.append(" </tr>").append(ENTER);
sb.append(" </c:forEach>").append(ENTER);
sb.append("</tbody>").append(ENTER);
sb.append("</table>").append(ENTER);
sb.append("<%@ include file=\"/WEB-INF/views/include/pagination.jsp\"%>").append(ENTER);
sb.append("</form:form>").append(ENTER);
sb.append("</body>").append(ENTER);
sb.append("</html>").append(ENTER);
sb.append(ENTER);
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/jsp/" + className + ".jsp", sb.toString());
}
/***
* 创建表的类定义常量
* @param tables
*/
public void createTableClass(List<String> tables) {
StringBuilder sb = new StringBuilder();
sb.append("package " + ROOT_PACKAGE + ".domain;");
sb.append(ENTER);
sb.append(ENTER);
sb.append("/**\n * \n *\n * @created:" + NOW_DATE + "\n * @author " + AUTHOR + "\n */");
sb.append(ENTER);
sb.append("public interface Table {");
sb.append(ENTER);
for (String table : tables) {
sb.append(TAB);
sb.append("String " + getTableConstantName(table) + " = \"" + table.toUpperCase() + "\";");
sb.append(ENTER);
}
sb.append(ENTER);
sb.append("}");
sb.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/domain/Table.java", sb.toString());
}
/***
* 获取数据库表名
* @return
* @throws Exception
*/
public List<String> getTables() throws Exception {
List<Object> params = new ArrayList<Object>();
System.out.println("==========="+DB_NAME);
//params.add(DB_NAME);
String dbname=DB_NAME;
params.add(dbname);
ResultSet rs = DBHelperUtils.query("select table_name from information_schema.tables where table_schema = ? order by table_name", params);
List<String> tables = new ArrayList<String>();
while (rs.next()) {
tables.add(rs.getString(1));
}
return tables;
}
/***
* 列名 类型 => 说明
* TABLE_CAT String => 表 catalog
* TABLE_SCHEM String => 表 schema
* TABLE_NAME String => 表名
* TABLE_TYPE String => 表类型
* REMARKS String => 表注释
* 获取表的列
* @param table
* @return
* @throws Exception
*/
private List<Map<String, Object>> getCols(String table) throws Exception {
List<Map<String, Object>> cols = new ArrayList<Map<String,Object>>();
ResultSetMetaData md = DBHelperUtils.query("select * from " + table + " where 1 = 2", null).getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
Map<String, Object> col = new HashMap<String, Object>();
cols.add(col);
col.put(NAME, md.getColumnName(i));
col.put(CLASS, md.getColumnClassName(i));
col.put(SIZE, md.getColumnDisplaySize(i));
col.put(REMARKS, md.getColumnName(i));
/* System.out.println("1"+ md.getCatalogName(i));
System.out.println("2"+ md.getColumnClassName(i));
System.out.println("3"+ md.getColumnDisplaySize(i));
System.out.println("4"+ md.getColumnType(i));
System.out.println("5"+ md.getSchemaName(i));
System.out.println("6"+ md.getPrecision(i));
System.out.println("7"+ md.getScale(i));*/
String _type = null;
String type = md.getColumnTypeName(i);
if(type.equals("INT")) {
_type = "INTEGER";
} else if(type.equals("DATETIME")) {
_type = "TIMESTAMP";
} else {
_type = type;
}
col.put(TYPE, _type);
}
return cols;
}
/**
* 获取所有表
* @param conn
* @throws SQLException
*/
public static List<Map<String, Object>> getAllTable() throws SQLException {
List<Map<String, Object>> cols = new ArrayList<Map<String,Object>>();
Connection conn=DBHelperUtils.getConnection();
DatabaseMetaData metaData = conn.getMetaData();
ResultSet rs = metaData.getTables(null, "%", "%", new String[] {"TABLE"});
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");
if(tableName!=null){
Map<String, Object> col = new HashMap<String, Object>();
// rs =getConnection.getMetaData().getColumns(null, getXMLConfig.getSchema(),tableName.toUpperCase(), "%");//其他数据库不需要这个方法的,直接传null,这个是oracle和db2这么用
ResultSet rs1 = metaData.getColumns(null, "%", tableName, "%");
while(rs1.next()){
String COLUMN_NAME = rs1.getString("COLUMN_NAME");
String REMARKS = rs1.getString("REMARKS");
//先判断备注是否为空,不为空就取表的字段的注释说明,否则的话就去字段列名
if(REMARKS!=null){
col.put(REMARKS, REMARKS);
}else{
col.put(COLUMN_NAME, COLUMN_NAME);
}
cols.add(col);
}
}
}
return cols;
}
/***
* 获取列的备注
* @param table
* @return
* @throws SQLException
*/
public static List<Map<String, Object>> getTableRemarks(String table) throws SQLException {
List<Map<String, Object>> cols = new ArrayList<Map<String,Object>>();
Connection conn=DBHelperUtils.getConnection();
DatabaseMetaData metaData = conn.getMetaData();
ResultSet rs = metaData.getTables(null, "%", "%", new String[] {"TABLE"});
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");
//传进来的表名和查询出来的表名作对比,并且是忽略大小写
if(tableName!=null){
if(table.equalsIgnoreCase(tableName)){
Map<String, Object> col = new HashMap<String, Object>();
//Map<String, Object> col = new HashTable<String, Object>();
ResultSet rs1 = metaData.getColumns(null, "%", tableName, "%");
while(rs1.next()){
String COLUMN_NAME = rs1.getString("COLUMN_NAME");
String REMARKS = rs1.getString("REMARKS");
//先判断备注是否为空,不为空就取表的字段的注释说明,否则的话就去字段列名
if(REMARKS!=null){
col.put(REMARKS, REMARKS);
}else{
col.put(COLUMN_NAME, COLUMN_NAME);
}
col = removeRepeatData();
cols.add(col);
}
break;
}
}
}
return cols;
}
/***
* 去掉重复的数据
* @return
*/
private static Map<String, Object> removeRepeatData() {
Map<String, Object> col = new HashMap<String, Object>();
Set<String> keySet = col.keySet();
for (String str : keySet) {
col.put(str, str);
}
return col;
}
/***
* 获取表的常量名,一般是在数据库建表的时候,写的注释..
* @param table
* @return
*/
private String getTableConstantName(String table) {
String tableConstantName = table.toUpperCase();
for (String item : IGNORE_TABLE_PREFIX) {
tableConstantName = tableConstantName.replaceAll("^" + item.toUpperCase(), "");
}
return tableConstantName;
}
/***
* 获取类的名
* @param name
* @return
*/
private String getClassName(String name) {
String[] names = name.split("_");
StringBuilder sb = new StringBuilder();
for (String n : names) {
if(n.length() == 0) {
sb.append("_");
} else {
sb.append(n.substring(0, 1).toUpperCase());
if(n.length() > 1) {
sb.append(n.substring(1).toLowerCase());
}
}
}
return sb.toString();
}
/**
* 获取字段名
* @param name
* @return
*/
private String getFieldName(String name) {
String _name = getClassName(name);
return _name.substring(0, 1).toLowerCase() + _name.substring(1);
}
/**
* 转换成泛型Map
* @param limit
* @param rs
* @return
* @throws SQLException
*/
public static List<Map> toListMap(int limit, ResultSet rs)throws SQLException {
ResultSetMetaData rsmd = rs.getMetaData();
int count = 0;
List list = new ArrayList();
while (rs.next()) {
Map row = new HashMap();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
row.put(rsmd.getColumnName(i), rs.getObject(i));
}
list.add(row);
count++;
if (count >= limit) {
break;
}
}
return list;
}
/***
* 获取查询list
* @param conn
* @param sql
* @param limit
* @return
* @throws SQLException
*/
public static List<Map> queryForList(Connection conn, String sql, int limit)throws SQLException {
PreparedStatement ps = conn.prepareStatement(sql.trim());
ps.setMaxRows(limit);
ps.setFetchDirection(1000);
ResultSet rs = ps.executeQuery();
return toListMap(limit, rs);
}
/***
* 获取查询list
* @param conn
* @param sql
* @param limit
* @return
* @throws SQLException
*/
public static List<Map> queryForList(String sql, int limit) throws SQLException {
Connection conn = DBHelperUtils.getConnection();
return queryForList(conn, sql, limit);
}
public static void main(String[] args)throws Exception {
String sql="select * from SYS_MENU ";
//List<Map> queryForList = queryForList(sql, 1000);
/*for(Map m:queryForList){
System.out.println("======"+m);
}*/
String tableName = "SYS_MENU";//表名
List<Map<String, Object>> tableRemarks = getTableRemarks(tableName);
int i=0;
for (Map<String, Object> col : getTableRemarks(tableName)) {
Set<String> keySet = col.keySet();
for (Object str : keySet) {
System.out.println(str);
}
}
//new CodeGenerator().createJspView("sup_email");
}
}
?
package com.flong.codegenerator;
import java.util.List;
/**
* 运行生成的main
* @author liangjilong
*
*/
public class DoMain {
public static void main(String[] args) {
try {
CodeGenerator entityCreater = new CodeGenerator();
List<String> tables = entityCreater.getTables();
for (String table : tables) {
entityCreater.createEntityClass(table);
entityCreater.createDaoClass(table);
entityCreater.createDaoImplClass(table);
entityCreater.createServiceClass(table);
entityCreater.createServiceImplClass(table);
entityCreater.createControllerClass(table);
entityCreater.createJspView(table);
}
entityCreater.createTableClass(tables);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
?
?
代码:http://blog.csdn.net/jilongliang/article/details/50155985
?
?
?
Entity,Dao,Service,Controller,JSP代码生成器实现
原文:http://jilongliang.iteye.com/blog/2262070