mybatis-plus代码生成器加模板实践

mybatis-plus代码生成器加模板实践

MyBatis-Plus(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生!
这是官方的介绍说明,不了解的小伙伴可以点击标签去查看。
之前也有写过一版mp的代码生成器,他原本的代码生成器只是生成了一个简单的mvc架构,而且不包括前端的代码,前端的html和js还需要自己去编写,比较麻烦,这个版本集成了Velocity模板,所有的CRUD操作都可以自己定义,包过前端的js和html文件也可生成,大大简化了代码量,用户只需要关注模块的核心业务即可。
下面介绍一下开发流程,项目使用的是springboot+mybatis-plus+mysql

一、集成Velocity模板

maven项目中导入该坐标

 <dependency>
     <groupId>org.apache.velocity</groupId>
     <artifactId>velocity</artifactId>
     <version>1.7</version>
 </dependency>

(一)创建VelocityUtils工具类
该工具类会将前端的文件全部创建好

/**
 * @Author: SongTiank
 * @Description: 前端文件生成
 * @Date: 2021/6/22 10:01
 * @Version: 1.0
 */
public class VelocityUtils {
    private final static Logger log = LoggerFactory.getLogger(VelocityUtils.class);
    private static final String VM_ENTITY_PATH = "templates/js/frontEnd.js.vm";
    private static final String VM_ENTITY_ADD_PATH = "templates/js/frontEnd_add.js.vm";
    private static final String VM_ENTITY_EDIT_PATH = "templates/js/frontEnd_edit.js.vm";
    private static final String VM_HTML_PATH = "templates/html/frontEnd.html.vm";

    /**
     * 创建首页js
     * fileName 文件名称
     * tableColumn 数据库字段集合
     * CREAT_PATH 文件生成路径
     */
    public static void creatEntityJs(String fileName,List<TableColumn> tableColumn,String CREAT_PATH){
        VelocityEngine velocityEngine = new VelocityEngine();
        velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
        velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
        velocityEngine.init();
        // 获取模板文件
        Template template = velocityEngine.getTemplate(VM_ENTITY_PATH);
        // 设置变量,velocityContext是一个类似map的结构
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("tableName",fileName);
        tableColumn.remove(0);//移除只存表名的对象;
        velocityContext.put("list", tableColumn);
        // 输出渲染后的结果
        StringWriter stringWriter = new StringWriter();
        template.merge(velocityContext, stringWriter);
        //写入文件中
        ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+".js");
    }


    /**
     * 创建新增js
     * fileName 文件名称
     * CREAT_PATH 文件生成路径
     */
    public static void creatEntityAddJs(String fileName,String CREAT_PATH){
        VelocityEngine velocityEngine = new VelocityEngine();
        velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
        velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
        velocityEngine.init();
        // 获取模板文件
        Template template = velocityEngine.getTemplate(VM_ENTITY_ADD_PATH);
        // 设置变量,velocityContext是一个类似map的结构
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("tableName", fileName);
        // 输出渲染后的结果
        StringWriter stringWriter = new StringWriter();
        template.merge(velocityContext, stringWriter);
        //写入文件中
        ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+"_add.js");
    }

    /**
     * 创建修改js
     * fileName 文件名称
     * CREAT_PATH 文件生成路径
     */
    public static void creatEntityEditJs(String fileName,String CREAT_PATH){
        VelocityEngine velocityEngine = new VelocityEngine();
        velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
        velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
        velocityEngine.init();
        // 获取模板文件
        Template template = velocityEngine.getTemplate(VM_ENTITY_EDIT_PATH);
        // 设置变量,velocityContext是一个类似map的结构
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("tableName", fileName);
        // 输出渲染后的结果
        StringWriter stringWriter = new StringWriter();
        template.merge(velocityContext, stringWriter);
        //写入文件中
        ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+"_edit.js");
    }

    /**
     * 创建html页面
     * fileName 文件名称
     * CREAT_PATH 文件生成路径
     */
    public static void creatEntityHtml(String fileName,String CREAT_PATH){
        VelocityEngine velocityEngine = new VelocityEngine();
        velocityEngine.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        velocityEngine.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        velocityEngine.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
        velocityEngine.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
        velocityEngine.init();
        // 获取模板文件
        Template template = velocityEngine.getTemplate(VM_HTML_PATH);
        // 设置变量,velocityContext是一个类似map的结构
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("tableName", fileName);
        // 输出渲染后的结果
        StringWriter stringWriter = new StringWriter();
        template.merge(velocityContext, stringWriter);
        //写入文件中
        ZipUtil.writeToFile(stringWriter.toString(),CREAT_PATH+"//"+fileName+".html");
    }
}

文件目录展示
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/6c4d09241e81f93563be0cb3cf0850ca.png在这里插入图片描述

创建代码工具类

/**
 * 代码生成执行类
 * @Author: SongTiank
 * @Date: 2021/6/20 13:01
 */
public class CreatTableUtil {

    /**
     * 代码执行类
     *TODO 文件存储位置部署需要更换
     * 前端页面选择数据库表传递过来的数据。
     * 我是创建到了本地D盘,模仿服务器,而后压缩下载到本地,再将downLoad里的文件删除,服务器上需要调整路径。
     * @param creatTableName 待创建的数据库表名集合、
     * @param dataSource	数据库注册、
     * @param Author   创建人
     * @param PakagePath 包路径
     * @param ModelName  模块名
     * @return
     */
    public static String creating(String[] creatTableName, DataSourceConfig dataSource,String Author,String PakagePath,
                                String ModelName,HttpServletResponse response, HttpServletRequest request) {
        AutoGenerator mpg = new AutoGenerator();
        mpg.setDataSource(dataSource);
        String projectPath = request.getSession().getServletContext().getRealPath("/");
        String creatPath = "D://text" + "/" + randomUUID().toString().replaceAll("-", "");
        String downLoadPath = "D://text//downLoad";
        File temDir = new File(creatPath);
        if (!temDir.exists()) {
            temDir.mkdirs();
        }
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(creatPath); //生成路径
        gc.setAuthor(Author);     //作者
        gc.setFileOverride(true);   //是否覆盖
        gc.setActiveRecord(true);   // 不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);   // XML 二级缓存
        gc.setBaseResultMap(true);  // XML ResultMap
        gc.setBaseColumnList(true); // XML columList
        gc.setOpen(false);
        mpg.setGlobalConfig(gc);
        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
        if (creatTableName != null && creatTableName.length>0) {
            strategy.setInclude(creatTableName); // 需要生成的表
        }
        strategy.setEntityBuilderModel(true);
        mpg.setStrategy(strategy);
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent(ModelName);
        pc.setController(PakagePath+".controller");
        pc.setEntity(PakagePath+".entity");
        pc.setMapper(PakagePath+".mapper");
        pc.setService(PakagePath+".service");
        pc.setServiceImpl(PakagePath+".serviceImpl");
        pc.setXml(PakagePath+".mapperXml");
        mpg.setPackageInfo(pc);
        mpg.setTemplate(TemplateGenerate());
        // 执行生成
        mpg.execute();
        //--------------前端代码生成------------------------
        for (String tableName : creatTableName) {
            try {
            	//获取该表的名称,和所有字段以及注释,作为前端生成的条件。
                List<TableColumn> tableColumn = getTableColumn(dataSource, tableName);
                String fileName=  tableColumn.get(0).getTableName();
                VelocityUtils.creatEntityJs(fileName,tableColumn,temDir.getPath());//首页js
                VelocityUtils.creatEntityAddJs(fileName,temDir.getPath());//新增js
                VelocityUtils.creatEntityEditJs(fileName,temDir.getPath());//编辑js
                VelocityUtils.creatEntityHtml(fileName,temDir.getPath());//创建html页面
                VelocityUtils.creatEntityHtmlAdd(fileName,tableColumn,temDir.getPath());//创建add页面
                VelocityUtils.creatEntityHtmlEdit(fileName,tableColumn,temDir.getPath());//创建edit页面
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //--------------前端代码生成结束----------------------
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=excel.zip");
        String zipName=UUID.randomUUID().toString().replaceAll("-", "")+".zip";
        /** 4.调用工具类,下载zip压缩包 */
        try {
            FileOutputStream fos1 = new FileOutputStream(new File(downLoadPath + "//"+zipName));
            ZipUtil.toZip(temDir.getPath(), fos1, true);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            ZipUtil.delFolder(creatPath);
        }
        return zipName;
    }

    /**
     * 自定义模板配置
     */
    private static TemplateConfig TemplateGenerate() {
        TemplateConfig templateConfig = new TemplateConfig()
                .setController("templates/java/controller.java" )
                .setService("templates/java/service.java" )
                .setServiceImpl("templates/java/serviceImpl.java" )
                .setEntity("templates/java/entity.java")
                .setMapper("templates/java/mapper.java" )
                .setXml("templates/java/mapper.xml");
        return templateConfig;
    }


```java
    /**
     * 动态获取表字段
     * @return 查询到的表字段对象集合
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static List<TableColumn> getTableColumn(DataSourceConfig dataSource,String tableName) throws ClassNotFoundException, SQLException {
        List<TableColumn> tableColumnList=new ArrayList<>();//存储字段和注释
        Class.forName(dataSource.getDriverName());
        Connection conn= DriverManager.getConnection(dataSource.getUrl(), dataSource.getUsername(), dataSource.getPassword());
        TableColumn _tableName = new TableColumn();//表名改驼峰
        _tableName.setTableName(JDBCUtils.underline2Camel(tableName));
        tableColumnList.add(_tableName);//存入表名
        String sql = "select column_name,column_comment from Information_schema.columns  where table_Name='"+tableName+"'";
        Statement statement = conn.createStatement();
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()) {
            //获取表字段、表注释,underline2Camel方法:下划线取消,后面字母调整大写,小驼峰命名
            String columnName = JDBCUtils.underline2Camel(rs.getString(1), false);
            String content = JDBCUtils.underline2Camel(rs.getString(2), false);
            TableColumn tableColumn = new TableColumn(columnName,content); //字段名称,字段注释
            tableColumnList.add(tableColumn);
        }
        rs.close();
        conn.close();
        return tableColumnList;
    }
}

下划线调整工具类

  /**
     * 下划线调整工具类
     * @param line
     * @param firstIsUpperCase
     * @return
     */
    public static String underline2Camel(String line, boolean ... firstIsUpperCase) {
        String str = "";

        if (StringUtils.isBlank(line)) {
            return str;
        } else {
            StringBuilder sb = new StringBuilder();
            String[] strArr;
            // 不包含下划线,且第二个参数是空的
            if (!line.contains("_") && firstIsUpperCase.length == 0) {
                sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1));
                str = sb.toString();
            } else if (!line.contains("_") && firstIsUpperCase.length != 0) {
                if (!firstIsUpperCase[0]) {
                    sb.append(line.substring(0, 1).toLowerCase()).append(line.substring(1));
                    str = sb.toString();
                } else {
                    sb.append(line.substring(0, 1).toUpperCase()).append(line.substring(1));
                    str = sb.toString();
                }
            } else if (line.contains("_") && firstIsUpperCase.length == 0) {
                strArr = line.split("_");
                for (String s : strArr) {
                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
                }
                str = sb.toString();
                str = str.substring(0, 1).toLowerCase() + str.substring(1);
            } else if (line.contains("_") && firstIsUpperCase.length != 0) {
                strArr = line.split("_");
                for (String s : strArr) {
                    sb.append(s.substring(0, 1).toUpperCase()).append(s.substring(1));
                }
                if (!firstIsUpperCase[0]) {
                    str = sb.toString();
                    str = str.substring(0, 1).toLowerCase() + str.substring(1);
                } else {
                    str = sb.toString();
                }
            }
        }
        return str;
    }

以上就是工具类的核心方法,有疑问或者指教欢迎留言~
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇Bubble

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值