学习一 idea java 实体类转建表语句

package com.inspur.gs.jzbz.jzinterface.entity;

import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.hql.internal.ast.SqlGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
    private static final Logger logger = LoggerFactory.getLogger(SqlGenerator.class);

    public static void main(String[] args) {
        //实体类所在的package在磁盘上的绝对路径
        String packageName = "F:\\jzbz-interface\\jzbz-interface-entity\\src\\main\\java\\com\\inspur\\gs\\jzbz\\jzinterface\\entity\\user";
        //生成sql的文件夹
        String filePath = "F:/create/";
        //项目中实体类的路径
        String prefix = "com.inspur.gs.jzbz.jzinterface.entity.user.";
        String className = "JzdiJlPositionInfoEntity";

        StringBuffer sqls = new StringBuffer();
        //获取包下的所有类名称
        List<String> list = getAllClasses(packageName);
        for (String str : list) {
            className = prefix + str.substring(0, str.lastIndexOf("."));
            String sql = generateSql(className, filePath);
            sqls.append(sql);
        }
        System.out.println(sqls.toString());
        StringToSql(sqls.toString(), filePath + "report.sql");

    }
    /**
     * 根据实体类生成建表语句
     * @author
     * @date	2019年1月14日
     * @param className 全类名
     * @param filePath 磁盘路径  如 : d:/workspace/
     */
    public static String generateSql(String className,String filePath){
        try {
            Class<?> clz = Class.forName(className);
            className = clz.getSimpleName();
            Field[] fields = clz.getDeclaredFields();
            StringBuffer column = new StringBuffer();
            String varchar = " varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,";
            for (Field f : fields) {
                column.append(" \n `"+f.getName()+"`").append(varchar);
            }
            StringBuffer sql = new StringBuffer();
            sql.append("\n DROP TABLE IF EXISTS `"+className+"`; ")
                    .append(" \n CREATE TABLE `"+className+"`  (")
                    .append(" \n `id` int(11) NOT NULL AUTO_INCREMENT,")
                    .append(" \n "+column)
                    .append(" \n PRIMARY KEY (`id`) USING BTREE,")
                    .append("\n INDEX `id`(`id`) USING BTREE")
                    .append(" \n ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci;");
            return sql.toString();
        } catch (ClassNotFoundException e) {
            logger.debug("该类未找到!");
            return null;
        }

    }

    /**
     * 获取包下的所有类名称,获取的结果类似于 XXX.java
     * @author
     * @date	2019年1月14日
     * @param packageName
     * @return
     */
    public static List<String> getAllClasses(String packageName){
        List<String> classList = new ArrayList<String>();
        String className="";
        File f = new File(packageName);
        if(f.exists() && f.isDirectory()){
            File[] files = f.listFiles();
            for (File file : files) {
                className = file.getName();
                classList.add(className);
            }
            return classList;
        }else{
            logger.debug("包路径未找到!");
            return null;
        }
    }
    /**
     * 将string 写入sql文件
     * @author
     * @date	2019年1月14日
     * @param str
     * @param path
     */
    public static void StringToSql(String str,String path){
        byte[] sourceByte = str.getBytes();
        if(null != sourceByte){
            try {
                File file = new File(path);     //文件路径(路径+文件名)
                if (!file.exists()) {   //文件不存在则创建文件,先创建目录
                    File dir = new File(file.getParent());
                    dir.mkdirs();
                    file.createNewFile();
                }
                FileOutputStream outStream = new FileOutputStream(file);    //文件输出流用于将数据写入文件
                outStream.write(sourceByte);
                outStream.flush();
                outStream.close();  //关闭文件输出流
                System.out.println("生成成功");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

按要求修改即可 另一种是安装插件MyBatisCodeHelperPro 但是这个插件比较大 需要花点功夫下载。

<think>好的,用户的问题是关于在IntelliJ IDEA中批量生成指定目录下所有实体类对应的数据库语句的方法。首先,我需要回忆下之前提供的引用内容,看看有没有相关的信息。 根据引用[3],IDEA可以连接MySQL数据库并自动生成SQL语句,但这里提到的是从数据库生成,而用户需要的是从实体类生成。引用[4]提到了两种方法:种是手动修改模板,另种是使用MyBatisCodeHelperPro插件,但用户可能需要批量处理。引用[2]提到的idea-sql-generator-tool插件可能有用,但需要确认是否支持批量生成。 接下来,我需要整理可能的解决方案。首先,检查是否有现成的插件支持批量生成。MyBatisCodeHelperPro和idea-sql-generator-tool都是候选,但需要查看它们的文档是否支持批量处理。另外,引用[4]提到的自定义脚本可能是个方法,用户可以通过编写脚本遍历目录下的实体类,然后逐个生成SQL。不过这可能需要定的开发工作。 然后,考虑用户的实际需求。用户可能有很多实体类在指定目录下,希望次性生成所有对应的语句,而不需要手动个个处理。因此,插件的选择尤为重要。如果现有插件不支持批量生成,可能需要结合脚本或自定义模板来实现。 还需要考虑实体类与数据库结构的映射是否正确,比如字段类型、主键、索引等是否正确换。这涉及到实体类中的注解或注释是否符合插件的要求,例如使用JPA的@Entity、@Table、@Column等注解,或者Lombok的@Data等。 最后,总结可能的步骤:安装插件,配置实体类目录,运行插件生成SQL。或者编写自定义脚本,结合JPA工具或反射机制读取实体类信息生成SQL。需要分步骤详细说明,确保用户能够按照指导操作。</think>在IntelliJ IDEA中批量生成实体类对应的语句,可通过以下两种主流方法实现: --- ### 方法:使用MyBatisCodeHelperPro插件(推荐) 1. **安装插件** - 打开IDEA > `File` > `Settings` > `Plugins` - 搜索`MyBatisCodeHelperPro`并安装,重启IDEA[^4] 2. **配置实体类目录** - 右键项目中的实体类目录 > `New` > `Generate Mybatis Files` - 勾选`Generate create table sql`选项 3. **批量生成** - 全选目录下所有实体类 > 右键选择`Mybatis Generator` > 自动生成对应SQL文件 - 生成的SQL文件默认保存在`resources/sql`目录 --- ### 方法二:通过Database Tools自定义脚本 1. **连接数据库** - 打开`Database`工具窗口 > 添加MySQL数据源 - 配置数据库连接(注意时区设置`serverTimezone=Asia/Shanghai`)[^1][^3] 2. **创生成脚本** ```groovy // build.gradle 示例 task generateSQL { doLast { fileTree(dir: 'src/main/java/com/entity', include: '**/*.java').each { def className = it.name.replace('.java', '') def sql = "CREATE TABLE ${className.toLowerCase()} (\n" // 解析字段逻辑(需根据实体类结构编写) sql += ");" new File("src/main/resources/sql/${className}.sql").write(sql) } } } ``` 通过自定义Gradle/Maven任务解析实体类字段并生成SQL[^3] --- ### 方法三:使用idea-sql-generator-tool插件 1. **安装专用插件** - 下载`idea-sql-generator-tool`插件(需手动安装) - 支持批量选择实体类生成DDL,自动处理字段映射关系[^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值