工具类-Bean对象反向生成SQL语句

1、添加依赖
<dependency>
    <groupId>com.sun</groupId>
    <artifactId>tools</artifactId>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/tools.jar</systemPath>
</dependency>
1、 工具类
public class GenerateSqlMapperUtil {

    public static void main(String[] args) throws IOException {
        generateSqlMapper(SysDictType.class, "t_sys_dict_type");
    }
 
    public static void generateSqlMapper(Class obj,String tableName) throws IOException{

        Field[] fields = obj.getDeclaredFields();
        String cameCaseColumn = null;
        String underScoreCaseColumn = null;
        StringBuilder sql = new StringBuilder();
        if(tableName==null||tableName.equals("")){
            // 未传表明默认用类名
            tableName = obj.getName().substring(obj.getName().lastIndexOf(".")+1);
        }
        String javabeanPath = getJavabeanPath(obj.getSimpleName());
        System.out.println(javabeanPath);
        Doclet doclet = new Doclet(javabeanPath);
        Map<String, String> commentMap = doclet.resolveClassComment();
        /**
         * 以下部分生成建表Sql
         */
        sql.append("DROP TABLE IF EXISTS ").append(tableName).append(";\r\n");
        sql.append("CREATE TABLE ").append(tableName).append("( \r\n");
        boolean firstId = true;
        for(Field f : fields){
            cameCaseColumn = f.getName();
            String fieldComment = commentMap.get(cameCaseColumn);
            underScoreCaseColumn = cameCaseColumn;
            for(int i = 0; i < cameCaseColumn.length(); i++){
                if(Character.isUpperCase(cameCaseColumn.charAt(i))) {
                    // 将javabean中小驼峰命名变量的“大写字母”转换为“_小写字母”
                    underScoreCaseColumn = cameCaseColumn.substring(0, i) + '_' + cameCaseColumn.substring(i, i + 1).toLowerCase()
                            + cameCaseColumn.substring(i + 1, cameCaseColumn.length());
                }
            }
            sql.append("    "+underScoreCaseColumn).append(" ");
            fieldTypeToSql(sql,f.getType(),firstId,fieldComment);
            if(firstId){
                // 默认第一个字段为ID主键
                sql.append(" PRIMARY KEY AUTO_INCREMENT COMMENT '主键'");
                firstId = false;
            }
            sql.append(",\n");

        }
        sql.delete(sql.lastIndexOf(","), sql.length())
                .append("\n)ENGINE=INNODB DEFAULT CHARSET=UTF8 AUTO_INCREMENT=1 COMMENT '"+commentMap.get("classComment")+"';\r\n");
        System.out.println(sql);
    }

    private static void  fieldTypeToSql(StringBuilder sql,Class<?> fileType,Boolean firstId,String fieldComment){
        if(firstId){
            sql.append("INT ");
            return;
        }
        if(fileType.equals(String.class)){
            sql.append("VARCHAR(64) NOT NULL DEFAULT '' COMMENT '"+fieldComment+"' ");
        }
        else  if(fileType.equals(Integer.class) ){
            //数据类型
            sql.append("INT(7) NOT NULL DEFAULT 0 COMMENT '"+fieldComment+"' ");
        }
        else  if ( fileType.equals(Long.class)){
            sql.append("BIGINT(11) NOT NULL DEFAULT 0 COMMENT '"+fieldComment+"' ");
        }
        else if(fileType.equals(Short.class)){
            sql.append("SMALLINT(4) NOT NULL DEFAULT 0 COMMENT '"+fieldComment+"' ");
        }
        else if(fileType.equals(Double.class) || fileType.equals(Float.class) ||fileType.equals(BigDecimal.class) ){
            //浮点型
            sql.append(" DECIMAL(8,2) NOT NULL  DEFAULT '0.00' COMMENT '"+fieldComment+"' ");
        }
        else if(fileType.equals(Date.class) || fileType.equals(LocalDateTime.class)){
            //日期类型
            sql.append(" DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '"+fieldComment+"'");
        }
    }

    private static String getJavabeanPath(String javaName){
        String path = "G:\\gitee-workspace\\my-code-gennertor\\src\\main\\java\\cn\\vipthink\\icode\\table_create\\entity\\";
        return path+javaName+".java";
    }

}
FildEntry封装
/**
 * 属性字段对应注释
 *
 * @author guzt
 */
public class FildEntry {

    /**
     * 参数名
     */
    private String fName;
    /**
     * 类型
     */
    private String fType;
    /**
     * 说明
     */
    private String fExplain;

    public FildEntry(String fName, String fType, String fExplain) {
        super();
        this.fName = fName;
        this.fType = fType;
        this.fExplain = fExplain;
    }

    @Override
    public String toString() {
        return "Entry{" +
                "fName='" + fName + '\'' +
                ", fType='" + fType + '\'' +
                ", fExplain='" + fExplain + '\'' +
                '}';
    }

    public String getfName() {
        return fName;
    }

    public void setfName(String fName) {
        this.fName = fName;
    }

    public String getfType() {
        return fType;
    }

    public void setfType(String fType) {
        this.fType = fType;
    }

    public String getfExplain() {
        return fExplain;
    }

    public void setfExplain(String fExplain) {
        this.fExplain = fExplain;
    }
}
2、ModelClassDocVO
public class ModelClassDocVO {


    private String modelTableName;

    private String modelClassName;

    private String modelCommentText;

    private List<FildEntry> fildEntryList;


    public String getModelTableName() {
        return modelTableName;
    }

    public void setModelTableName(String modelTableName) {
        this.modelTableName = modelTableName;
    }

    public String getModelClassName() {
        return modelClassName;
    }

    public void setModelClassName(String modelClassName) {
        this.modelClassName = modelClassName;
    }

    public String getModelCommentText() {
        return modelCommentText;
    }

    public void setModelCommentText(String modelCommentText) {
        this.modelCommentText = modelCommentText;
    }

    public List<FildEntry> getFildEntryList() {
        return fildEntryList;
    }

    public void setFildEntryList(List<FildEntry> fildEntryList) {
        this.fildEntryList = fildEntryList;
    }

    @Override
    public String toString() {
        return "ModelClassDocVO{" +
                "modelClassName='" + modelClassName + '\'' +
                ", modelCommentText='" + modelCommentText + '\'' +
                ", fildEntryList=" + fildEntryList +
                '}';
    }
}

3、方言
import cn.hutool.core.util.ReflectUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.FieldDoc;
import com.sun.javadoc.RootDoc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.Map;

/**
 * 获取某一个java文件代码中属性对应的注释
 *
 * @author guzt
 */
public class Doclet {

    public static Logger logger = LoggerFactory.getLogger(Doclet.class);

    private static RootDoc rootDoc;
    private String javaBeanFilePath;

    public static boolean start(RootDoc root) {
        rootDoc = root;
        return true;
    }

    public Doclet(String javaBeanFilePath) {
        this.javaBeanFilePath = javaBeanFilePath;
    }

    public ModelClassDocVO exec() {
        ModelClassDocVO modelClassDocVO = new ModelClassDocVO();
        com.sun.tools.javadoc.Main.execute(new String[]{"-doclet", Doclet.class.getName(), "-docletpath",
                Doclet.class.getResource("/").getPath(), "-encoding", "utf-8", javaBeanFilePath});
        ClassDoc[] classes = rootDoc.classes();

        if (classes == null || classes.length == 0) {
            logger.warn(javaBeanFilePath + " 无ClassDoc信息");
            return modelClassDocVO;
        }

        List<FildEntry> entrys = Lists.newArrayList();
        ClassDoc classDoc = classes[0];
        // 获取类的名称
        modelClassDocVO.setModelClassName(classDoc.name());
        // 获取类的注释
        Object documentation = ReflectUtil.getFieldValue(classDoc, "documentation");
        String classComment = null != documentation? documentation.toString() : "";
        String spitStr = "\n";
        for (String msg : classComment.split(spitStr)) {
            if (!msg.trim().startsWith("@") && msg.trim().length() > 0) {
                modelClassDocVO.setModelCommentText(msg);
                break;
            }
        }
        // 获取属性名称和注释
        FieldDoc[] fields = classDoc.fields(false);
        for (FieldDoc field : fields) {
            entrys.add(new FildEntry(field.name(), field.type().typeName(), field.commentText()));
        }

        modelClassDocVO.setFildEntryList(entrys);
        return modelClassDocVO;
    }

    public Map<String,String> getCommentMap(ModelClassDocVO modelClassDocVO){
        Map<String,String> commentMap = Maps.newHashMap();
        String modelCommentText = modelClassDocVO.getModelCommentText();
        commentMap.put("classComment",modelCommentText);
        List<FildEntry> fildEntryList = modelClassDocVO.getFildEntryList();
        for(FildEntry entry:fildEntryList){
            commentMap.put(entry.getfName(),entry.getfExplain());
        }
        return commentMap;
    }

    public Map<String,String> resolveClassComment(){
        Doclet doclet = new Doclet(javaBeanFilePath);
        ModelClassDocVO modelClassDocVO = doclet.exec();
        return getCommentMap(modelClassDocVO);
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
博客地址:http://blog.csdn.net/vipbooks 一直以来把数据库的表换成Entity或DTO都是一件让人头痛的事情,既浪费时间又很繁琐,看着几十上百个表的几百上千个字段,真是一件让人很头痛的事情。 我们也想过很多办法解决这个问题,包括用MyEclipse连接数据库生成JavaBean,但多多少少还是会有一些不尽人意的地方,包括表和表字段的comment总是无法生成,而且还会生成很多无用的注释代码,让代码看起来一点都不干净,配置非常繁琐等等问题。 于是一怒之下,自己动手丰衣足食,就自己用Swing写了一个通过数据库的表生成JavaBean的工具,支持MySQL、Oracle、SQLServce、PostgreSQL,完美支持JPA注解,可以同时生成Entity和DTO,可以自动去除表前缀,并支持去除多个前缀,支持精确指定只生成哪几个表的Bean,也支持模糊查找生成哪几个表的Bean,现在不但成员变量上能生成备注了,而且在Getter和Setter上也能有备注了! 更重要的是所有的配置都能被保存到本地,只要配置过一次,下次使用只要点一下生成JavaBean,下一秒就能拿到你想要的JavaBean了,完全实现秒生成。并且集成各种实用工具,使得工作效率瞬间爆棚,生产力瞬间爆表! 该压缩包中包含32位和64位两个版本。 第11版更新震撼发布,此次版本更新如下: 1、新增数据源配置管理功能,可以为每种类型的数据库添加多个不同的数据源。 2、新增快速新增数据源功能,快速为当前选中的数据库添加数据源。 3、新增打开目录功能,左键打开菜单选择要打开的目录,点击右键可以快速打开当前应用所在目录。 4、新增对使用驼峰命名的表名和字段名的支持,例如表名是UserInfo,生成Bean的类名也是UserInfo; 字段名是userId,那么生成Bean字段也是userId。 5、主界面移除驱动名下拉选项,并新增快速切换数据源配置下拉选项。 6、改进精确匹配中“更多”的选表功能,在文本框中已选中的表在打开选表对话框时会被勾选。 7、改进清除StringBuffer工具,选择SQL类型会自动将“//”替换为“--”。 8、改进字符串格式化工具,将有更多类型可选,操作更方便。 9、其他一些小Bug的修改和代码优化调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值