IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> FreeMarker SpringBoot 代码生成器 -> 正文阅读

[Java知识库]FreeMarker SpringBoot 代码生成器

FreeMarker SpringBoot 代码生成器

这篇大部分代码是用了 https://blog.csdn.net/weixin_43424932/article/details/104253977 这篇文章,只是我用它的代码没跑通,自己修改了一下,然后添加了注释,现在用下面的代码是可以跑通

还有,哪位知道Markdown里FreeMarker模版代码的高亮怎么弄,尴尬,我直接用ftl,没效果,尴尬

FreeMarker教程: http://www.freemarker.net/

maven添加库

<!-- lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>
<!-- jdbc -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql依赖 -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
<!-- 连接池druid,一定要加版本不然下载依赖失败 -->
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>druid-spring-boot-starter</artifactId>
	<version>1.1.21</version>
</dependency>
<!-- freemarker模版 -->
<dependency>
	<groupId>org.freemarker</groupId>
	<artifactId>freemarker</artifactId>
	<version>2.3.23</version>
</dependency>

配置文件 application.yml:

spring:
  datasource:
    # 数据库访问配置, 使用druid数据源(默认数据源是HikariDataSource)
    type: com.alibaba.druid.pool.DruidDataSource
    #链接池配置
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
      username: root
      password: 123456

目录结构:

  • java
    • com.example.generate.config

      • FreeMarkerTools.java
    • com.example.generate.controller

      • FreeMarkerController.java
  • resources
    • templates
      • entity.ftl
      • dao.ftl
      • mapper.ftl
      • controller.ftl
      • service.ftl
      • serviceImpl.ftl

FreeMarker流程:

  1. 创建一个Configuration对象,直接new一个对象。构造方法的参数就是FreeMarker对于的版本号。
  2. 设置模板文件所在的路径。
  3. 设置模板文件使用的字符集。一般就是utf-8.
  4. 加载一个模板,创建一个模板对象。
  5. 创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
  6. 创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
  7. 调用模板对象的process方法输出文件。
  8. 关闭流。

FreeMarkerTools.java:

package com.example.generate.config;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class FreeMarkerTools {
    @Autowired
    JdbcTemplate jdbcTemplate;

    /**
     * 判断包路径是否存在
     */
    private void pathJudgeExist(String path){
        File file = new File(path);
        if(!file.exists()) {
            file.mkdirs();
        }
    }

    /**
     * 输出到文件
     */
    public  void printFile(Map<String, Object> root, Template template, String filePath, String fileName) throws Exception  {
        pathJudgeExist(filePath);
        File file = new File(filePath, fileName );
        if(!file.exists()) {
            file.createNewFile();
        }
        // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8));
        // 第七步:调用模板对象的process方法输出文件
        // root参数是模板使用的数据集,out参数是生成的文件
        template.process(root,  out);
        // 第八步:关闭流
        out.close();
    }

    /**
     * 首字母大写
     */
    public  String capFirst(String str){
        return str.substring(0,1).toUpperCase()+str.substring(1).toLowerCase();
    }

    /**
     * 下划线命名转为驼峰命名
     */
    public String underlineToHump(String para){
        StringBuilder result=new StringBuilder();
        String a[]=para.split("_");
        for(String s:a){
            if(result.length()==0){
                result.append(s);
            }else{
                result.append(s.substring(0, 1).toUpperCase());
                result.append(s.substring(1).toLowerCase());
            }
        }
        return result.toString();
    }

    /**
     * 获取类名
     */
    public String getEntityName(String tableName){
        return underlineToHump(capFirst(tableName.toLowerCase()));
    }

    /**
     * 获取首字母小写类名
     */
    public String getEntityNameLower(String tableName){
        return underlineToHump(tableName.toLowerCase());
    }

    /**
     * 将[数据库类型]转换成[Java类型],如果遇到没有写的类型,会出现Undefine,在后面补充即可
     */
    public  String convertToJava(String columnType){
        String result;
        switch (columnType){
            case "VARCHAR":{
                result = "String";
                break;
            }
            case "INT":{
                result = "Integer";
                break;
            }
            case "BIGINT":{
                result = "Long";
                break;
            }
            case "FLOAT":{
                result = "Float";
                break;
            }
            case "DOUBLE":{
                result = "Double";
                break;
            }
            case "DATETIME":{
                result = "Date";
                break;
            }
            case "BIT":{
                result = "Boolean";
                break;
            }
            default:{
                result = "Undefine";
                break;
            }
        }
        return result;
    }

    /**
     * 匹配字符串中的英文字符
     */
    public String matchResult(String str) {
        String regEx2 = "[a-z||A-Z]";
        Pattern pattern = Pattern.compile(regEx2);
        StringBuilder sb = new StringBuilder();
        Matcher m = pattern.matcher(str);
        while (m.find()){
            for (int i = 0; i <= m.groupCount(); i++)
            {
                sb.append(m.group());
            }
        }
        return sb.toString();
    }

    /**
     * 获取表信息
     */
    public List<Map<String, String>> getDataInfo(String tableName){
        // mysql查询表结构的语句,如果是其他数据库,修改此处查询语句
        String sql = "show columns from "+tableName;
        List<Map<String, Object>> sqlToMap = jdbcTemplate.queryForList(sql);

        List<Map<String, String>> columns = new LinkedList<>();
        for (Map<String, Object> map : sqlToMap) {
            Map<String, String> columnMap = new HashMap<>();
            // 字段名称
            String columnName = map.get("Field").toString();
            columnMap.put("columnName", columnName);
            // 字段类型
            String columnType = map.get("Type").toString().toUpperCase();
            columnType = matchResult(columnType).trim();
            columnType = convertToJava(columnType);
            columnMap.put("columnType", columnType);
            // 成员名称
            columnMap.put("entityColumnNo", underlineToHump(columnName));
            columns.add(columnMap);
        }
        return columns;
    }

    /**
     * 生成代码
     */
    public void generate(Map<String, Object> root,String templateName,String saveUrl,String entityName) throws Exception {

        // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是FreeMarker对于的版本号
        Configuration freeMarker = new Configuration(Configuration.getVersion());

        // 获取classes路径下的templates
        final String TEMPLATE_PATH = ResourceUtils.getURL("classpath:").getPath()+"templates";

        // 第二步:设置模板文件所在的路径
        freeMarker.setDirectoryForTemplateLoading(new File(TEMPLATE_PATH));

        // 第三步:设置模板文件使用的字符集。一般就是utf-8
        freeMarker.setDefaultEncoding("utf-8");

        // 第四步:加载一个模板,创建一个模板对象
        Template template = freeMarker.getTemplate(templateName);
        //输出文件
        printFile(root, template, saveUrl, entityName);
    }

}

FreeMarkerController.java:

package com.example.generate.controller;

import com.example.generate.config.FreeMarkerTools;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class FreeMarkerController {

    @Autowired
    FreeMarkerTools freeMarkerTools;

    /**
     * 生成代码接口
     * @para tableName 表名
     * @para saveUrl 生成文件路径
     * @para basePackageUrl 生成上级包名
     */
    @GetMapping("generate")
    public String createEntity(String tableName,String saveUrl,String basePackageUrl) throws Exception {

        //生成文件路径
        saveUrl = saveUrl == null ? "/Users/zjl/Desktop/xxfilesxx": saveUrl;
        //生成文件包名,根据实际情况修改即可
        basePackageUrl = basePackageUrl == null? "com.example.demo": basePackageUrl;
        //bean类名
        String entityName = freeMarkerTools.getEntityName(tableName);

        // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map
        //封装参数
        Map<String, Object> root = new HashMap<>();
        // 添加包名
        root.put("basePackageUrl", basePackageUrl);
        //表参数
        root.put("tableName", tableName);
        // 实体类名
        root.put("entityName", entityName);
        // 实体类首字母小写
        root.put("entityNameLower", freeMarkerTools.getEntityNameLower(tableName));
        // 数据库信息
        root.put("columns", freeMarkerTools.getDataInfo(tableName));

        // 生成实体类
        freeMarkerTools.generate(root,"entity.ftl",saveUrl,entityName+".java");
        // 生成dao
        freeMarkerTools.generate(root,"dao.ftl",saveUrl,entityName+"Dao.java");
        // 生成mapper
        freeMarkerTools.generate(root,"mapper.ftl",saveUrl,entityName+"Mapper.xml");
        // 生成controller
        freeMarkerTools.generate(root,"controller.ftl",saveUrl,entityName+"Controller.java");
        //生成service
        freeMarkerTools.generate(root,"service.ftl",saveUrl,entityName+"Service.java");
        //生成serviceImpl
        freeMarkerTools.generate(root,"serviceImpl.ftl",saveUrl,entityName+"ServiceImpl.java");

        return "生成成功!!!!";
    }

}

下面是模版文件:

entity.ftl:

package ${basePackageUrl}.entity;

import lombok.Data;
import java.io.Serializable;
import java.util.Date;

@Data
public class ${entityName} implements Serializable {

private static final long serialVersionUID = 1L;

<#if columns??>
<#--循环生成变量-->
    <#list columns as col>
        /**
        * ${col["columnName"]}
        */
        private ${col["columnType"]} ${col["entityColumnNo"]};
    </#list>

</#if>
}

dao.ftl:

package ${basePackageUrl}.dao;

import ${basePackageUrl}.bean.${entityName};
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ${entityName}Dao {
    ${entityName} selectByPrimaryKey(Integer id);
}

mapper.ftl:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${basePackageUrl}.dao.${entityName}Dao">

    <select id="selectByPrimaryKey"  resultType="${basePackageUrl}.bean.${entityName}">
        select * from ${tableName} where id=<#noparse>#{id}</#noparse>
    </select>

</mapper>

controller.ftl:

package ${basePackageUrl}.controller;

import ${basePackageUrl}.bean.${entityName};
import ${basePackageUrl}.service.${entityName}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class ${entityName}Controller {

    @Autowired
    ${entityName}Service ${entityNameLower}Service;

    @GetMapping("/selectByPrimaryKey")
    @ResponseBody
    public ${entityName} selectByPrimaryKey(Integer id){
        return ${entityNameLower}Service.selectByPrimaryKey(id);
    }
}

service.ftl:

package ${basePackageUrl}.service;

import ${basePackageUrl}.bean.${entityName};

public interface ${entityName}Service {

    ${entityName} selectByPrimaryKey(Integer id);
}

serviceImpl.ftl:

package ${basePackageUrl}.service.impl;

import ${basePackageUrl}.bean.${entityName};
import ${basePackageUrl}.dao.${entityName}Dao;
import ${basePackageUrl}.service.${entityName}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ${entityName}ServiceImpl implements ${entityName}Service {

    @Autowired
    ${entityName}Dao ${entityNameLower}Dao;

    @Override
    public ${entityName} selectByPrimaryKey(Integer id) {
        return ${entityNameLower}Dao.selectByPrimaryKey(id);
    }
}

打开浏览器:
http://localhost:8080/generate?tableName=team

参数是表名

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-22 14:31:58  更:2021-09-22 14:32:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:39:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码