代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)

  原文地址:  http://jilongliang.iteye.com/blog/2262070

  1. package com.flong.codegenerator;
  2. import java.sql.Connection;
  3. import java.sql.DatabaseMetaData;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.ResultSetMetaData;
  7. import java.sql.SQLException;
  8. import java.sql.Timestamp;
  9. import java.text.SimpleDateFormat;
  10. import java.util.ArrayList;
  11. import java.util.Date;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. import java.util.Set;
  16. import org.apache.commons.lang3.StringUtils;
  17. /***
  18. *@Author:liangjilong
  19. *@Date:2015年12月5日下午12:25:12
  20. *@Email:jilongliang@sina.com
  21. *@Version:1.0
  22. *@CopyRight(c)Flong Intergrity Ltd.
  23. *@Desction:★★★★★★★★★★★★★★★代码生成器实现思路★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  24. *
  25. *   ★★在快速开发的过程中,为了节省时间和成本很多人都会开发自己的代码生成器,而且成为程序员开发过程中必不可少的神器.
  26. *   ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  27. *    第一种:先有数据库表,然后通过jdbc链接数据库再读取表的字段等属性出来生成Entity,Dao,Service,Controller,JSP等代码
  28. *   这种必须是有数据库和表的思想,通过程序去读取数据库表的属性等信息,然后组织代码通过文件流生成文件.
  29. *
  30. *   ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  31. *   第二种:已经设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段实现
  32. *   Entity,Dao,Service,Controller,JSP,在过程中会借助Freemaker,Velocity去实现.三层和jsp,然后通过一下ORM(hibernate,
  33. *   ibatis,myibatis等)技术逆向生成数据库表.这种是无数据库表的思想. 在生成java的代码一般不建议建ORM映射主从表关系,通过
  34. *   SQL去建立关系,为啥?因为在一些大型的公司如:银行,阿里巴巴,电信等公司,很多项目开发过程中在数据库表很少建立表关系的
  35. *   因为在些业务复杂的情况下通过SQL和程序控制的解决方案比ORM映射关系方案占优势.比如优化性能/维护/灵活性更加好等.
  36. *   ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  37. *
  38. *   此程序以MySQL为主,未实现其他数据库.此程序可以再优化的,为了有些初学者,就不作太多的处理和优化.一些高手会编程更好的生
  39. *   成器,此程序只提供参考和学习,如有什么问题,可以多指出.共同学习和进步.谢谢!~
  40. *   ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  41. */
  42. @SuppressWarnings("all")
  43. public class CodeGenerator {
  44. /*************************变量****Begin************************************/
  45. private static final String myEmail="jilongliang@sina.com";//Email
  46. private static final String Version="1.0";//版本
  47. private static final String Description=" ";//描述
  48. public static final String ENTER = "\n";//换行
  49. public static final String TAB = "    ";//tab空格.
  50. public static final String NAME = "NAME";
  51. public static final String TABLE_CAT = "TABLE_CAT";//表 catalog
  52. public static final String TABLE_SCHEM = "TABLE_SCHEM";//表 schema
  53. public static final String TABLE_NAME = "TABLE_NAME";//表名
  54. public static final String TABLE_TYPE = "TABLE_TYPE";//表类型
  55. public static final String REMARKS = "REMARKS";//表注释
  56. public static final String TYPE = "TYPE";//表的类型
  57. public static final String SIZE = "SIZE";//大小
  58. public static final String CLASS = "CLASS";//类别
  59. /*************************变量****End************************************/
  60. public static final String NOW_DATE = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  61. /***************获取数据库的配置连接************/
  62. public static final String DB_NAME = PropertiesHelper.getValueByKey("jdbc.url").substring(
  63. PropertiesHelper.getValueByKey("jdbc.url").lastIndexOf("/")+1,
  64. PropertiesHelper.getValueByKey("jdbc.url").indexOf("?") == -1?
  65. PropertiesHelper.getValueByKey("jdbc.url").length():
  66. PropertiesHelper.getValueByKey("jdbc.url").indexOf("?"));
  67. //从配置获取工程的报名路径
  68. public static final String ROOT_PACKAGE = PropertiesHelper.getValueByKey("rootPackage");
  69. //获取作者.
  70. public static final String AUTHOR = PropertiesHelper.getValueByKey("author");
  71. //忽略表的后缀.
  72. public static final List<String> IGNORE_TABLE_PREFIX = new ArrayList<String>();
  73. /*******定义代码块*******/
  74. static {
  75. String ignoreTablePrefix = PropertiesHelper.getValueByKey("ignoreTablePrefix");
  76. if(ignoreTablePrefix.length() > 0) {
  77. String[] ignoreTablePrefixs = ignoreTablePrefix.split("\\s*\\,\\s*");
  78. for (String elem : ignoreTablePrefixs) {
  79. IGNORE_TABLE_PREFIX.add(elem);
  80. }
  81. }
  82. }
  83. /***
  84. * 生成实体类的代码
  85. * @param table
  86. * @throws Exception
  87. */
  88. public void createEntityClass(String table) throws Exception {
  89. String tableConstantName = getTableConstantName(table);
  90. String className = getClassName(tableConstantName);
  91. StringBuilder buffer = new StringBuilder();
  92. buffer.append("package " + ROOT_PACKAGE + ".entity;").append(ENTER);
  93. buffer.append("import java.util.Date;").append(ENTER);
  94. buffer.append("import com.flong.commons.persistence.Entity;").append(ENTER);
  95. buffer.append("import com.flong.commons.persistence.annotation.Column;").append(ENTER);
  96. buffer.append("import com.flong.commons.persistence.annotation.Id;").append(ENTER);
  97. buffer.append("import com.flong.commons.persistence.annotation.Relation;").append(ENTER);
  98. buffer.append("import com.flong.commons.persistence.annotation.Table;").append(ENTER);
  99. buffer.append(ENTER);
  100. buffer.append(ENTER);
  101. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  102. buffer.append(" * @Version:").append(Version).append(ENTER);
  103. buffer.append(" * @Description:").append(className).append(ENTER);
  104. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  105. buffer.append(ENTER);
  106. buffer.append("@Relation(" + className + ".TABLE)");
  107. buffer.append(ENTER);
  108. buffer.append("public class " + className + " extends Entity {");
  109. buffer.append(ENTER);
  110. buffer.append(ENTER);
  111. buffer.append(TAB);
  112. buffer.append("/** 表名常量 */");
  113. buffer.append(ENTER);
  114. buffer.append(TAB);
  115. buffer.append("public static final String TABLE = Table." + tableConstantName + ";");
  116. buffer.append(ENTER);
  117. buffer.append(ENTER);
  118. buffer.append(TAB);
  119. buffer.append("/**");
  120. buffer.append(ENTER);
  121. buffer.append(TAB);
  122. buffer.append(" * 列名常量");
  123. buffer.append(ENTER);
  124. buffer.append(TAB);
  125. buffer.append(" */");
  126. buffer.append(ENTER);
  127. for (Map<String, Object> col : getCols(table)) {
  128. String colName = col.get(NAME).toString().toUpperCase();
  129. buffer.append(TAB);//生成字段变量
  130. buffer.append("public static final String COL_" + colName + " = \"" + colName + "\";//"+col.get(REMARKS));
  131. buffer.append(ENTER);
  132. }
  133. buffer.append(ENTER);
  134. buffer.append(TAB);
  135. buffer.append("/**");
  136. buffer.append(ENTER);
  137. buffer.append(TAB);
  138. buffer.append(" * 列属性");
  139. buffer.append(ENTER);
  140. buffer.append(TAB);
  141. buffer.append(" */");
  142. String tablePrimaryKeys = getTablePrimaryKeys(table);//如果是主键
  143. //if(col.get(NAME).toString().equalsIgnoreCase("ID")) {
  144. if(tablePrimaryKeys!=null){
  145. buffer.append(ENTER+TAB);
  146. //如果主键不为空的时候就给一个@Id注解.
  147. //如果是hibernate的可以给其他的注解,如@GeneratedValue(strategy = GenerationType.IDENTITY)   @SequenceGenerator等
  148. //并要在包的下面头部导入
  149. //import javax.persistence.Column;
  150. //import javax.persistence.Entity;
  151. //import javax.persistence.GeneratedValue;
  152. //import javax.persistence.GenerationType;
  153. //import javax.persistence.Id;
  154. //import javax.persistence.Table;
  155. buffer.append("@Id");
  156. //这里不赋值给,因为下面这个for循环有一个.
  157. //sb.append("@Column(COL_" + tablePrimaryKeys + ")");
  158. }
  159. for (Map<String, Object> col : getCols(table)) {
  160. buffer.append(TAB);
  161. buffer.append(ENTER);
  162. buffer.append(TAB);
  163. buffer.append("@Column(COL_" + col.get(NAME).toString().toUpperCase() + ")");
  164. buffer.append(ENTER);
  165. buffer.append(TAB);
  166. buffer.append("private ");
  167. //这行代码的意思就是说,如果找到数据库表的字段是为ID的时候,或后缀有_ID的就认为是主键,并且忽略大小写就给一个Long
  168. //在实际过程中应该判断是它的字段是不是为了PrimaryKey才设为Long才适合.
  169. //if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID")) {
  170. if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
  171. buffer.append("Date");
  172. } else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
  173. buffer.append(col.get(CLASS));
  174. } else {
  175. buffer.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
  176. }
  177. //sb.append(" " + getFieldName(col.get(NAME).toString()) + ";");
  178. buffer.append(" " + col.get(NAME).toString() + ";");
  179. buffer.append(ENTER);
  180. }
  181. buffer.append(ENTER);
  182. for (Map<String, Object> col : getCols(table)){
  183. buffer.append(TAB);
  184. buffer.append("public ");
  185. if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
  186. buffer.append("Date");
  187. } else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
  188. buffer.append(col.get(CLASS));
  189. } else {
  190. buffer.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
  191. }
  192. buffer.append(" ").append("get").append(col.get(NAME).toString().replaceFirst("\\b(\\w)|\\s(\\w)", col.get(NAME).toString().substring(0,1).toUpperCase()));
  193. buffer.append("() {");
  194. buffer.append(ENTER);
  195. buffer.append(TAB);
  196. buffer.append(TAB);
  197. buffer.append("return ").append(col.get(NAME).toString()).append(";");
  198. buffer.append(ENTER);
  199. buffer.append(TAB);
  200. buffer.append("}");
  201. buffer.append(ENTER);
  202. buffer.append(TAB);
  203. buffer.append("public void ").append("set").append(col.get(NAME).toString().replaceFirst("\\b(\\w)|\\s(\\w)", col.get(NAME).toString().substring(0,1).toUpperCase()));
  204. buffer.append("(");
  205. if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
  206. buffer.append("Date");
  207. } else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
  208. buffer.append(col.get(CLASS));
  209. } else {
  210. buffer.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
  211. }
  212. buffer.append(" ").append(col.get(NAME).toString());
  213. buffer.append(") {");
  214. buffer.append(ENTER);
  215. buffer.append(TAB);
  216. buffer.append(TAB);
  217. buffer.append("this.").append(col.get(NAME).toString()).append(" = ").append(col.get(NAME).toString()).append(";");
  218. buffer.append(ENTER);
  219. buffer.append(TAB);
  220. buffer.append("}");
  221. buffer.append(ENTER);
  222. }
  223. buffer.append("}");
  224. buffer.append(ENTER);
  225. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/entity/" + className + ".java", buffer.toString());
  226. }
  227. /***
  228. * 生成dao接口interface类的代码
  229. * @param table
  230. * @throws Exception
  231. */
  232. public void createDaoClass(String table) throws Exception {
  233. String className = getClassName(getTableConstantName(table));
  234. String objectName = StringUtils.uncapitalize(className);
  235. StringBuilder buffer = new StringBuilder();
  236. buffer.append("package " + ROOT_PACKAGE + ".dao;").append(ENTER);
  237. buffer.append("import java.io.Serializable;").append(ENTER);
  238. buffer.append("import java.util.List;").append(ENTER);
  239. buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
  240. buffer.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER);
  241. buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
  242. buffer.append(ENTER);
  243. buffer.append(ENTER);
  244. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  245. buffer.append(" * @Version:").append(Version).append(ENTER);
  246. buffer.append(" * @Description:").append(className).append(ENTER);
  247. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  248. buffer.append(ENTER);
  249. buffer.append("public interface " + className + "Dao extends EntityDao<" + className + "> {").append(ENTER);
  250. buffer.append("/**查询*/").append(ENTER);
  251. buffer.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER);
  252. buffer.append("/**保存数据*/").append(ENTER);
  253. buffer.append(" public void saveData("+className+" "+objectName+");").append(ENTER);
  254. buffer.append("/**更新数据*/").append(ENTER);
  255. buffer.append(" public void updateData("+className+" "+objectName+");").append(ENTER);
  256. buffer.append("/**删除数据*/").append(ENTER);
  257. buffer.append(" public void deleteData(Long pk);").append(ENTER);
  258. buffer.append(ENTER);
  259. buffer.append(ENTER);
  260. buffer.append("}");
  261. buffer.append(ENTER);
  262. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/" + className + "Dao.java", buffer.toString());
  263. }
  264. /***
  265. * 生成dao的实现类的代码
  266. * @param table
  267. * @throws Exception
  268. */
  269. public void createDaoImplClass(String table) throws Exception {
  270. String className = getClassName(getTableConstantName(table));
  271. String objectName =  StringUtils.uncapitalize(className);
  272. String tableName = StringUtils.lowerCase(getTableConstantName(table));//获取表名
  273. StringBuilder buffer = new StringBuilder();
  274. buffer.append("package " + ROOT_PACKAGE + ".dao.impl;").append(ENTER);
  275. buffer.append("import java.io.Serializable;").append(ENTER);
  276. buffer.append("import org.apache.commons.lang3.StringUtils;").append(ENTER);
  277. buffer.append("import org.springframework.stereotype.Repository;").append(ENTER);
  278. buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
  279. buffer.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER);
  280. buffer.append("import com.flong.modules.dao."+className+"Dao;").append(ENTER);
  281. buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
  282. buffer.append(ENTER);
  283. buffer.append(ENTER);
  284. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  285. buffer.append(" * @Version:").append(Version).append(ENTER);
  286. buffer.append(" * @Description:").append(className).append(ENTER);
  287. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  288. buffer.append(ENTER);
  289. buffer.append("@Repository");//这个是spring的注解
  290. buffer.append(ENTER);
  291. buffer.append("public class " + className + "DaoImpl extends EntityDaoSupport<" + className + "> implements " + className + "Dao {");
  292. buffer.append("/**查询*/").append(ENTER);
  293. buffer.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER);
  294. buffer.append(ENTER);
  295. String mergeField= "";//合并字段.
  296. //--遍历获取列,并拼接字符串,SQL的查询列,查询不建议用*去查询表的所有列.
  297. for (Map<String, Object> col : getCols(table)){
  298. //
  299. if(col.get(NAME).toString()!=null){
  300. mergeField +=col.get(NAME).toString()+",";//合并字段并用,隔开字段名
  301. }
  302. }
  303. //去掉最后一个,号然后拼接成一个完成的select查询字段
  304. if(mergeField!=null){
  305. mergeField = mergeField.substring(0, mergeField.length()-1);
  306. }
  307. buffer.append("    String sql = ").append("\" select "+mergeField+" from ").append(tableName).append(" where 1=1 \" ").append(ENTER);//这个TABLE是实体类的变量
  308. //daoQuery这个是底层封装的一个接口,自个可以更加自己需求封装.
  309. buffer.append("    List<"+className+"> list= daoQuery.query(sql,"+className+".class,simplePage);").append(ENTER);
  310. buffer.append(" return list;").append(ENTER);
  311. buffer.append("}").append(ENTER);//查询的结束{
  312. buffer.append("/**保存数据*/").append(ENTER);
  313. buffer.append(" public void saveData("+className+" "+objectName+"){").append(ENTER);
  314. buffer.append("   try {").append(ENTER);
  315. buffer.append("      saveOrUpdate("+className+");").append(ENTER);
  316. buffer.append("   } catch (DaoAccessException e) {").append(ENTER);
  317. buffer.append("      e.printStackTrace();").append(ENTER);
  318. buffer.append("  }").append(ENTER);
  319. buffer.append("}");
  320. buffer.append("/**更新数据*/").append(ENTER);
  321. buffer.append(" public void updateData("+className+" "+objectName+"){").append(ENTER);
  322. buffer.append("   try {").append(ENTER);
  323. buffer.append("      saveOrUpdate("+className+");").append(ENTER);
  324. buffer.append("   } catch (DaoAccessException e) {").append(ENTER);
  325. buffer.append("      e.printStackTrace();").append(ENTER);
  326. buffer.append("  }").append(ENTER);
  327. buffer.append("}");
  328. buffer.append("/**删除数据*/").append(ENTER);
  329. buffer.append(" public void deleteData(Long pk){").append(ENTER);
  330. buffer.append("   try {").append(ENTER);
  331. buffer.append("      delete(pk);").append(ENTER);
  332. buffer.append("   } catch (DaoAccessException e) {").append(ENTER);
  333. buffer.append("      e.printStackTrace();").append(ENTER);
  334. buffer.append("  }").append(ENTER);
  335. buffer.append("}");
  336. buffer.append(ENTER);
  337. buffer.append(ENTER);
  338. buffer.append("}");
  339. buffer.append(ENTER);
  340. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/impl/" + className + "DaoImpl.java", buffer.toString());
  341. }
  342. /***
  343. * 创建Service的接口
  344. * createServiceClass
  345. * @param table
  346. */
  347. public void createServiceClass(String table) {
  348. String className = getClassName(getTableConstantName(table));
  349. String objectName = StringUtils.uncapitalize(className);
  350. StringBuilder buffer = new StringBuilder();
  351. buffer.append("package " + ROOT_PACKAGE + ".service;");
  352. buffer.append("import java.io.Serializable;").append(ENTER);
  353. buffer.append("import java.util.List;").append(ENTER);
  354. buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
  355. buffer.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER);
  356. buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
  357. buffer.append(ENTER);
  358. buffer.append(ENTER);
  359. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  360. buffer.append(" * @Version:").append(Version).append(ENTER);
  361. buffer.append(" * @Description:").append(className).append(ENTER);
  362. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  363. buffer.append(ENTER);
  364. buffer.append("public interface " + className + "Service {");
  365. buffer.append("/**查询*/").append(ENTER);
  366. buffer.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER);
  367. buffer.append("/**保存数据*/").append(ENTER);
  368. buffer.append(" public void saveData("+className+" "+objectName+");").append(ENTER);
  369. buffer.append("/**更新数据*/").append(ENTER);
  370. buffer.append(" public void updateData("+className+" "+objectName+");").append(ENTER);
  371. buffer.append("/**删除数据*/").append(ENTER);
  372. buffer.append(" public void deleteData(Long pk);").append(ENTER);
  373. buffer.append(ENTER);
  374. buffer.append(ENTER);
  375. buffer.append("}");
  376. buffer.append(ENTER);
  377. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/" + className + "Service.java", buffer.toString());
  378. }
  379. /***
  380. * 创建Service层的实现类
  381. * 这里跟Dao的实现的都继承了EntityDaoSupport,主要是为了体现三层service分成的体验保留.
  382. * createServiceImplClass
  383. * @param table
  384. */
  385. public void createServiceImplClass(String table) {
  386. String className = getClassName(getTableConstantName(table));
  387. String objectName = StringUtils.uncapitalize(className);
  388. StringBuilder buffer = new StringBuilder();
  389. buffer.append("package " + ROOT_PACKAGE + ".service.impl;");
  390. buffer.append("import java.io.Serializable;").append(ENTER);
  391. buffer.append("import java.util.List;").append(ENTER);
  392. buffer.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER);
  393. buffer.append("import org.springframework.stereotype.Service;").append(ENTER);
  394. buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
  395. buffer.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER);
  396. buffer.append("import com.flong.modules.dao."+className+"Dao;").append(ENTER);
  397. buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
  398. buffer.append("import com.flong.modules.service."+className+"Service;").append(ENTER);
  399. buffer.append(ENTER);
  400. buffer.append(ENTER);
  401. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  402. buffer.append(" * @Version:").append(Version).append(ENTER);
  403. buffer.append(" * @Description:").append(className).append(ENTER);
  404. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  405. buffer.append(ENTER);
  406. buffer.append("@Service");
  407. buffer.append(ENTER);
  408. buffer.append("public class " + className + "ServiceImpl extends EntityDaoSupport  implements " + className + "Service {").append(ENTER);
  409. buffer.append("@Autowired "+className+"Dao "+objectName+"Dao;");
  410. buffer.append("/**查询*/").append(ENTER);
  411. buffer.append(" public List<"+className+"> list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER);
  412. buffer.append("     return "+objectName+"Dao.list(simplePage,"+objectName+");").append(ENTER);
  413. buffer.append("}").append(ENTER);//查询的结束{
  414. buffer.append("/**保存数据*/").append(ENTER);
  415. buffer.append(" public void saveData("+className+" "+objectName+"){").append(ENTER);
  416. buffer.append(    objectName+"Dao.saveData("+objectName+");").append(ENTER);
  417. buffer.append("}");
  418. buffer.append("/**更新数据*/").append(ENTER);
  419. buffer.append(" public void updateData("+className+" "+objectName+"){").append(ENTER);
  420. buffer.append(    objectName+"Dao.updateData("+objectName+");").append(ENTER);
  421. buffer.append("}");
  422. buffer.append("/**删除数据*/").append(ENTER);
  423. buffer.append(" public void deleteData(Long pk){").append(ENTER);
  424. buffer.append(    objectName+"Dao.deleteData(pk);").append(ENTER);
  425. buffer.append("}");
  426. buffer.append(ENTER);
  427. buffer.append(ENTER);
  428. buffer.append("}");
  429. buffer.append(ENTER);
  430. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/impl/" + className + "ServiceImpl.java", buffer.toString());
  431. }
  432. /***
  433. * 创建控制层类Controller
  434. * @param table
  435. */
  436. public void createControllerClass(String table){
  437. //类名
  438. String className = getClassName(getTableConstantName(table));
  439. //通过 org.apache.commons.lang3.StringUtils的uncapitalize方法把类名第一个字母转换成小写
  440. String objectName = StringUtils.uncapitalize(className);
  441. //通过 org.apache.commons.lang3.StringUtils的lowerCase方法把类名整个单词转化成小写然后为springmvc的路径返回jsp请求.
  442. String BASE_PATH="modules/"+StringUtils.lowerCase(className)+"/";//modules+模块名
  443. StringBuilder buffer = new StringBuilder();
  444. /*******处理这个导入需要的类*********/
  445. buffer.append("import java.util.List;").append(ENTER);
  446. buffer.append("import javax.servlet.http.HttpServletRequest;").append(ENTER);
  447. buffer.append("import javax.servlet.http.HttpServletResponse;").append(ENTER);
  448. buffer.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER);
  449. buffer.append("import org.springframework.stereotype.Controller;").append(ENTER);
  450. buffer.append("import org.springframework.web.bind.annotation.RequestMapping;").append(ENTER);
  451. buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
  452. buffer.append("import com.flong.commons.web.BaseController;").append(ENTER);
  453. buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
  454. buffer.append("import com.flong.modules.service."+className+"Service;").append(ENTER);
  455. buffer.append(ENTER);
  456. buffer.append(ENTER);
  457. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  458. buffer.append(" * @Version:").append(Version).append(ENTER);
  459. buffer.append(" * @Description:").append(className).append(ENTER);
  460. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  461. buffer.append(ENTER);
  462. buffer.append(ENTER);
  463. buffer.append("@Controller").append(ENTER);
  464. buffer.append("@RequestMapping(\""+StringUtils.lowerCase(className)+"\")");
  465. buffer.append(ENTER);
  466. buffer.append("public class " + className + "Controller extends BaseController {");
  467. buffer.append(ENTER);
  468. buffer.append(ENTER);
  469. buffer.append(" @Autowired "+className+"Service " +className+"Service");//注入Service层的接口Name
  470. buffer.append(ENTER);
  471. //创建一个默认的查询..
  472. buffer.append(ENTER);
  473. buffer.append("   @RequestMapping(value=\"list\")").append(ENTER);
  474. buffer.append("   public String list("+className+" "+objectName+",SimplePage simplePage ,HttpServletRequest request ,HttpServletResponse response){");
  475. buffer.append(ENTER);
  476. buffer.append("         List<"+className+"> list = "+className+"Service.list(simplePage, "+objectName+");");
  477. buffer.append(ENTER);
  478. buffer.append("      request.setAttribute(\""+objectName+"\", object);");
  479. buffer.append(ENTER);
  480. buffer.append("      request.setAttribute(\"page\", simplePage);");
  481. buffer.append(ENTER);
  482. buffer.append("      request.setAttribute(\"list\", list);");
  483. buffer.append(ENTER);
  484. buffer.append("      return \""+BASE_PATH+"list\";");
  485. buffer.append(ENTER);
  486. buffer.append("   }");
  487. buffer.append(ENTER);
  488. buffer.append("}");
  489. buffer.append(ENTER);
  490. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/controller/" + className + "Controller.java", buffer.toString());
  491. }
  492. /***
  493. * 创建JSP页面.
  494. * 以bootstrap3.x为主.
  495. * @param table
  496. */
  497. public void createJspView(String table)throws Exception{
  498. String tableConstantName = getTableConstantName(table);
  499. String className = getClassName(tableConstantName);//获取类名
  500. //通过 org.apache.commons.lang3.StringUtils的uncapitalize方法把类名第一个字母转换成小写
  501. String objectName = StringUtils.uncapitalize(className);
  502. StringBuilder buffer = new StringBuilder();
  503. buffer.append(" <%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\"  pageEncoding=\"UTF-8\"%>").append(ENTER);
  504. //这个就标注一下,这个taglib.jsp文件是JSTL的EL表达式,Spring 标签,自定义标签,等的文件。
  505. buffer.append("  <%@ include file=\"/WEB-INF/views/include/taglib.jsp\"%>").append(ENTER);
  506. buffer.append(" <!DOCTYPE htm>").append(ENTER);
  507. buffer.append(" <html>").append(ENTER);
  508. buffer.append(" <head>").append(ENTER);
  509. //添加一个插件公共的文件,这个我就不一一备注
  510. buffer.append("  <%@ include file=\"/WEB-INF/views/include/meta.jsp\"%>").append(ENTER);
  511. buffer.append("  <%@ include file=\"/WEB-INF/views/include/include.jsp\"%>").append(ENTER);
  512. buffer.append(" <title></title>").append(ENTER);
  513. /**=======================添加style===Begin====================**/
  514. buffer.append(" <style>").append(ENTER);
  515. buffer.append("     .breadcrumb{").append(ENTER);
  516. buffer.append("         background-color: #fff;").append(ENTER);
  517. buffer.append("     }").append(ENTER);
  518. buffer.append("     .form-search{").append(ENTER);
  519. buffer.append("         background-color: #fff;").append(ENTER);
  520. buffer.append(" }").append(ENTER);
  521. buffer.append(" .form-search1{").append(ENTER);
  522. buffer.append("         padding: 8px 15px;").append(ENTER);
  523. buffer.append("         background-color: #f5f5f5;").append(ENTER);
  524. buffer.append("     }").append(ENTER);
  525. buffer.append(" </style>").append(ENTER);
  526. buffer.append(" </head>").append(ENTER);
  527. /**=======================添加style===End====================**/
  528. buffer.append("<body>").append(ENTER);
  529. buffer.append("<ul class=\"nav nav-tabs\">").append(ENTER);
  530. buffer.append( "<li class=\"active\"><a href=\"${basePath}"+StringUtils.lowerCase(className)+"/list\">"+className+"列表</a></li>").append(ENTER);
  531. buffer.append("</ul>").append(ENTER);
  532. buffer.append( " <form:form id=\"searchForm\" modelAttribute=\""+className+"\" action=\"${basePath}"+StringUtils.lowerCase(className)+"/list\" method=\"post\" class=\"breadcrumb form-search form-inline\">").append(ENTER);
  533. buffer.append("  <div style=\"margin-bottom: 20px;\" class=\"form-search1\">").append(ENTER);
  534. //这里可以判断数据库的字段的类型做变量弄处理条件查询.
  535. for (Map<String, Object> col : getCols(table)) {
  536. //判断如果是数据库表的字段是DateTime类型的就设值My97DatePicker插件上,方便大家使用.
  537. if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
  538. buffer.append("<input id=\""+col.get(NAME).toString()+"\" name=\""+col.get(NAME).toString()+"\" type=\"text\" readonly=\"readonly\" maxlength=\"20\" class=\"Wdate\"").append(ENTER);
  539. //在这里用了$是为了查询的时候保留值.
  540. buffer.append(" value=\"<fmt:formatDate value=\"${"+className+"."+col.get(NAME).toString()+"}\" pattern=\"yyyy-MM-dd HH:mm:ss\"/>\"").append(ENTER);
  541. buffer.append(" onclick=\"WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:false});\"/>").append(ENTER);
  542. } else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
  543. //form:input是spring架构的input标签path必须要等于实体类要有的属性.否则会报错.placeholder是html5有的占位符的属性,
  544. //htmlEscape也是spring的有属性.在这个jar下面,因为我这个工程是用maven搭建的,所有拷贝的时候,拷贝的时候它带上路径.方便大家伙找jar,而且我在这的spring是用3.x
  545. //C:\Users\liangjilong\.m2\repository\org\springframework\org.springframework.web.servlet\3.1.1.RELEASE\org.springframework.web.servlet-3.1.1.RELEASE.jar
  546. //org.springframework.web.servlet-3.1.1.RELEASE.jar这个文件下面有一个spring-from.tld文件,可以找到path,htmlEscape等属性.
  547. buffer.append("   <label>"+col.get(NAME).toString()+" :</label><form:input path=\""+col.get(NAME).toString()+"\" htmlEscape=\"false\" maxlength=\"50\" class=\"input-medium form-control\" placeholder=\""+col.get(NAME).toString()+"\"/>").append(ENTER);
  548. }else{
  549. buffer.append("   <label>"+col.get(NAME).toString()+" :</label><form:input path=\""+col.get(NAME).toString()+"\" htmlEscape=\"false\" maxlength=\"50\" class=\"input-medium form-control\" placeholder=\""+col.get(NAME).toString()+"\"/>").append(ENTER);
  550. }
  551. buffer.append(ENTER);
  552. }
  553. //btn btn-info这个样式用过bootstrap的人都知道这个是.
  554. buffer.append("    &nbsp;<input id=\"btnSubmit\" class=\"btn btn-info\" type=\"submit\" value=\"查询\"/>").append(ENTER);
  555. buffer.append("  </div>").append(ENTER);
  556. buffer.append("<table id=\"contentTable\" class=\"table table-striped table-bordered table-hover\">").append(ENTER);
  557. buffer.append("<thead>").append(ENTER);//thead标签End
  558. buffer.append("<tr>").append(ENTER);//tr标签End
  559. /*******遍历列表的th的列*****/
  560. for (Map<String, Object> col : getTableRemarks(table)) {
  561. for (String k : col.keySet()){
  562. String colName = col.get(k).toString();
  563. buffer.append("<th>").append(colName).append("</th>");
  564. buffer.append(ENTER);
  565. }
  566. }
  567. buffer.append("<th>操作</th> ");
  568. buffer.append(ENTER);
  569. buffer.append("</tr>").append(ENTER);
  570. buffer.append("</thead>").append(ENTER);
  571. buffer.append("<tbody>").append(ENTER);
  572. /*******遍历列表的td的列*****/
  573. buffer.append("   <c:forEach items=\"${list}\" var=\""+objectName+"\" varStatus=\"row\">").append(ENTER);
  574. buffer.append("     <tr>").append(ENTER);
  575. buffer.append("     <td>${row.index+1 }</td>").append(ENTER);
  576. for (Map<String, Object> col : getCols(table)) {
  577. buffer.append("         <td>");
  578. if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
  579. //如果是Date类型就转换用EL表达式格式化fmt:formatDate
  580. buffer.append("<fmt:formatDate value=\"${"+objectName+"."+col.get(NAME).toString()+"}\"  type=\"date\" dateStyle=\"long\"/>");
  581. } else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
  582. buffer.append(" ${"+objectName+"."+col.get(NAME).toString()+"}" );
  583. }else{
  584. buffer.append(" ${"+objectName+"."+col.get(NAME).toString()+"}" );
  585. }
  586. buffer.append("</td>");
  587. buffer.append(ENTER);
  588. }
  589. buffer.append("    </tr>").append(ENTER);
  590. buffer.append("   </c:forEach>").append(ENTER);
  591. buffer.append("</tbody>").append(ENTER);//tbody标签结束.
  592. buffer.append("</table>").append(ENTER);
  593. //这个是pagination.jsp是分页文件.
  594. buffer.append("<%@ include file=\"/WEB-INF/views/include/pagination.jsp\"%>").append(ENTER);
  595. buffer.append("</form:form>").append(ENTER);//form:form标签结束.
  596. buffer.append("</body>").append(ENTER);//body标签结束.
  597. buffer.append("</html>").append(ENTER);//html标签结束.
  598. buffer.append(ENTER);
  599. buffer.append(ENTER);
  600. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/jsp/" + className + ".jsp", buffer.toString());
  601. }
  602. /***
  603. * 创建表的类定义常量
  604. * @param tables
  605. */
  606. public void createTableClass(List<String> tables) {
  607. StringBuilder buffer = new StringBuilder();
  608. buffer.append("package " + ROOT_PACKAGE + ".domain;");
  609. buffer.append(ENTER);
  610. buffer.append(ENTER);
  611. buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
  612. buffer.append(" * @Version:").append(Version).append(ENTER);
  613. buffer.append(" * @Email:").append(myEmail).append("\n*/");
  614. buffer.append(ENTER);
  615. buffer.append("public interface Table {");
  616. buffer.append(ENTER);
  617. for (String table : tables) {
  618. buffer.append(TAB);
  619. buffer.append("String " + getTableConstantName(table) + " = \"" + table.toUpperCase() + "\";");
  620. buffer.append(ENTER);
  621. }
  622. buffer.append(ENTER);
  623. buffer.append("}");
  624. buffer.append(ENTER);
  625. FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/domain/Table.java", buffer.toString());
  626. }
  627. /***
  628. * 获取数据库表名
  629. * @return
  630. * @throws Exception
  631. */
  632. public List<String> getTables() throws Exception {
  633. List<Object> params = new ArrayList<Object>();
  634. //System.out.println("==========="+DB_NAME);
  635. //params.add(DB_NAME);
  636. String dbname=DB_NAME;
  637. params.add(dbname);
  638. ResultSet rs = DBHelperUtils.query("select table_name from information_schema.tables where table_schema = ? order by table_name", params);
  639. List<String> tables = new ArrayList<String>();
  640. while (rs.next()) {
  641. tables.add(rs.getString(1));
  642. }
  643. return tables;
  644. }
  645. /***
  646. * 列名 类型 => 说明
  647. * TABLE_CAT String => 表 catalog
  648. * TABLE_SCHEM String => 表 schema
  649. * TABLE_NAME String => 表名
  650. * TABLE_TYPE String => 表类型
  651. * REMARKS String => 表注释
  652. * 获取表的列
  653. * @param table
  654. * @return
  655. * @throws Exception
  656. */
  657. private List<Map<String, Object>> getCols(String table) throws Exception {
  658. List<Map<String, Object>> cols = new ArrayList<Map<String,Object>>();
  659. ResultSetMetaData md = DBHelperUtils.query("select * from " + table + " where 1 = 2", null).getMetaData();
  660. for (int i = 1; i <= md.getColumnCount(); i++) {
  661. Map<String, Object> col = new HashMap<String, Object>();
  662. cols.add(col);
  663. col.put(NAME, md.getColumnName(i));
  664. col.put(CLASS, md.getColumnClassName(i));
  665. col.put(SIZE, md.getColumnDisplaySize(i));
  666. col.put(REMARKS, md.getColumnName(i));
  667. /*  System.out.println("1"+ md.getCatalogName(i));
  668. System.out.println("2"+ md.getColumnClassName(i));
  669. System.out.println("3"+ md.getColumnDisplaySize(i));
  670. System.out.println("4"+ md.getColumnType(i));
  671. System.out.println("5"+ md.getSchemaName(i));
  672. System.out.println("6"+ md.getPrecision(i));
  673. System.out.println("7"+ md.getScale(i));*/
  674. String _type = null;
  675. String type = md.getColumnTypeName(i);
  676. if(type.equals("INT")) {
  677. _type = "INTEGER";
  678. } else if(type.equals("DATETIME")) {
  679. _type = "TIMESTAMP";
  680. } else {
  681. _type = type;
  682. }
  683. col.put(TYPE, _type);
  684. }
  685. return cols;
  686. }
  687. /**
  688. * 获取所有表
  689. * @param conn
  690. * @throws SQLException
  691. */
  692. public static   List<Map<String, Object>> getAllTable() throws SQLException {
  693. /**
  694. * 定义一个Lis
  695. */
  696. List<Map<String, Object>> cols = new ArrayList<Map<String,Object>>();
  697. DatabaseMetaData metaData = DBHelperUtils.getInstance().getDatabaseMetaData();
  698. //这个是获取所有表.
  699. ResultSet rs = metaData.getTables(null, "%", "%", new String[] {"TABLE"});
  700. while (rs.next()) {
  701. String tableName = rs.getString("TABLE_NAME");////这个是获取表名
  702. if(tableName!=null){
  703. Map<String, Object> col = new HashMap<String, Object>();
  704. // rs =getConnection.getMetaData().getColumns(null, getXMLConfig.getSchema(),tableName.toUpperCase(), "%");
  705. //其他数据库不需要这个方法的,直接传null,这个是oracle和db2这么用
  706. ResultSet rs1 = metaData.getColumns(null, "%", tableName, "%");
  707. while(rs1.next()){
  708. String COLUMN_NAME = rs1.getString("COLUMN_NAME");
  709. String REMARKS = rs1.getString("REMARKS");
  710. //先判断备注是否为空,不为空就取表的字段的注释说明,否则的话就去字段列名
  711. if(REMARKS==null||REMARKS==""){
  712. col.put(COLUMN_NAME, COLUMN_NAME);
  713. }else{
  714. col.put(REMARKS, REMARKS);
  715. }
  716. cols.add(col);
  717. }
  718. }
  719. }
  720. return cols;
  721. }
  722. /***
  723. * 获取列的备注
  724. * @param table
  725. * @return
  726. * @throws SQLException
  727. */
  728. public static List<Map<String, Object>> getTableRemarks(String table) throws SQLException {
  729. List<Map<String, Object>> cols = new ArrayList<Map<String,Object>>();
  730. Connection conn=DBHelperUtils.getInstance().getConnection();
  731. DatabaseMetaData metaData = conn.getMetaData();
  732. ResultSet rs = metaData.getTables(null, "%", "%", new String[] {"TABLE"});
  733. while (rs.next()) {
  734. String tableName = rs.getString("TABLE_NAME");
  735. //传进来的表名和查询出来的表名作对比,并且是忽略大小写
  736. if(tableName!=null){
  737. if(table.equalsIgnoreCase(tableName)){
  738. Map<String, Object> col = new HashMap<String, Object>();
  739. //Map<String, Object> col = new HashTable<String, Object>();
  740. ResultSet rs1 = metaData.getColumns(null, "%", tableName, "%");
  741. while(rs1.next()){
  742. String COLUMN_NAME = rs1.getString("COLUMN_NAME");
  743. String REMARKS = rs1.getString("REMARKS");
  744. //先判断备注是否为空,不为空就取表的字段的注释说明,否则的话就去字段列名
  745. if(REMARKS==null||REMARKS==""){
  746. col.put(COLUMN_NAME, COLUMN_NAME);
  747. }else{
  748. col.put(REMARKS, REMARKS);
  749. }
  750. //去掉重复的数据
  751. col = removeRepeatData();
  752. cols.add(col);
  753. }
  754. break;
  755. }
  756. }
  757. }
  758. return cols;
  759. }
  760. /**
  761. * 获取表的主键.
  762. * @param tableName
  763. */
  764. public static String getTablePrimaryKeys(String tableName)throws Exception{
  765. DatabaseMetaData metaData = DBHelperUtils.getInstance().getDatabaseMetaData();
  766. ResultSet pkRSet = metaData.getPrimaryKeys(null, null, tableName);
  767. String primaryKey = "";
  768. if(pkRSet.next() ) {
  769. //把这个列的名称获取出来
  770. primaryKey = pkRSet.getString("PK_NAME");//PK_NAME/COLUMN_NAME
  771. primaryKey=(primaryKey==null?"":primaryKey);
  772. System.out.println(primaryKey);
  773. }
  774. return primaryKey;
  775. }
  776. /**
  777. * 获取表的主键和外键包括外键表的名
  778. * @param tableName
  779. */
  780. public static String[] getTablePrimaryKeyForeignKey(String tableName)throws Exception{
  781. DatabaseMetaData metaData = DBHelperUtils.getInstance().getDatabaseMetaData();
  782. ResultSet fkSet = metaData.getPrimaryKeys(null, null, tableName);
  783. String pkColumnName="",fkColumnName="",pkTablenName="";
  784. String [] paramsKey= new String[3];
  785. while(fkSet.next()){
  786. pkColumnName = fkSet.getString("PK_NAME");//主键在网查到的有可能是PKCOLUMN_NAME
  787. fkColumnName = fkSet.getString("FK_NAME");//外键网查到的有可能是PKCOLUMN_NAME
  788. pkTablenName = fkSet.getString("PKTABLE_NAME");//主键表名
  789. //System.out.println(pkColumnName+fkColumnName+pkTablenName);
  790. pkColumnName=(pkColumnName==null?"":pkColumnName);
  791. fkColumnName=(fkColumnName==null?"":fkColumnName);
  792. pkTablenName=(pkTablenName==null?"":pkTablenName);
  793. paramsKey[0]=fkColumnName;
  794. paramsKey[1]=fkColumnName;
  795. paramsKey[2]=pkTablenName;
  796. }
  797. return paramsKey;
  798. }
  799. /***
  800. * 去掉重复的数据
  801. * @return
  802. */
  803. private static Map<String, Object> removeRepeatData() {
  804. Map<String, Object> col = new HashMap<String, Object>();
  805. Set<String> keySet = col.keySet();
  806. for (String str : keySet) {
  807. col.put(str, str);
  808. }
  809. return col;
  810. }
  811. /***
  812. * 获取表的常量名,一般是在数据库建表的时候,写的注释..
  813. * @param table
  814. * @return
  815. */
  816. private String getTableConstantName(String table) {
  817. String tableConstantName = table.toUpperCase();
  818. for (String item : IGNORE_TABLE_PREFIX) {
  819. tableConstantName = tableConstantName.replaceAll("^" + item.toUpperCase(), "");
  820. }
  821. return tableConstantName;
  822. }
  823. /***
  824. * 获取类的名
  825. * @param name
  826. * @return
  827. */
  828. private String getClassName(String name) {
  829. String[] names = name.split("_");
  830. StringBuilder sb = new StringBuilder();
  831. for (String n : names) {
  832. if(n.length() == 0) {
  833. sb.append("_");
  834. } else {
  835. sb.append(n.substring(0, 1).toUpperCase());
  836. if(n.length() > 1) {
  837. sb.append(n.substring(1).toLowerCase());
  838. }
  839. }
  840. }
  841. return sb.toString();
  842. }
  843. /**
  844. * 获取字段名
  845. * @param name
  846. * @return
  847. */
  848. private String getFieldName(String name) {
  849. String _name = getClassName(name);
  850. return _name.substring(0, 1).toLowerCase() + _name.substring(1);
  851. }
  852. /**
  853. * 转换成泛型Map
  854. * @param limit
  855. * @param rs
  856. * @return
  857. * @throws SQLException
  858. */
  859. public static List<Map> toListMap(int limit, ResultSet rs)throws SQLException {
  860. ResultSetMetaData rsmd = rs.getMetaData();
  861. int count = 0;
  862. List list = new ArrayList();
  863. while (rs.next()) {
  864. Map row = new HashMap();
  865. for (int i = 1; i <= rsmd.getColumnCount(); i++) {
  866. row.put(rsmd.getColumnName(i), rs.getObject(i));
  867. }
  868. list.add(row);
  869. count++;
  870. if (count >= limit) {
  871. break;
  872. }
  873. }
  874. return list;
  875. }
  876. /***
  877. * 获取查询list
  878. * @param conn
  879. * @param sql
  880. * @param limit
  881. * @return
  882. * @throws SQLException
  883. */
  884. public static List<Map> queryForList(Connection conn, String sql, int limit)throws SQLException {
  885. PreparedStatement ps = conn.prepareStatement(sql.trim());
  886. ps.setMaxRows(limit);
  887. ps.setFetchDirection(1000);
  888. ResultSet rs = ps.executeQuery();
  889. return toListMap(limit, rs);
  890. }
  891. /***
  892. * 获取查询list
  893. * @param conn
  894. * @param sql
  895. * @param limit
  896. * @return
  897. * @throws SQLException
  898. */
  899. public static List<Map> queryForList(String sql, int limit) throws SQLException {
  900. Connection conn = DBHelperUtils.getConnection();
  901. return queryForList(conn, sql, limit);
  902. }
  903. /***
  904. * 生成所有Entity,Dao,Service,Controller,JSP 代码
  905. * @throws Exception
  906. */
  907. public void createAllCodeGenerator()throws Exception{
  908. List<String> tables = getTables();
  909. for (String table : tables) {
  910. createEntityClass(table);//this is method create Entity
  911. createDaoClass(table);//this is method create  Dao Interface
  912. createDaoImplClass(table);//this is method create Dao implement
  913. createServiceClass(table);//this is method create Service Interface
  914. createServiceImplClass(table);//this is method create Service implement
  915. createControllerClass(table);//this is method create Controller
  916. createJspView(table);//this is method JspView
  917. }
  918. createTableClass(tables);
  919. }
  920. public static void main(String[] args)throws Exception {
  921. String sql="select * from SYS_MENU ";
  922. //List<Map> queryForList = queryForList(sql, 1000);
  923. /*for(Map m:queryForList){
  924. System.out.println("======"+m);
  925. }*/
  926. String tableName = "SYS_MENU";//表名
  927. /*    List<Map<String, Object>> tableRemarks = getTableRemarks(tableName);
  928. int i=0;
  929. for (Map<String, Object> col : getTableRemarks(tableName)) {
  930. Set<String> keySet = col.keySet();
  931. for (Object str : keySet) {
  932. //System.out.println(str);
  933. }
  934. }
  935. */
  936. //getTablePrimaryKeys("test");
  937. //new CodeGenerator().createJspView("sup_email");
  938. new CodeGenerator().createEntityClass("test");
  939. //new CodeGenerator().getTablePrimaryKeyForeignKey("test");
  940. //String myId="My_id";
  941. //boolean endsWith = myId.toString().toUpperCase().endsWith("_ID");
  942. //if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID"))
  943. //if(endsWith){
  944. //System.out.println(11111);
  945. //}
  946. //createAllCodeGenerator();
  947. }
  948. }
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.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映射关系方案占优势.比如优化性能/维护/灵活性更加好等.
  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
  • 此程序以MySQL为主,未实现其他数据库.此程序可以再优化的,为了有些初学者,就不作太多的处理和优化.一些高手会编程更好的生
  • 成器,此程序只提供参考和学习,如有什么问题,可以多指出.共同学习和进步.谢谢!~
  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    */

    @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&lt;String&gt; IGNORE_TABLE_PREFIX = new ArrayList&lt;String&gt;(); /*******定义代码块*******/
static {
String ignoreTablePrefix = PropertiesHelper.getValueByKey("ignoreTablePrefix");
if(ignoreTablePrefix.length() &gt; 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 buffer = new StringBuilder();
buffer.append("package " + ROOT_PACKAGE + ".entity;").append(ENTER);
buffer.append("import java.util.Date;").append(ENTER);
buffer.append("import com.flong.commons.persistence.Entity;").append(ENTER);
buffer.append("import com.flong.commons.persistence.annotation.Column;").append(ENTER);
buffer.append("import com.flong.commons.persistence.annotation.Id;").append(ENTER);
buffer.append("import com.flong.commons.persistence.annotation.Relation;").append(ENTER);
buffer.append("import com.flong.commons.persistence.annotation.Table;").append(ENTER);
buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Description:").append(className).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER);
buffer.append("@Relation(" + className + ".TABLE)");
buffer.append(ENTER);
buffer.append("public class " + className + " extends Entity {");
buffer.append(ENTER);
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("/** 表名常量 */");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("public static final String TABLE = Table." + tableConstantName + ";");
buffer.append(ENTER);
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("/**");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append(" * 列名常量");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append(" */");
buffer.append(ENTER);
for (Map&lt;String, Object&gt; col : getCols(table)) {
String colName = col.get(NAME).toString().toUpperCase();
buffer.append(TAB);//生成字段变量
buffer.append("public static final String COL_" + colName + " = \"" + colName + "\";//"+col.get(REMARKS));
buffer.append(ENTER);
}
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("/**");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append(" * 列属性");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append(" */"); String tablePrimaryKeys = getTablePrimaryKeys(table);//如果是主键 //if(col.get(NAME).toString().equalsIgnoreCase("ID")) {
if(tablePrimaryKeys!=null){
buffer.append(ENTER+TAB); //如果主键不为空的时候就给一个@Id注解.
//如果是hibernate的可以给其他的注解,如@GeneratedValue(strategy = GenerationType.IDENTITY) @SequenceGenerator等
//并要在包的下面头部导入
//import javax.persistence.Column;
//import javax.persistence.Entity;
//import javax.persistence.GeneratedValue;
//import javax.persistence.GenerationType;
//import javax.persistence.Id;
//import javax.persistence.Table;
buffer.append("@Id");
//这里不赋值给,因为下面这个for循环有一个.
//sb.append("@Column(COL_" + tablePrimaryKeys + ")");
}
for (Map&lt;String, Object&gt; col : getCols(table)) {
buffer.append(TAB);
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("@Column(COL_" + col.get(NAME).toString().toUpperCase() + ")");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("private ");
//这行代码的意思就是说,如果找到数据库表的字段是为ID的时候,或后缀有_ID的就认为是主键,并且忽略大小写就给一个Long
//在实际过程中应该判断是它的字段是不是为了PrimaryKey才设为Long才适合.
//if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID")) {
if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
buffer.append("Date");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
buffer.append(col.get(CLASS));
} else {
buffer.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
}
//sb.append(" " + getFieldName(col.get(NAME).toString()) + ";");
buffer.append(" " + col.get(NAME).toString() + ";");
buffer.append(ENTER);
}
buffer.append(ENTER);
for (Map&lt;String, Object&gt; col : getCols(table)){
buffer.append(TAB);
buffer.append("public ");
if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
buffer.append("Date");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
buffer.append(col.get(CLASS));
} else {
buffer.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
}
buffer.append(" ").append("get").append(col.get(NAME).toString().replaceFirst("\\b(\\w)|\\s(\\w)", col.get(NAME).toString().substring(0,1).toUpperCase()));
buffer.append("() {");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append(TAB);
buffer.append("return ").append(col.get(NAME).toString()).append(";");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("}");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("public void ").append("set").append(col.get(NAME).toString().replaceFirst("\\b(\\w)|\\s(\\w)", col.get(NAME).toString().substring(0,1).toUpperCase()));
buffer.append("(");
if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
buffer.append("Date");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
buffer.append(col.get(CLASS));
} else {
buffer.append(Class.forName(col.get(CLASS).toString()).getSimpleName());
}
buffer.append(" ").append(col.get(NAME).toString());
buffer.append(") {");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append(TAB);
buffer.append("this.").append(col.get(NAME).toString()).append(" = ").append(col.get(NAME).toString()).append(";");
buffer.append(ENTER);
buffer.append(TAB);
buffer.append("}");
buffer.append(ENTER);
}
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/entity/" + className + ".java", buffer.toString());
} /***
* 生成dao接口interface类的代码
* @param table
* @throws Exception
*/
public void createDaoClass(String table) throws Exception {
String className = getClassName(getTableConstantName(table)); String objectName = StringUtils.uncapitalize(className); StringBuilder buffer = new StringBuilder();
buffer.append("package " + ROOT_PACKAGE + ".dao;").append(ENTER);
buffer.append("import java.io.Serializable;").append(ENTER);
buffer.append("import java.util.List;").append(ENTER);
buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
buffer.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER);
buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Description:").append(className).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER); buffer.append("public interface " + className + "Dao extends EntityDao&lt;" + className + "&gt; {").append(ENTER); buffer.append("/**查询*/").append(ENTER);
buffer.append(" public List&lt;"+className+"&gt; list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER); buffer.append("/**保存数据*/").append(ENTER);
buffer.append(" public void saveData("+className+" "+objectName+");").append(ENTER); buffer.append("/**更新数据*/").append(ENTER); buffer.append(" public void updateData("+className+" "+objectName+");").append(ENTER); buffer.append("/**删除数据*/").append(ENTER); buffer.append(" public void deleteData(Long pk);").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/" + className + "Dao.java", buffer.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 buffer = new StringBuilder();
buffer.append("package " + ROOT_PACKAGE + ".dao.impl;").append(ENTER);
buffer.append("import java.io.Serializable;").append(ENTER);
buffer.append("import org.apache.commons.lang3.StringUtils;").append(ENTER);
buffer.append("import org.springframework.stereotype.Repository;").append(ENTER);
buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
buffer.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER);
buffer.append("import com.flong.modules.dao."+className+"Dao;").append(ENTER);
buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Description:").append(className).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER);
buffer.append("@Repository");//这个是spring的注解
buffer.append(ENTER);
buffer.append("public class " + className + "DaoImpl extends EntityDaoSupport&lt;" + className + "&gt; implements " + className + "Dao {"); buffer.append("/**查询*/").append(ENTER);
buffer.append(" public List&lt;"+className+"&gt; list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER); buffer.append(ENTER); String mergeField= "";//合并字段. //--遍历获取列,并拼接字符串,SQL的查询列,查询不建议用*去查询表的所有列.
for (Map&lt;String, Object&gt; col : getCols(table)){ //
if(col.get(NAME).toString()!=null){
mergeField +=col.get(NAME).toString()+",";//合并字段并用,隔开字段名
}
}
//去掉最后一个,号然后拼接成一个完成的select查询字段
if(mergeField!=null){
mergeField = mergeField.substring(0, mergeField.length()-1);
} buffer.append(" String sql = ").append("\" select "+mergeField+" from ").append(tableName).append(" where 1=1 \" ").append(ENTER);//这个TABLE是实体类的变量
//daoQuery这个是底层封装的一个接口,自个可以更加自己需求封装.
buffer.append(" List&lt;"+className+"&gt; list= daoQuery.query(sql,"+className+".class,simplePage);").append(ENTER);
buffer.append(" return list;").append(ENTER); buffer.append("}").append(ENTER);//查询的结束{ buffer.append("/**保存数据*/").append(ENTER);
buffer.append(" public void saveData("+className+" "+objectName+"){").append(ENTER);
buffer.append(" try {").append(ENTER);
buffer.append(" saveOrUpdate("+className+");").append(ENTER);
buffer.append(" } catch (DaoAccessException e) {").append(ENTER);
buffer.append(" e.printStackTrace();").append(ENTER);
buffer.append(" }").append(ENTER); buffer.append("}"); buffer.append("/**更新数据*/").append(ENTER); buffer.append(" public void updateData("+className+" "+objectName+"){").append(ENTER); buffer.append(" try {").append(ENTER);
buffer.append(" saveOrUpdate("+className+");").append(ENTER);
buffer.append(" } catch (DaoAccessException e) {").append(ENTER);
buffer.append(" e.printStackTrace();").append(ENTER);
buffer.append(" }").append(ENTER); buffer.append("}"); buffer.append("/**删除数据*/").append(ENTER);
buffer.append(" public void deleteData(Long pk){").append(ENTER); buffer.append(" try {").append(ENTER);
buffer.append(" delete(pk);").append(ENTER);
buffer.append(" } catch (DaoAccessException e) {").append(ENTER);
buffer.append(" e.printStackTrace();").append(ENTER);
buffer.append(" }").append(ENTER); buffer.append("}"); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/dao/impl/" + className + "DaoImpl.java", buffer.toString());
} /***
* 创建Service的接口
* createServiceClass
* @param table
*/
public void createServiceClass(String table) { String className = getClassName(getTableConstantName(table));
String objectName = StringUtils.uncapitalize(className); StringBuilder buffer = new StringBuilder(); buffer.append("package " + ROOT_PACKAGE + ".service;"); buffer.append("import java.io.Serializable;").append(ENTER);
buffer.append("import java.util.List;").append(ENTER);
buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
buffer.append("import com.flong.commons.persistence.dao.EntityDao;").append(ENTER);
buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Description:").append(className).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER);
buffer.append("public interface " + className + "Service {"); buffer.append("/**查询*/").append(ENTER);
buffer.append(" public List&lt;"+className+"&gt; list(SimplePage simplePage,"+className+" "+objectName+");").append(ENTER); buffer.append("/**保存数据*/").append(ENTER);
buffer.append(" public void saveData("+className+" "+objectName+");").append(ENTER); buffer.append("/**更新数据*/").append(ENTER); buffer.append(" public void updateData("+className+" "+objectName+");").append(ENTER); buffer.append("/**删除数据*/").append(ENTER); buffer.append(" public void deleteData(Long pk);").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/" + className + "Service.java", buffer.toString()); } /***
* 创建Service层的实现类
* 这里跟Dao的实现的都继承了EntityDaoSupport,主要是为了体现三层service分成的体验保留.
* createServiceImplClass
* @param table
*/
public void createServiceImplClass(String table) { String className = getClassName(getTableConstantName(table)); String objectName = StringUtils.uncapitalize(className); StringBuilder buffer = new StringBuilder(); buffer.append("package " + ROOT_PACKAGE + ".service.impl;");
buffer.append("import java.io.Serializable;").append(ENTER);
buffer.append("import java.util.List;").append(ENTER);
buffer.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER);
buffer.append("import org.springframework.stereotype.Service;").append(ENTER);
buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
buffer.append("import com.flong.commons.persistence.dao.impl.EntityDaoSupport;").append(ENTER);
buffer.append("import com.flong.modules.dao."+className+"Dao;").append(ENTER);
buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
buffer.append("import com.flong.modules.service."+className+"Service;").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Description:").append(className).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER);
buffer.append("@Service");
buffer.append(ENTER);
buffer.append("public class " + className + "ServiceImpl extends EntityDaoSupport implements " + className + "Service {").append(ENTER);
buffer.append("@Autowired "+className+"Dao "+objectName+"Dao;"); buffer.append("/**查询*/").append(ENTER);
buffer.append(" public List&lt;"+className+"&gt; list(SimplePage simplePage,"+className+" "+objectName+"){").append(ENTER);
buffer.append(" return "+objectName+"Dao.list(simplePage,"+objectName+");").append(ENTER);
buffer.append("}").append(ENTER);//查询的结束{ buffer.append("/**保存数据*/").append(ENTER);
buffer.append(" public void saveData("+className+" "+objectName+"){").append(ENTER); buffer.append( objectName+"Dao.saveData("+objectName+");").append(ENTER);
buffer.append("}"); buffer.append("/**更新数据*/").append(ENTER); buffer.append(" public void updateData("+className+" "+objectName+"){").append(ENTER);
buffer.append( objectName+"Dao.updateData("+objectName+");").append(ENTER); buffer.append("}");
buffer.append("/**删除数据*/").append(ENTER); buffer.append(" public void deleteData(Long pk){").append(ENTER);
buffer.append( objectName+"Dao.deleteData(pk);").append(ENTER);
buffer.append("}"); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/service/impl/" + className + "ServiceImpl.java", buffer.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 buffer = new StringBuilder();
/*******处理这个导入需要的类*********/
buffer.append("import java.util.List;").append(ENTER);
buffer.append("import javax.servlet.http.HttpServletRequest;").append(ENTER);
buffer.append("import javax.servlet.http.HttpServletResponse;").append(ENTER);
buffer.append("import org.springframework.beans.factory.annotation.Autowired;").append(ENTER);
buffer.append("import org.springframework.stereotype.Controller;").append(ENTER);
buffer.append("import org.springframework.web.bind.annotation.RequestMapping;").append(ENTER);
buffer.append("import com.flong.commons.persistence.bean.SimplePage;").append(ENTER);
buffer.append("import com.flong.commons.web.BaseController;").append(ENTER);
buffer.append("import com.flong.modules.pojo."+className+";").append(ENTER);
buffer.append("import com.flong.modules.service."+className+"Service;").append(ENTER); buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Description:").append(className).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("@Controller").append(ENTER);
buffer.append("@RequestMapping(\""+StringUtils.lowerCase(className)+"\")");
buffer.append(ENTER);
buffer.append("public class " + className + "Controller extends BaseController {");
buffer.append(ENTER);
buffer.append(ENTER);
buffer.append(" @Autowired "+className+"Service " +className+"Service");//注入Service层的接口Name
buffer.append(ENTER); //创建一个默认的查询..
buffer.append(ENTER);
buffer.append(" @RequestMapping(value=\"list\")").append(ENTER);
buffer.append(" public String list("+className+" "+objectName+",SimplePage simplePage ,HttpServletRequest request ,HttpServletResponse response){");
buffer.append(ENTER);
buffer.append(" List&lt;"+className+"&gt; list = "+className+"Service.list(simplePage, "+objectName+");");
buffer.append(ENTER);
buffer.append(" request.setAttribute(\""+objectName+"\", object);");
buffer.append(ENTER);
buffer.append(" request.setAttribute(\"page\", simplePage);");
buffer.append(ENTER);
buffer.append(" request.setAttribute(\"list\", list);");
buffer.append(ENTER);
buffer.append(" return \""+BASE_PATH+"list\";");
buffer.append(ENTER);
buffer.append(" }"); buffer.append(ENTER);
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/controller/" + className + "Controller.java", buffer.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 buffer = new StringBuilder(); buffer.append(" &lt;%@ page language=\"java\" contentType=\"text/html; charset=UTF-8\" pageEncoding=\"UTF-8\"%&gt;").append(ENTER);
//这个就标注一下,这个taglib.jsp文件是JSTL的EL表达式,Spring 标签,自定义标签,等的文件。
buffer.append(" &lt;%@ include file=\"/WEB-INF/views/include/taglib.jsp\"%&gt;").append(ENTER);
buffer.append(" &lt;!DOCTYPE htm&gt;").append(ENTER);
buffer.append(" &lt;html&gt;").append(ENTER);
buffer.append(" &lt;head&gt;").append(ENTER);
//添加一个插件公共的文件,这个我就不一一备注
buffer.append(" &lt;%@ include file=\"/WEB-INF/views/include/meta.jsp\"%&gt;").append(ENTER);
buffer.append(" &lt;%@ include file=\"/WEB-INF/views/include/include.jsp\"%&gt;").append(ENTER);
buffer.append(" &lt;title&gt;&lt;/title&gt;").append(ENTER);
/**=======================添加style===Begin====================**/
buffer.append(" &lt;style&gt;").append(ENTER);
buffer.append(" .breadcrumb{").append(ENTER);
buffer.append(" background-color: #fff;").append(ENTER);
buffer.append(" }").append(ENTER);
buffer.append(" .form-search{").append(ENTER);
buffer.append(" background-color: #fff;").append(ENTER);
buffer.append(" }").append(ENTER);
buffer.append(" .form-search1{").append(ENTER);
buffer.append(" padding: 8px 15px;").append(ENTER);
buffer.append(" background-color: #f5f5f5;").append(ENTER);
buffer.append(" }").append(ENTER);
buffer.append(" &lt;/style&gt;").append(ENTER);
buffer.append(" &lt;/head&gt;").append(ENTER);
/**=======================添加style===End====================**/ buffer.append("&lt;body&gt;").append(ENTER);
buffer.append("&lt;ul class=\"nav nav-tabs\"&gt;").append(ENTER);
buffer.append( "&lt;li class=\"active\"&gt;&lt;a href=\"${basePath}"+StringUtils.lowerCase(className)+"/list\"&gt;"+className+"列表&lt;/a&gt;&lt;/li&gt;").append(ENTER);
buffer.append("&lt;/ul&gt;").append(ENTER);
buffer.append( " &lt;form:form id=\"searchForm\" modelAttribute=\""+className+"\" action=\"${basePath}"+StringUtils.lowerCase(className)+"/list\" method=\"post\" class=\"breadcrumb form-search form-inline\"&gt;").append(ENTER);
buffer.append(" &lt;div style=\"margin-bottom: 20px;\" class=\"form-search1\"&gt;").append(ENTER); //这里可以判断数据库的字段的类型做变量弄处理条件查询. for (Map&lt;String, Object&gt; col : getCols(table)) { //判断如果是数据库表的字段是DateTime类型的就设值My97DatePicker插件上,方便大家使用.
if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
buffer.append("&lt;input id=\""+col.get(NAME).toString()+"\" name=\""+col.get(NAME).toString()+"\" type=\"text\" readonly=\"readonly\" maxlength=\"20\" class=\"Wdate\"").append(ENTER);
//在这里用了$是为了查询的时候保留值.
buffer.append(" value=\"&lt;fmt:formatDate value=\"${"+className+"."+col.get(NAME).toString()+"}\" pattern=\"yyyy-MM-dd HH:mm:ss\"/&gt;\"").append(ENTER);
buffer.append(" onclick=\"WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:false});\"/&gt;").append(ENTER);
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
//form:input是spring架构的input标签path必须要等于实体类要有的属性.否则会报错.placeholder是html5有的占位符的属性,
//htmlEscape也是spring的有属性.在这个jar下面,因为我这个工程是用maven搭建的,所有拷贝的时候,拷贝的时候它带上路径.方便大家伙找jar,而且我在这的spring是用3.x
//C:\Users\liangjilong\.m2\repository\org\springframework\org.springframework.web.servlet\3.1.1.RELEASE\org.springframework.web.servlet-3.1.1.RELEASE.jar
//org.springframework.web.servlet-3.1.1.RELEASE.jar这个文件下面有一个spring-from.tld文件,可以找到path,htmlEscape等属性.
buffer.append(" &lt;label&gt;"+col.get(NAME).toString()+" :&lt;/label&gt;&lt;form:input path=\""+col.get(NAME).toString()+"\" htmlEscape=\"false\" maxlength=\"50\" class=\"input-medium form-control\" placeholder=\""+col.get(NAME).toString()+"\"/&gt;").append(ENTER);
}else{
buffer.append(" &lt;label&gt;"+col.get(NAME).toString()+" :&lt;/label&gt;&lt;form:input path=\""+col.get(NAME).toString()+"\" htmlEscape=\"false\" maxlength=\"50\" class=\"input-medium form-control\" placeholder=\""+col.get(NAME).toString()+"\"/&gt;").append(ENTER);
}
buffer.append(ENTER);
}
//btn btn-info这个样式用过bootstrap的人都知道这个是.
buffer.append(" &amp;nbsp;&lt;input id=\"btnSubmit\" class=\"btn btn-info\" type=\"submit\" value=\"查询\"/&gt;").append(ENTER);
buffer.append(" &lt;/div&gt;").append(ENTER); buffer.append("&lt;table id=\"contentTable\" class=\"table table-striped table-bordered table-hover\"&gt;").append(ENTER);
buffer.append("&lt;thead&gt;").append(ENTER);//thead标签End
buffer.append("&lt;tr&gt;").append(ENTER);//tr标签End
/*******遍历列表的th的列*****/
for (Map&lt;String, Object&gt; col : getTableRemarks(table)) {
for (String k : col.keySet()){
String colName = col.get(k).toString();
buffer.append("&lt;th&gt;").append(colName).append("&lt;/th&gt;");
buffer.append(ENTER);
}
}
buffer.append("&lt;th&gt;操作&lt;/th&gt; ");
buffer.append(ENTER); buffer.append("&lt;/tr&gt;").append(ENTER);
buffer.append("&lt;/thead&gt;").append(ENTER); buffer.append("&lt;tbody&gt;").append(ENTER); /*******遍历列表的td的列*****/
buffer.append(" &lt;c:forEach items=\"${list}\" var=\""+objectName+"\" varStatus=\"row\"&gt;").append(ENTER);
buffer.append(" &lt;tr&gt;").append(ENTER);
buffer.append(" &lt;td&gt;${row.index+1 }&lt;/td&gt;").append(ENTER); for (Map&lt;String, Object&gt; col : getCols(table)) {
buffer.append(" &lt;td&gt;");
if(Class.forName(col.get(CLASS).toString()).isAssignableFrom(Date.class) || Class.forName(col.get(CLASS).toString()) == Timestamp.class) {
//如果是Date类型就转换用EL表达式格式化fmt:formatDate
buffer.append("&lt;fmt:formatDate value=\"${"+objectName+"."+col.get(NAME).toString()+"}\" type=\"date\" dateStyle=\"long\"/&gt;");
} else if(getClassName(col.get(NAME).toString()).equals(Class.forName(col.get(CLASS).toString()).getSimpleName())) {
buffer.append(" ${"+objectName+"."+col.get(NAME).toString()+"}" );
}else{
buffer.append(" ${"+objectName+"."+col.get(NAME).toString()+"}" );
}
buffer.append("&lt;/td&gt;");
buffer.append(ENTER);
} buffer.append(" &lt;/tr&gt;").append(ENTER);
buffer.append(" &lt;/c:forEach&gt;").append(ENTER);
buffer.append("&lt;/tbody&gt;").append(ENTER);//tbody标签结束. buffer.append("&lt;/table&gt;").append(ENTER);
//这个是pagination.jsp是分页文件.
buffer.append("&lt;%@ include file=\"/WEB-INF/views/include/pagination.jsp\"%&gt;").append(ENTER);
buffer.append("&lt;/form:form&gt;").append(ENTER);//form:form标签结束.
buffer.append("&lt;/body&gt;").append(ENTER);//body标签结束.
buffer.append("&lt;/html&gt;").append(ENTER);//html标签结束.
buffer.append(ENTER);
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/jsp/" + className + ".jsp", buffer.toString()); } /***
* 创建表的类定义常量
* @param tables
*/
public void createTableClass(List&lt;String&gt; tables) {
StringBuilder buffer = new StringBuilder();
buffer.append("package " + ROOT_PACKAGE + ".domain;");
buffer.append(ENTER);
buffer.append(ENTER);
buffer.append("/**\n * @Created:" + NOW_DATE + "\n * @Author " + AUTHOR + "\n");
buffer.append(" * @Version:").append(Version).append(ENTER);
buffer.append(" * @Email:").append(myEmail).append("\n*/");
buffer.append(ENTER);
buffer.append("public interface Table {");
buffer.append(ENTER);
for (String table : tables) {
buffer.append(TAB);
buffer.append("String " + getTableConstantName(table) + " = \"" + table.toUpperCase() + "\";");
buffer.append(ENTER);
}
buffer.append(ENTER);
buffer.append("}");
buffer.append(ENTER);
FileUtils.save("output-code/" + ROOT_PACKAGE.replaceAll("\\.", "/") + "/domain/Table.java", buffer.toString());
} /***
* 获取数据库表名
* @return
* @throws Exception
*/
public List&lt;String&gt; getTables() throws Exception {
List&lt;Object&gt; params = new ArrayList&lt;Object&gt;();
//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&lt;String&gt; tables = new ArrayList&lt;String&gt;();
while (rs.next()) {
tables.add(rs.getString(1));
}
return tables;
} /***
* 列名 类型 =&gt; 说明
* TABLE_CAT String =&gt; 表 catalog
* TABLE_SCHEM String =&gt; 表 schema
* TABLE_NAME String =&gt; 表名
* TABLE_TYPE String =&gt; 表类型
* REMARKS String =&gt; 表注释
* 获取表的列
* @param table
* @return
* @throws Exception
*/
private List&lt;Map&lt;String, Object&gt;&gt; getCols(String table) throws Exception {
List&lt;Map&lt;String, Object&gt;&gt; cols = new ArrayList&lt;Map&lt;String,Object&gt;&gt;();
ResultSetMetaData md = DBHelperUtils.query("select * from " + table + " where 1 = 2", null).getMetaData(); for (int i = 1; i &lt;= md.getColumnCount(); i++) {
Map&lt;String, Object&gt; col = new HashMap&lt;String, Object&gt;();
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&lt;Map&lt;String, Object&gt;&gt; getAllTable() throws SQLException {
/**
* 定义一个Lis
*/
List&lt;Map&lt;String, Object&gt;&gt; cols = new ArrayList&lt;Map&lt;String,Object&gt;&gt;();
DatabaseMetaData metaData = DBHelperUtils.getInstance().getDatabaseMetaData(); //这个是获取所有表.
ResultSet rs = metaData.getTables(null, "%", "%", new String[] {"TABLE"}); while (rs.next()) {
String tableName = rs.getString("TABLE_NAME");////这个是获取表名 if(tableName!=null){
Map&lt;String, Object&gt; col = new HashMap&lt;String, Object&gt;();
// 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||REMARKS==""){
col.put(COLUMN_NAME, COLUMN_NAME);
}else{
col.put(REMARKS, REMARKS);
}
cols.add(col);
}
}
}
return cols;
} /***
* 获取列的备注
* @param table
* @return
* @throws SQLException
*/
public static List&lt;Map&lt;String, Object&gt;&gt; getTableRemarks(String table) throws SQLException { List&lt;Map&lt;String, Object&gt;&gt; cols = new ArrayList&lt;Map&lt;String,Object&gt;&gt;(); Connection conn=DBHelperUtils.getInstance().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&lt;String, Object&gt; col = new HashMap&lt;String, Object&gt;();
//Map&lt;String, Object&gt; col = new HashTable&lt;String, Object&gt;();
ResultSet rs1 = metaData.getColumns(null, "%", tableName, "%");
while(rs1.next()){
String COLUMN_NAME = rs1.getString("COLUMN_NAME");
String REMARKS = rs1.getString("REMARKS"); //先判断备注是否为空,不为空就取表的字段的注释说明,否则的话就去字段列名 if(REMARKS==null||REMARKS==""){
col.put(COLUMN_NAME, COLUMN_NAME);
}else{
col.put(REMARKS, REMARKS);
}
//去掉重复的数据
col = removeRepeatData();
cols.add(col);
}
break;
}
}
}
return cols;
} /**
* 获取表的主键.
* @param tableName
*/
public static String getTablePrimaryKeys(String tableName)throws Exception{
DatabaseMetaData metaData = DBHelperUtils.getInstance().getDatabaseMetaData();
ResultSet pkRSet = metaData.getPrimaryKeys(null, null, tableName); String primaryKey = "";
if(pkRSet.next() ) {
//把这个列的名称获取出来
primaryKey = pkRSet.getString("PK_NAME");//PK_NAME/COLUMN_NAME
primaryKey=(primaryKey==null?"":primaryKey); System.out.println(primaryKey);
}
return primaryKey;
} /**
* 获取表的主键和外键包括外键表的名
* @param tableName
*/
public static String[] getTablePrimaryKeyForeignKey(String tableName)throws Exception{
DatabaseMetaData metaData = DBHelperUtils.getInstance().getDatabaseMetaData();
ResultSet fkSet = metaData.getPrimaryKeys(null, null, tableName);
String pkColumnName="",fkColumnName="",pkTablenName="";
String [] paramsKey= new String[3]; while(fkSet.next()){
pkColumnName = fkSet.getString("PK_NAME");//主键在网查到的有可能是PKCOLUMN_NAME
fkColumnName = fkSet.getString("FK_NAME");//外键网查到的有可能是PKCOLUMN_NAME
pkTablenName = fkSet.getString("PKTABLE_NAME");//主键表名
//System.out.println(pkColumnName+fkColumnName+pkTablenName);
pkColumnName=(pkColumnName==null?"":pkColumnName);
fkColumnName=(fkColumnName==null?"":fkColumnName);
pkTablenName=(pkTablenName==null?"":pkTablenName);
paramsKey[0]=fkColumnName;
paramsKey[1]=fkColumnName;
paramsKey[2]=pkTablenName;
} return paramsKey;
} /***
* 去掉重复的数据
* @return
*/
private static Map&lt;String, Object&gt; removeRepeatData() {
Map&lt;String, Object&gt; col = new HashMap&lt;String, Object&gt;();
Set&lt;String&gt; 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() &gt; 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&lt;Map&gt; 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 &lt;= rsmd.getColumnCount(); i++) {
row.put(rsmd.getColumnName(i), rs.getObject(i));
}
list.add(row);
count++;
if (count &gt;= limit) {
break;
}
}
return list;
} /***
* 获取查询list
* @param conn
* @param sql
* @param limit
* @return
* @throws SQLException
*/
public static List&lt;Map&gt; 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&lt;Map&gt; queryForList(String sql, int limit) throws SQLException {
Connection conn = DBHelperUtils.getConnection();
return queryForList(conn, sql, limit);
} /***
* 生成所有Entity,Dao,Service,Controller,JSP 代码
* @throws Exception
*/
public void createAllCodeGenerator()throws Exception{
List&lt;String&gt; tables = getTables();
for (String table : tables) {
createEntityClass(table);//this is method create Entity
createDaoClass(table);//this is method create Dao Interface
createDaoImplClass(table);//this is method create Dao implement
createServiceClass(table);//this is method create Service Interface
createServiceImplClass(table);//this is method create Service implement
createControllerClass(table);//this is method create Controller
createJspView(table);//this is method JspView
}
createTableClass(tables); } public static void main(String[] args)throws Exception {
String sql="select * from SYS_MENU ";
//List&lt;Map&gt; queryForList = queryForList(sql, 1000);
/*for(Map m:queryForList){
System.out.println("======"+m);
}*/ String tableName = "SYS_MENU";//表名 /* List&lt;Map&lt;String, Object&gt;&gt; tableRemarks = getTableRemarks(tableName);
int i=0;
for (Map&lt;String, Object&gt; col : getTableRemarks(tableName)) {
Set&lt;String&gt; keySet = col.keySet();
for (Object str : keySet) {
//System.out.println(str);
}
}
*/
//getTablePrimaryKeys("test"); //new CodeGenerator().createJspView("sup_email");
new CodeGenerator().createEntityClass("test");
//new CodeGenerator().getTablePrimaryKeyForeignKey("test");
//String myId="My_id";
//boolean endsWith = myId.toString().toUpperCase().endsWith("_ID");
//if(col.get(NAME).toString().equalsIgnoreCase("ID") || col.get(NAME).toString().toUpperCase().endsWith("_ID"))
//if(endsWith){
//System.out.println(11111);
//} //createAllCodeGenerator(); }

}

  1. package com.flong.codegenerator;
  2. import java.sql.Connection;
  3. import java.sql.DatabaseMetaData;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8. import java.util.List;
  9. /***
  10. *@Author:liangjilong
  11. *@Date:2015年12月5日下午12:25:12
  12. *@Email:jilongliang@sina.com
  13. *@Version:1.0
  14. *@CopyRight(c)Flong Intergrity Ltd.
  15. */
  16. @SuppressWarnings("all")
  17. public class DBHelperUtils {
  18. private static final Connection conn;
  19. private static final String driverClass = PropertiesHelper.getValueByKey("jdbc.driver");
  20. private static final String connectionUrl = PropertiesHelper.getValueByKey("jdbc.url");
  21. private static final String username = PropertiesHelper.getValueByKey("jdbc.username");
  22. private static final String password = PropertiesHelper.getValueByKey("jdbc.password");
  23. private static DBHelperUtils instance = null;
  24. /**
  25. * 定义代码块.
  26. */
  27. static {
  28. try {
  29. Class.forName(driverClass);
  30. conn = DriverManager.getConnection(connectionUrl, username, password);
  31. } catch (Exception e) {
  32. throw new RuntimeException(e);
  33. }
  34. }
  35. /**建立单例模式
  36. * Single
  37. * @return
  38. */
  39. public static DBHelperUtils getInstance() {
  40. if (instance == null) {
  41. synchronized (DBHelperUtils.class) {
  42. instance = new DBHelperUtils();
  43. }
  44. }
  45. return instance;
  46. }
  47. /**
  48. * 查询数据
  49. * @param sql
  50. * @param params
  51. * @return
  52. */
  53. public static ResultSet query(String sql, List<Object> params) {
  54. System.out.println("sql: " + sql);
  55. //System.out.println("params: " + params);
  56. try {
  57. PreparedStatement psmt = conn.prepareStatement(sql);
  58. if(params != null) {
  59. for (int i = 0; i < params.size(); i++) {
  60. psmt.setObject(i+1, params.get(i));
  61. }
  62. }
  63. return psmt.executeQuery();
  64. } catch (SQLException e) {
  65. throw new RuntimeException(e);
  66. }
  67. }
  68. /***
  69. * 更新
  70. * @param sql
  71. * @param params
  72. */
  73. public static void update(String sql, List<Object> params) {
  74. System.out.println("sql: " + sql);
  75. //System.out.println("params: " + params);
  76. try {
  77. PreparedStatement psmt = conn.prepareStatement(sql);
  78. if(params != null) {
  79. for (int i = 0; i < params.size(); i++) {
  80. psmt.setObject(i+1, params.get(i));
  81. }
  82. }
  83. psmt.executeUpdate();
  84. } catch (SQLException e) {
  85. throw new RuntimeException(e);
  86. }
  87. }
  88. /**
  89. * 获取链接
  90. * @return
  91. */
  92. public static Connection getConnection(){
  93. try {
  94. Class.forName(driverClass);
  95. return DriverManager.getConnection(connectionUrl, username, password);
  96. } catch (Exception e) {
  97. e.printStackTrace();
  98. }
  99. return null;
  100. }
  101. /**
  102. * 获取数据DatabaseMetaData对象
  103. * @return
  104. */
  105. public DatabaseMetaData  getDatabaseMetaData(){
  106. try {
  107. return getInstance().getConnection().getMetaData();
  108. } catch (SQLException e) {
  109. e.printStackTrace();
  110. }
  111. return null;
  112. }
  113. /**
  114. * 获得数据库的一些相关信息
  115. */
  116. public void getDataBaseInformations() {
  117. try {
  118. System.out.println("数据库已知的用户: "+ getDatabaseMetaData().getUserName());
  119. System.out.println("数据库的系统函数的逗号分隔列表: "+ getDatabaseMetaData().getSystemFunctions());
  120. System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ getDatabaseMetaData().getTimeDateFunctions());
  121. System.out.println("数据库的字符串函数的逗号分隔列表: "+ getDatabaseMetaData().getStringFunctions());
  122. System.out.println("数据库供应商用于 'schema' 的首选术语: "+ getDatabaseMetaData().getSchemaTerm());
  123. System.out.println("数据库URL: " + getDatabaseMetaData().getURL());
  124. System.out.println("是否允许只读:" + getDatabaseMetaData().isReadOnly());
  125. System.out.println("数据库的产品名称:" + getDatabaseMetaData().getDatabaseProductName());
  126. System.out.println("数据库的版本:" + getDatabaseMetaData().getDatabaseProductVersion());
  127. System.out.println("驱动程序的名称:" + getDatabaseMetaData().getDriverName());
  128. System.out.println("驱动程序的版本:" + getDatabaseMetaData().getDriverVersion());
  129. System.out.println();
  130. System.out.println("数据库中使用的表类型");
  131. ResultSet rs = getDatabaseMetaData().getTableTypes();
  132. while (rs.next()) {
  133. System.out.println(rs.getString(1));
  134. }
  135. rs.close();
  136. System.out.println();
  137. } catch (SQLException e) {
  138. e.printStackTrace();
  139. }
  140. }
  141. /**
  142. * 获得该用户下面的所有表
  143. */
  144. public void getAllTableList(String schemaName) {
  145. try {
  146. // table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
  147. String[] types = { "TABLE" };
  148. ResultSet rs = getDatabaseMetaData().getTables(null, schemaName, "%", types);
  149. while (rs.next()) {
  150. String tableName = rs.getString("TABLE_NAME");  //表名
  151. String tableType = rs.getString("TABLE_TYPE");  //表类型
  152. String remarks = rs.getString("REMARKS");       //表备注
  153. System.out.println(tableName + "-" + tableType + "-" + remarks);
  154. }
  155. } catch (SQLException e) {
  156. e.printStackTrace();
  157. }
  158. }
  159. /**
  160. * 获得该用户下面的所有视图
  161. */
  162. public void getAllViewList(String schemaName) {
  163. try{
  164. String[] types = { "VIEW" };
  165. ResultSet rs = getDatabaseMetaData().getTables(null, schemaName, "%", types);
  166. while (rs.next()){
  167. String viewName = rs.getString("TABLE_NAME"); //视图名
  168. String viewType = rs.getString("TABLE_TYPE"); //视图类型
  169. String remarks = rs.getString("REMARKS");      //视图备注
  170. System.out.println(viewName + "-" + viewType + "-" + remarks);
  171. }
  172. } catch (SQLException e) {
  173. e.printStackTrace();
  174. }
  175. }
  176. /**
  177. * 获得数据库中所有方案名称
  178. */
  179. public void getAllSchemas(){
  180. try{
  181. ResultSet rs = getDatabaseMetaData().getSchemas();
  182. while (rs.next()){
  183. String tableSchem = rs.getString("TABLE_SCHEM");
  184. System.out.println(tableSchem);
  185. }
  186. } catch (SQLException e){
  187. e.printStackTrace();
  188. }
  189. }
  190. /**
  191. * 获得表或视图中的所有列信息
  192. */
  193. public void getTableColumns(String schemaName, String tableName) {
  194. try{
  195. ResultSet rs = getDatabaseMetaData().getColumns(null, schemaName, tableName, "%");
  196. while (rs.next()){
  197. String tableCat = rs.getString("TABLE_CAT");//表目录(可能为空)
  198. String tableSchemaName = rs.getString("TABLE_SCHEM");//表的架构(可能为空)
  199. String tableName_ = rs.getString("TABLE_NAME");//表名
  200. String columnName = rs.getString("COLUMN_NAME");//列名
  201. int dataType = rs.getInt("DATA_TYPE"); //对应的java.sql.Types类型
  202. String dataTypeName = rs.getString("TYPE_NAME");//java.sql.Types类型   名称
  203. int columnSize = rs.getInt("COLUMN_SIZE");//列大小
  204. int decimalDigits = rs.getInt("DECIMAL_DIGITS");//小数位数
  205. int numPrecRadix = rs.getInt("NUM_PREC_RADIX");//基数(通常是10或2)
  206. int nullAble = rs.getInt("NULLABLE");//是否允许为null
  207. String remarks = rs.getString("REMARKS");//列描述
  208. String columnDef = rs.getString("COLUMN_DEF");//默认值
  209. int sqlDataType = rs.getInt("SQL_DATA_TYPE");//sql数据类型
  210. int sqlDatetimeSub = rs.getInt("SQL_DATETIME_SUB");   //SQL日期时间分?
  211. int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH");   //char类型的列中的最大字节数
  212. int ordinalPosition = rs.getInt("ORDINAL_POSITION");  //表中列的索引(从1开始)
  213. /**
  214. * ISO规则用来确定某一列的为空性。
  215. * 是---如果该参数可以包括空值;
  216. * 无---如果参数不能包含空值
  217. * 空字符串---如果参数为空性是未知的
  218. */
  219. String isNullAble = rs.getString("IS_NULLABLE");
  220. /**
  221. * 指示此列是否是自动递增
  222. * 是---如果该列是自动递增
  223. * 无---如果不是自动递增列
  224. * 空字串---如果不能确定它是否
  225. * 列是自动递增的参数是未知
  226. */
  227. String isAutoincrement = rs.getString("IS_AUTOINCREMENT");
  228. System.out.println(tableCat + "-" + tableSchemaName + "-" + tableName_ + "-" + columnName + "-"
  229. + dataType + "-" + dataTypeName + "-" + columnSize + "-" + decimalDigits + "-" + numPrecRadix
  230. + "-" + nullAble + "-" + remarks + "-" + columnDef + "-" + sqlDataType + "-" + sqlDatetimeSub
  231. + charOctetLength + "-" + ordinalPosition + "-" + isNullAble + "-" + isAutoincrement + "-");
  232. }
  233. } catch (SQLException e){
  234. e.printStackTrace();
  235. }
  236. }
  237. /**
  238. * 获得一个表的索引信息
  239. */
  240. public void getIndexInfo(String schemaName, String tableName) {
  241. try{
  242. ResultSet rs = getDatabaseMetaData().getIndexInfo(null, schemaName, tableName, true, true);
  243. while (rs.next()){
  244. boolean nonUnique = rs.getBoolean("NON_UNIQUE");//非唯一索引(Can index values be non-unique. false when TYPE is  tableIndexStatistic   )
  245. String indexQualifier = rs.getString("INDEX_QUALIFIER");//索引目录(可能为空)
  246. String indexName = rs.getString("INDEX_NAME");//索引的名称
  247. short type = rs.getShort("TYPE");//索引类型
  248. short ordinalPosition = rs.getShort("ORDINAL_POSITION");//在索引列顺序号
  249. String columnName = rs.getString("COLUMN_NAME");//列名
  250. String ascOrDesc = rs.getString("ASC_OR_DESC");//列排序顺序:升序还是降序
  251. int cardinality = rs.getInt("CARDINALITY");   //基数
  252. System.out.println(nonUnique + "-" + indexQualifier + "-" + indexName + "-" + type + "-" + ordinalPosition + "-" + columnName + "-" + ascOrDesc + "-" + cardinality);
  253. }
  254. } catch (SQLException e){
  255. e.printStackTrace();
  256. }
  257. }
  258. /**
  259. * 获得一个表的主键信息
  260. */
  261. public void getAllPrimaryKeys(String schemaName, String tableName) {
  262. try{
  263. ResultSet rs = getDatabaseMetaData().getPrimaryKeys(null, schemaName, tableName);
  264. while (rs.next()){
  265. String columnName = rs.getString("COLUMN_NAME");//列名
  266. short keySeq = rs.getShort("KEY_SEQ");//序列号(主键内值1表示第一列的主键,值2代表主键内的第二列)
  267. String pkName = rs.getString("PK_NAME"); //主键名称
  268. System.out.println(columnName + "-" + keySeq + "-" + pkName);
  269. }
  270. }catch (SQLException e){
  271. e.printStackTrace();
  272. }
  273. }
  274. /**
  275. * 获得一个表的外键信息
  276. */
  277. public void getAllExportedKeys(String schemaName, String tableName) {
  278. try{
  279. ResultSet rs = getDatabaseMetaData().getExportedKeys(null, schemaName, tableName);
  280. while (rs.next()){
  281. String pkTableCat = rs.getString("PKTABLE_CAT");//主键表的目录(可能为空)
  282. String pkTableSchem = rs.getString("PKTABLE_SCHEM");//主键表的架构(可能为空)
  283. String pkTableName = rs.getString("PKTABLE_NAME");//主键表名
  284. String pkColumnName = rs.getString("PKCOLUMN_NAME");//主键列名
  285. String fkTableCat = rs.getString("FKTABLE_CAT");//外键的表的目录(可能为空)出口(可能为null)
  286. String fkTableSchem = rs.getString("FKTABLE_SCHEM");//外键表的架构(可能为空)出口(可能为空)
  287. String fkTableName = rs.getString("FKTABLE_NAME");//外键表名
  288. String fkColumnName = rs.getString("FKCOLUMN_NAME"); //外键列名
  289. short keySeq = rs.getShort("KEY_SEQ");//序列号(外键内值1表示第一列的外键,值2代表在第二列的外键)。
  290. /**
  291. * hat happens to foreign key when primary is updated:
  292. * importedNoAction - do not allow update of primary key if it has been imported
  293. * importedKeyCascade - change imported key to agree with primary key update
  294. * importedKeySetNull - change imported key to NULL if its primary key has been updated
  295. * importedKeySetDefault - change imported key to default values if its primary key has been updated
  296. * importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
  297. */
  298. short updateRule = rs.getShort("UPDATE_RULE");
  299. /**
  300. * What happens to the foreign key when primary is deleted.
  301. * importedKeyNoAction - do not allow delete of primary key if it has been imported
  302. * importedKeyCascade - delete rows that import a deleted key
  303. * importedKeySetNull - change imported key to NULL if its primary key has been deleted
  304. * importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
  305. * importedKeySetDefault - change imported key to default if its primary key has been deleted
  306. */
  307. short delRule = rs.getShort("DELETE_RULE");
  308. String fkName = rs.getString("FK_NAME");//外键的名称(可能为空)
  309. String pkName = rs.getString("PK_NAME");//主键的名称(可能为空)
  310. /**
  311. * can the evaluation of foreign key constraints be deferred until commit
  312. * importedKeyInitiallyDeferred - see SQL92 for definition
  313. * importedKeyInitiallyImmediate - see SQL92 for definition
  314. * importedKeyNotDeferrable - see SQL92 for definition
  315. */
  316. short deferRability = rs.getShort("DEFERRABILITY");
  317. System.out.println(pkTableCat + "-" + pkTableSchem + "-" + pkTableName + "-" + pkColumnName + "-"
  318. + fkTableCat + "-" + fkTableSchem + "-" + fkTableName + "-" + fkColumnName + "-" + keySeq + "-"
  319. + updateRule + "-" + delRule + "-" + fkName + "-" + pkName + "-" + deferRability);
  320. }
  321. } catch (SQLException e){
  322. e.printStackTrace();
  323. }
  324. }
  325. public void closeResource() {
  326. try {
  327. if (conn != null) {
  328. conn.close();
  329. }
  330. } catch (SQLException e) {
  331. e.printStackTrace();
  332. }
  333. }
  334. public static void main(String[] args) throws Exception {
  335. DBHelperUtils metaData = new DBHelperUtils();
  336. metaData.getDataBaseInformations();
  337. metaData.getAllTableList(null);
  338. metaData.getAllViewList(null);
  339. metaData.getAllSchemas();
  340. metaData.getTableColumns(null, "test");
  341. metaData.getIndexInfo(null, "test");
  342. metaData.getAllPrimaryKeys(null, "test");
  343. metaData.getAllExportedKeys(null, "test");
  344. }
  345. }
package com.flong.codegenerator;

import java.sql.Connection;

import java.sql.DatabaseMetaData;

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.

*/

@SuppressWarnings("all")

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&lt;Object&gt; 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 &lt; 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&lt;Object&gt; 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 &lt; 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;
} /**
* 获取数据DatabaseMetaData对象
* @return
*/
public DatabaseMetaData getDatabaseMetaData(){ try {
return getInstance().getConnection().getMetaData();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} /**
* 获得数据库的一些相关信息
*/
public void getDataBaseInformations() {
try {
System.out.println("数据库已知的用户: "+ getDatabaseMetaData().getUserName());
System.out.println("数据库的系统函数的逗号分隔列表: "+ getDatabaseMetaData().getSystemFunctions());
System.out.println("数据库的时间和日期函数的逗号分隔列表: "+ getDatabaseMetaData().getTimeDateFunctions());
System.out.println("数据库的字符串函数的逗号分隔列表: "+ getDatabaseMetaData().getStringFunctions());
System.out.println("数据库供应商用于 'schema' 的首选术语: "+ getDatabaseMetaData().getSchemaTerm());
System.out.println("数据库URL: " + getDatabaseMetaData().getURL());
System.out.println("是否允许只读:" + getDatabaseMetaData().isReadOnly());
System.out.println("数据库的产品名称:" + getDatabaseMetaData().getDatabaseProductName());
System.out.println("数据库的版本:" + getDatabaseMetaData().getDatabaseProductVersion());
System.out.println("驱动程序的名称:" + getDatabaseMetaData().getDriverName());
System.out.println("驱动程序的版本:" + getDatabaseMetaData().getDriverVersion()); System.out.println();
System.out.println("数据库中使用的表类型");
ResultSet rs = getDatabaseMetaData().getTableTypes();
while (rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
System.out.println();
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 获得该用户下面的所有表
*/
public void getAllTableList(String schemaName) {
try {
// table type. Typical types are "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM".
String[] types = { "TABLE" };
ResultSet rs = getDatabaseMetaData().getTables(null, schemaName, "%", types);
while (rs.next()) {
String tableName = rs.getString("TABLE_NAME"); //表名
String tableType = rs.getString("TABLE_TYPE"); //表类型
String remarks = rs.getString("REMARKS"); //表备注
System.out.println(tableName + "-" + tableType + "-" + remarks);
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 获得该用户下面的所有视图
*/
public void getAllViewList(String schemaName) {
try{
String[] types = { "VIEW" };
ResultSet rs = getDatabaseMetaData().getTables(null, schemaName, "%", types);
while (rs.next()){
String viewName = rs.getString("TABLE_NAME"); //视图名
String viewType = rs.getString("TABLE_TYPE"); //视图类型
String remarks = rs.getString("REMARKS"); //视图备注
System.out.println(viewName + "-" + viewType + "-" + remarks);
}
} catch (SQLException e) {
e.printStackTrace();
}
} /**
* 获得数据库中所有方案名称
*/
public void getAllSchemas(){
try{
ResultSet rs = getDatabaseMetaData().getSchemas();
while (rs.next()){
String tableSchem = rs.getString("TABLE_SCHEM");
System.out.println(tableSchem);
}
} catch (SQLException e){
e.printStackTrace();
}
} /**
* 获得表或视图中的所有列信息
*/
public void getTableColumns(String schemaName, String tableName) { try{ ResultSet rs = getDatabaseMetaData().getColumns(null, schemaName, tableName, "%");
while (rs.next()){
String tableCat = rs.getString("TABLE_CAT");//表目录(可能为空)
String tableSchemaName = rs.getString("TABLE_SCHEM");//表的架构(可能为空)
String tableName_ = rs.getString("TABLE_NAME");//表名
String columnName = rs.getString("COLUMN_NAME");//列名
int dataType = rs.getInt("DATA_TYPE"); //对应的java.sql.Types类型
String dataTypeName = rs.getString("TYPE_NAME");//java.sql.Types类型 名称
int columnSize = rs.getInt("COLUMN_SIZE");//列大小
int decimalDigits = rs.getInt("DECIMAL_DIGITS");//小数位数
int numPrecRadix = rs.getInt("NUM_PREC_RADIX");//基数(通常是10或2)
int nullAble = rs.getInt("NULLABLE");//是否允许为null
String remarks = rs.getString("REMARKS");//列描述
String columnDef = rs.getString("COLUMN_DEF");//默认值
int sqlDataType = rs.getInt("SQL_DATA_TYPE");//sql数据类型
int sqlDatetimeSub = rs.getInt("SQL_DATETIME_SUB"); //SQL日期时间分?
int charOctetLength = rs.getInt("CHAR_OCTET_LENGTH"); //char类型的列中的最大字节数
int ordinalPosition = rs.getInt("ORDINAL_POSITION"); //表中列的索引(从1开始) /**
* ISO规则用来确定某一列的为空性。
* 是---如果该参数可以包括空值;
* 无---如果参数不能包含空值
* 空字符串---如果参数为空性是未知的
*/
String isNullAble = rs.getString("IS_NULLABLE"); /**
* 指示此列是否是自动递增
* 是---如果该列是自动递增
* 无---如果不是自动递增列
* 空字串---如果不能确定它是否
* 列是自动递增的参数是未知
*/
String isAutoincrement = rs.getString("IS_AUTOINCREMENT"); System.out.println(tableCat + "-" + tableSchemaName + "-" + tableName_ + "-" + columnName + "-"
+ dataType + "-" + dataTypeName + "-" + columnSize + "-" + decimalDigits + "-" + numPrecRadix
+ "-" + nullAble + "-" + remarks + "-" + columnDef + "-" + sqlDataType + "-" + sqlDatetimeSub
+ charOctetLength + "-" + ordinalPosition + "-" + isNullAble + "-" + isAutoincrement + "-");
}
} catch (SQLException e){
e.printStackTrace();
}
} /**
* 获得一个表的索引信息
*/
public void getIndexInfo(String schemaName, String tableName) {
try{
ResultSet rs = getDatabaseMetaData().getIndexInfo(null, schemaName, tableName, true, true);
while (rs.next()){
boolean nonUnique = rs.getBoolean("NON_UNIQUE");//非唯一索引(Can index values be non-unique. false when TYPE is tableIndexStatistic )
String indexQualifier = rs.getString("INDEX_QUALIFIER");//索引目录(可能为空)
String indexName = rs.getString("INDEX_NAME");//索引的名称
short type = rs.getShort("TYPE");//索引类型
short ordinalPosition = rs.getShort("ORDINAL_POSITION");//在索引列顺序号
String columnName = rs.getString("COLUMN_NAME");//列名
String ascOrDesc = rs.getString("ASC_OR_DESC");//列排序顺序:升序还是降序
int cardinality = rs.getInt("CARDINALITY"); //基数
System.out.println(nonUnique + "-" + indexQualifier + "-" + indexName + "-" + type + "-" + ordinalPosition + "-" + columnName + "-" + ascOrDesc + "-" + cardinality);
}
} catch (SQLException e){
e.printStackTrace();
}
} /**
* 获得一个表的主键信息
*/
public void getAllPrimaryKeys(String schemaName, String tableName) {
try{
ResultSet rs = getDatabaseMetaData().getPrimaryKeys(null, schemaName, tableName);
while (rs.next()){
String columnName = rs.getString("COLUMN_NAME");//列名
short keySeq = rs.getShort("KEY_SEQ");//序列号(主键内值1表示第一列的主键,值2代表主键内的第二列)
String pkName = rs.getString("PK_NAME"); //主键名称
System.out.println(columnName + "-" + keySeq + "-" + pkName);
}
}catch (SQLException e){
e.printStackTrace();
}
} /**
* 获得一个表的外键信息
*/
public void getAllExportedKeys(String schemaName, String tableName) { try{
ResultSet rs = getDatabaseMetaData().getExportedKeys(null, schemaName, tableName);
while (rs.next()){
String pkTableCat = rs.getString("PKTABLE_CAT");//主键表的目录(可能为空)
String pkTableSchem = rs.getString("PKTABLE_SCHEM");//主键表的架构(可能为空)
String pkTableName = rs.getString("PKTABLE_NAME");//主键表名
String pkColumnName = rs.getString("PKCOLUMN_NAME");//主键列名
String fkTableCat = rs.getString("FKTABLE_CAT");//外键的表的目录(可能为空)出口(可能为null)
String fkTableSchem = rs.getString("FKTABLE_SCHEM");//外键表的架构(可能为空)出口(可能为空)
String fkTableName = rs.getString("FKTABLE_NAME");//外键表名
String fkColumnName = rs.getString("FKCOLUMN_NAME"); //外键列名
short keySeq = rs.getShort("KEY_SEQ");//序列号(外键内值1表示第一列的外键,值2代表在第二列的外键)。 /**
* hat happens to foreign key when primary is updated:
* importedNoAction - do not allow update of primary key if it has been imported
* importedKeyCascade - change imported key to agree with primary key update
* importedKeySetNull - change imported key to NULL if its primary key has been updated
* importedKeySetDefault - change imported key to default values if its primary key has been updated
* importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
*/
short updateRule = rs.getShort("UPDATE_RULE"); /**
* What happens to the foreign key when primary is deleted.
* importedKeyNoAction - do not allow delete of primary key if it has been imported
* importedKeyCascade - delete rows that import a deleted key
* importedKeySetNull - change imported key to NULL if its primary key has been deleted
* importedKeyRestrict - same as importedKeyNoAction (for ODBC 2.x compatibility)
* importedKeySetDefault - change imported key to default if its primary key has been deleted
*/
short delRule = rs.getShort("DELETE_RULE");
String fkName = rs.getString("FK_NAME");//外键的名称(可能为空)
String pkName = rs.getString("PK_NAME");//主键的名称(可能为空) /**
* can the evaluation of foreign key constraints be deferred until commit
* importedKeyInitiallyDeferred - see SQL92 for definition
* importedKeyInitiallyImmediate - see SQL92 for definition
* importedKeyNotDeferrable - see SQL92 for definition
*/
short deferRability = rs.getShort("DEFERRABILITY"); System.out.println(pkTableCat + "-" + pkTableSchem + "-" + pkTableName + "-" + pkColumnName + "-"
+ fkTableCat + "-" + fkTableSchem + "-" + fkTableName + "-" + fkColumnName + "-" + keySeq + "-"
+ updateRule + "-" + delRule + "-" + fkName + "-" + pkName + "-" + deferRability);
}
} catch (SQLException e){
e.printStackTrace();
}
} public void closeResource() {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception {
DBHelperUtils metaData = new DBHelperUtils();
metaData.getDataBaseInformations();
metaData.getAllTableList(null);
metaData.getAllViewList(null);
metaData.getAllSchemas();
metaData.getTableColumns(null, "test");
metaData.getIndexInfo(null, "test");
metaData.getAllPrimaryKeys(null, "test");
metaData.getAllExportedKeys(null, "test");
}

}

  1. package com.flong.codegenerator;
  2. import java.io.File;
  3. import java.io.FileWriter;
  4. public class FileUtils {
  5. /**
  6. * 把生成的文件都保存.
  7. * @param path
  8. * @param data
  9. */
  10. public static void save(String path, String data) {
  11. try {
  12. File file = new File(path);
  13. File dir = new File(path.substring(0, path.lastIndexOf("/")));
  14. if(!dir.exists()) {
  15. dir.mkdirs();
  16. }
  17. FileWriter out = new FileWriter(file);
  18. out.write(data);
  19. out.flush();
  20. out.close();
  21. } catch (Exception e) {
  22. throw new RuntimeException(e);
  23. }
  24. }
  25. }
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);

}

}

}

  1. package com.flong.codegenerator;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Map.Entry;
  5. import java.util.Properties;
  6. /***
  7. *@Author:liangjilong
  8. *@Date:2015年12月5日下午12:25:12
  9. *@Email:jilongliang@sina.com
  10. *@Version:1.0
  11. *@CopyRight(c)Flong Intergrity Ltd.
  12. *@Description:读取文properties
  13. */
  14. public class PropertiesHelper {
  15. private static final Map<String, String> properties = new HashMap<String, String>();
  16. static {
  17. try {
  18. Properties pps = new Properties();
  19. pps.load(PropertiesHelper.class.getClassLoader().getResourceAsStream("prop/DBSource.properties"));
  20. //处理重复的值.
  21. for (Entry<Object, Object> entry : pps.entrySet()) {
  22. properties.put(entry.getKey().toString().trim(), entry.getValue().toString().trim());
  23. }
  24. } catch (Exception e) {
  25. throw new RuntimeException(e);
  26. }
  27. }
  28. /**
  29. *通过key值去获取值.
  30. */
  31. public static String getValueByKey(String name) {
  32. return properties.get(name);
  33. }
  34. }
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&lt;String, String&gt; properties = new HashMap&lt;String, String&gt;();
static {
try {
Properties pps = new Properties();
pps.load(PropertiesHelper.class.getClassLoader().getResourceAsStream("prop/DBSource.properties"));
//处理重复的值.
for (Entry&lt;Object, Object&gt; 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);
}

}

  1. #mysql database setting
  2. jdbc.driver=com.mysql.jdbc.Driver
  3. jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
  4. jdbc.username=root
  5. jdbc.password=root
#mysql database setting
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root

其中源码在一个CodeGenerator.Java里面

SQL生成器和代码生成器源代码下载地址 http://download.csdn.NET/detail/l_ji_l/9797834

    <ul style="display:none;">
<li><a href="http://dl2.iteye.com/upload/attachment/0113/5679/94412eec-7542-3c74-9162-6d6c400ad45a.png" target="_blank"><img src="http://dl2.iteye.com/upload/attachment/0113/5679/94412eec-7542-3c74-9162-6d6c400ad45a-thumb.png" class="magplus" title="点击查看原始大小图片"></a></li> <li>大小: 43.1 KB</li>
</ul> <ul>
<li><a href="http://dl.iteye.com/topics/download/5556475d-eedc-3f93-8a81-f7dfb6d65235">codegenerator.zip</a> (15.8 KB)</li> <li>下载次数: 154</li>
</ul> <ul>
<li><a href="#" onclick="$$('div.attachments ul').invoke('show');$(this).up(1).hide();return false;">查看图片附件</a></li>
</ul>

SprinfJdbcTemplate+SpringMVC 代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)的更多相关文章

  1. 代码生成器实现的Entity,Dao,Service,Controller,JSP神器(含代码附件)

    package com.flong.codegenerator; import java.sql.Connection; import java.sql.DatabaseMetaData; impor ...

  2. 【springmvc+mybatis项目实战】杰信商贸-5.生产厂家DAO+SERVICE+CONTROLLER+JSP+配置文件

    上一篇我们创建了工程和一个Factory的po对象(javaBean),我们也写好了Mapper的映射文件,接下来我们来完成生产厂家的DAO与SERVICE,以及CONTROLLER,还有做显示的JS ...

  3. 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)

    简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...

  4. Android Studio 之 ROM【1】, Entity,Dao,Database

    Android Studio 之 ROM, Entity,DAO,DataBase 1.Entity 实体类 package com.example.roombasic; import android ...

  5. MySQL+Service+Servlet+Jsp实现Table表格分页展示数据

    下面以一个示例讲解如何使用MySQL+Service+Servlet+Jsp实现Table表格分页展示数据: eg:请假管理系统 要求如下: 一.打开首页页面, 访问查询请假记录的 servlet , ...

  6. (转载)Spring 注解@Component,@Service,@Controller,@Repository

    Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service 和 @Controller.在目前的 Spring ...

  7. Spring 注解@Component,@Service,@Controller,@Repository

    Spring 注解@Component,@Service,@Controller,@RepositorySpring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释, ...

  8. @Repository , @Service , @Controller 和 @Component

    用Spring MVC时@Controller注解的类将变成一个Spring MVC的控制器. 不用Spring MVC的情况下, 这四个注解没有区别. 根据注解的语义, 注解在类上面可以提高代码的可 ...

  9. SpringAnnotation注解之@Component,@Repository,@Service,@Controller

    @Component:组件,表示此写上了此注解的bean,作为一个组件存在于容器中.这样的话别的地方就可以使用@Resource这个注解来把这个组件作为一个资源来使用了.初始化bean的名字为类名首字 ...

随机推荐

  1. 做移动应用使用地图API时需要注意的问题

    最近在做一个基于地点提醒的移动应用,当初考虑大家都心知肚明的原因,谨慎的选择了百度地图,现在想想其实完全没有必要,好的应用本来就不分国界的,最后可能还是得换回Google地图.毕竟Google地图在技 ...

  2. ArrayList,LinkedList,Vestor

    Collection是最基本的集合接口,声明了适用于JAVA集合的通用方法,list和set都继承自collection接口. Collection接口的方法 boolean add(Object o ...

  3. 破逼Json,该死的Json库,操了

    jansson,就这个库,破几把玩意,本来很简单的Json,就是简单的字符串操作,ATL一个CString就能解决,QT的QSting也能解决,DELPHI的String也能解决.而这B,非把那么简单 ...

  4. P3303 [SDOI2013]淘金

    题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...

  5. linux-基础-常用命令

    一 Linux的简介 1.1 Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林 ...

  6. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  7. 阿里云出手SaaS生态,中国SaaS市场小而不强有望破解

    企业服务SaaS市场还有很大的增长空间.SaaS的鼻祖Salesforces今年5月迈上了千亿美元市值的门槛,再一次为ToB市场注入了兴奋剂.单单一个SaaS CRM,目前全球的市场规模就超过400亿 ...

  8. Nacos Committers 团队首亮相,发布 0.9.0 版本

    223 天,发布 14 个版本,19 位 Committers,39 位 Contributors. 在宣布开源后的第 223 天,Nacos 发布了其第14个版本 - 0.9.0,该版本提升了 Na ...

  9. javascript DOM知识脑图

  10. 灵动微本土MCU厂商具有吸引力的增长点

    作为各种电子产品的控制和处理核心,微控制单元(MCU)器件是一种集成微处理器(CPU).存储器(RAM/ROM).计数器,以及I/O端口的芯片.从MCU内核架构来看,单片机有历经多年的8051,基于A ...