???
Java代码
- packagecom.flong.codegenerator;
- importjava.sql.Connection;
- importjava.sql.DatabaseMetaData;
- importjava.sql.PreparedStatement;
- importjava.sql.ResultSet;
- importjava.sql.ResultSetMetaData;
- importjava.sql.SQLException;
- importjava.sql.Timestamp;
- importjava.text.SimpleDateFormat;
- importjava.util.ArrayList;
- importjava.util.Date;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importjava.util.Set;
- importorg.apache.commons.lang3.StringUtils;
- /***
- *@Author:liangjilong
- *@Date:2015年12月5日下午12:25:12
- *@Email:jilongliang@sina.com
- *@Version:1.0
- *@CopyRight(c)FlongIntergrityLtd.
- *@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")
- publicclassCodeGenerator{
- /*************************变量****Begin************************************/
- privatestaticfinalStringmyEmail="jilongliang@sina.com";//Email
- privatestaticfinalStringVersion="1.0";//版本
- privatestaticfinalStringDescription="";//描述
- publicstaticfinalStringENTER="\n";//换行
- publicstaticfinalStringTAB="";//tab空格.
- publicstaticfinalStringNAME="NAME";
- publicstaticfinalStringTABLE_CAT="TABLE_CAT";//表catalog
- publicstaticfinalStringTABLE_SCHEM="TABLE_SCHEM";//表schema
- publicstaticfinalStringTABLE_NAME="TABLE_NAME";//表名
- publicstaticfinalStringTABLE_TYPE="TABLE_TYPE";//表类型
- publicstaticfinalStringREMARKS="REMARKS";//表注释
- publicstaticfinalStringTYPE="TYPE";//表的类型
- publicstaticfinalStringSIZE="SIZE";//大小
- publicstaticfinalString;//类别
- /*************************变量****End************************************/
- publicstaticfinalStringNOW_DATE=newSimpleDateFormat("yyyy-MM-dd").format(newDate());
- /***************获取数据库的配置连接************/
- publicstaticfinalStringDB_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("?"));
- //从配置获取工程的报名路径
- publicstaticfinalStringROOT_PACKAGE=PropertiesHelper.getValueByKey("rootPackage");
- //获取作者.
- publicstaticfinalStringAUTHOR=PropertiesHelper.getValueByKey("author");
- //忽略表的后缀.
- publicstaticfinalList<String>IGNORE_TABLE_PREFIX=newArrayList<String>();
- /*******定义代码块*******/
- static{
- StringignoreTablePrefix=PropertiesHelper.getValueByKey("ignoreTablePrefix");
- if(ignoreTablePrefix.length()>0){
- String[]ignoreTablePrefixs=ignoreTablePrefix.split("\\s*\\,\\s*");
- for(Stringelem:ignoreTablePrefixs){
- IGNORE_TABLE_PREFIX.add(elem);
- }
- }
- }
- /***
- *生成实体类的代码
- *@paramtable
- *@throwsException
- */
- publicvoidcreateEntityClass(Stringtable)throwsException{
- StringtableConstantName=getTableConstantName(table);
- StringclassName=getClassName(tableConstantName);
- StringBuilderbuffer=newStringBuilder();
- buffer.append("package"+ROOT_PACKAGE+".entity;").append(ENTER);
- buffer.append("importjava.util.Date;").append(ENTER);
- buffer.append("importcom.flong.commons.persistence.Entity;").append(ENTER);
- buffer.append("importcom.flong.commons.persistence.annotation.Column;").append(ENTER);
- buffer.append("importcom.flong.commons.persistence.annotation.Id;").append(ENTER);
- buffer.append("importcom.flong.commons.persistence.annotation.Relation;").append(ENTER);
- buffer.append("importcom.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("publicclass"+className+"extendsEntity{");
- buffer.append(ENTER);
- buffer.append(ENTER);
- buffer.append(TAB);
- buffer.append("/**表名常量*/");
- buffer.append(ENTER);
- buffer.append(TAB);
- buffer.append("publicstaticfinalStringTABLE=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<String,Object>col:getCols(table)){
- StringcolName=col.get(NAME).toString().toUpperCase();
- buffer.append(TAB);//生成字段变量
- buffer.append("publicstaticfinalStringCOL_"+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("*/");
- StringtablePrimaryKeys=getTablePrimaryKeys(table);//如果是主键
- //if(col.get(NAME).toString().equalsIgnoreCase("ID")){
- if(tablePrimaryKeys!=null){
- buffer.append(ENTER+TAB);
- //如果主键不为空的时候就给一个@Id注解.
- //如果是hibernate的可以给其他的注解,如@GeneratedValue(strategy=GenerationType.IDENTITY)@SequenceGenerator等
- //并要在包的下面头部导入
- //importjavax.persistence.Column;
- //importjavax.persistence.Entity;
- //importjavax.persistence.GeneratedValue;
- //importjavax.persistence.GenerationType;
- //importjavax.persistence.Id;
- //importjavax.persistence.Table;
- buffer.append("@Id");
- //这里不赋值给,因为下面这个for循环有一个.
- //sb.append("@Column(COL_"+tablePrimaryKeys+")");
- }
- for(Map<String,Object>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");
- }elseif(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<String,Object>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");
- }elseif(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("publicvoid").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");
- }elseif(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类的代码
- *@paramtable
- *@throwsException
- */
- publicvoidcreateDaoClass(Stringtable)throwsException{
- StringclassName=getClassName(getTableConstantName(table));
- StringobjectName=StringUtils.uncapitalize(className);
- StringBuilderbuffer=newStringBuilder();
- buffer.append("package"+ROOT_PACKAGE+".dao;").append(ENTER);
- buffer.append("importjava.io.Serializable;").append(ENTER);
- buffer.append("importjava.util.List;").append(ENTER);
- buffer.append("importcom.flong.commons.persistence.bean.SimplePage;").append(ENTER);
- buffer.append("importcom.flong.commons.persistence.dao.EntityDao;").append(ENTER);
- buffer.append("importcom.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("publicinterface"+className+"DaoextendsEntityDao<"+className+">{").append(ENTER);
- buffer.append("/**查询*/").append(ENTER);
- buffer.append("publicList<"+className+">list(SimplePagesimplePage,"+className+""+objectName+");").append(ENTER);
- buffer.append("/**保存数据*/").append(ENTER);
- buffer.append("publicvoidsaveData("+className+""+objectName+");").append(ENTER);
- buffer.append("/**更新数据*/").append(ENTER);
- buffer.append("publicvoidupdateData("+className+""+objectName+");").append(ENTER);
- buffer.append("/**删除数据*/").append(ENTER);
- buffer.append("publicvoiddeleteData(Longpk);").append(ENTER);
知识推荐
- php 图片指定留白叠加缩放
- CGI FASTCGI ??php-fpm
- 在服务器的ftp站点新建的网站上创建虚拟目录
- 介绍nodejs中的path模块的几个方法
- 神经网络(十) GoogleNet
- vue+webpack2实现路由的懒加载
- http post by requests
- Forefront TMG 2010 篇(九)--禁止用户访问特定网站
- php7.2版本+yii2会报错
- 在IIS上部署你的ASP.NET Core项目
- ECharts.js学习(二)动态数据绑定
- vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例
- css知多少(11)——position
- ThinkPHP类似于RBAC的权限控制
- Mac 10.12原生方法对NTFS分区进行读写的配置
- AJAX
- ERROR org.hibernate.hql.internal.ast.ErrorCounter unexpected token: form 异常解决
- jQuery学习笔记 .addClass()/.removeClass()简单学习
我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8
不良信息举报平台
互联网安全管理备案
Copyright 2023 www.wodecom.cn All Rights Reserved