我是靠谱客的博主 孤独大炮,最近开发中收集的这篇文章主要介绍FreeMarker SpringBoot 代码生成器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
- templates
FreeMarker流程:
- 创建一个Configuration对象,直接new一个对象。构造方法的参数就是FreeMarker对于的版本号。
- 设置模板文件所在的路径。
- 设置模板文件使用的字符集。一般就是utf-8.
- 加载一个模板,创建一个模板对象。
- 创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
- 创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
- 调用模板对象的process方法输出文件。
- 关闭流。
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
参数是表名
最后
以上就是孤独大炮为你收集整理的FreeMarker SpringBoot 代码生成器FreeMarker SpringBoot 代码生成器的全部内容,希望文章能够帮你解决FreeMarker SpringBoot 代码生成器FreeMarker SpringBoot 代码生成器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复