SpringBoot整合FreeMarker模板引擎
中文官方参考手册 http://freemarker.foofun.cn/
1.先加入FreeMarker依赖
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version>
</dependency>
2.新建一个FreeMarkerUtil工具类
public class FreeMarkerUtil {/*** 解析 freemarker 模版* @param path 模板所在目录 根目录为 resources* @param filename ftl文件名称* @param data 为模版设置的数据* @return String* @throws IOException*/public static String parseTemplate(String path, String filename,Object data) throws IOException {Configuration configuration = new Configuration(Configuration.getVersion());configuration.setDefaultEncoding("UTF-8");configuration.setClassForTemplateLoading(FreeMarkerUtil.class, path);configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);configuration.setWhitespaceStripping(true);Template template = configuration.getTemplate(filename);// 接收处理后的模版内容StringWriter stringWriter = new StringWriter();try{template.process(data,stringWriter);return stringWriter.toString();} catch (TemplateException e){return null;} finally {stringWriter.close();}}}
3.在resources目录下新建一个mysql建表模板createTemplate.ftl
CREATE TABLE ${databaseName}.${tableName} (<#list columns as column>${column.name} ${column.type}<#if column.autoIncrement> AUTO_INCREMENT</#if><#if column.notNull> NOT NULL</#if><#if column.primaryKey> PRIMARY KEY</#if><#if column.defaultVal != ""> DEFAULT '${column.defaultVal}'</#if><#if column.comment != ""> COMMENT '${column.comment}'</#if><#if (column_index < columns?size - 1)>,</#if></#list>
) ENGINE=${engine} DEFAULT CHARSET=${charset};
4.新建字段属性类ColumnInfo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnInfo {private String name;private String type;private boolean notNull;private boolean autoIncrement;private boolean primaryKey;private String defaultVal;private String comment;
}
5.根据数据构建模板
Map<String, Object> data = new HashMap<>();
String database = "******";
String tableName = "******";
data.put("databaseName", database);
data.put("tableName", tableName);
data.put("engine", "InnoDB");
data.put("charset", "utf8mb3");List<ColumnInfo> columns = new ArrayList<>();
columns.add(new ColumnInfo("id", "int", true, true, true, "","ID"));
columns.add(new ColumnInfo("name", "text", false, false, false, "","姓名"));
columns.add(new ColumnInfo("age", "text", false, false, false, "","年龄"));data.put("columns",columns);
String createTemplate = FreeMarkerUtil.parseTemplate("/", "createTemplate.ftl", data);
System.out.println(createTemplate);
6.结果生成
CREATE TABLE ******.****** (id int AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT 'ID',name text COMMENT '姓名',age text COMMENT '年龄'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
数据插入模板
INSERT INTO ${databaseName}.${table} (${(columns)?join(", ")})
VALUES
<#list values as row>
(<#list row as val><#if val?has_content && val?is_string>'${val?html}'<#elseif val?has_content && val?is_date>{d '${val?date}'}<#elseif val?has_content && val?is_time>{t '${val?time}'}<#elseif val?has_content && val?is_datetime>{ts '${val?datetime}'}<#elseif val?has_content && val?is_boolean>${val?string("TRUE", "FALSE")}<#else>null</#if><#if val_index != row?size - 1>,</#if></#list>)<#if row_index != values?size - 1>,</#if>
</#list>
数据查询模板
SELECT
<#if !(groups?? && groups?size > 0) && !(aggregates?? && aggregates?size > 0)>*
<#else><#if (groups?? && groups?size > 0)><#list groups as group>${group} <#if group_has_next>,</#if></#list></#if><#if (groups?? && groups?size > 0) && (aggregates?? && aggregates?size > 0)>,</#if><#if (aggregates?? && aggregates?size > 0)><#list aggregates as agg>${agg}<#if agg_has_next>,</#if></#list></#if>
</#if>
FROM${tableName}
<#if filterElements??>
WHERE<#list filterElements as filterElement>( <#list filterElement.filters as filter>${filter.columnName} ${filter.functionalOperator} ${filter.values} <#if filter_has_next> ${filter.logicalOperator} </#if></#list> ) <#if filterElement_has_next> ${filterElement.logicalOperator} </#if></#list>
</#if>
<#if isGroup && groups??>
GROUP BY<#list groups as group>${group}<#if group_has_next>,</#if></#list>
</#if>
<#if orders??>
ORDER BY<#list orders as order>${order}<#if order_has_next>,</#if></#list>
</#if>
相关文章:
SpringBoot整合FreeMarker模板引擎
中文官方参考手册 http://freemarker.foofun.cn/ 1.先加入FreeMarker依赖 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version> </dependency>2.新建一个FreeMark…...
编程基础 - 变量与常量
编程基础 - 变量与常量 返回序言及专栏目录 文章目录 编程基础 - 变量与常量前言一、变量是什么?二、为什么要有变量三、局部变量和全局变量四、常量五、只读变量小结 前言 变量是编程最重要知识点之一,从根本上讲,编程就是对数据的操作&a…...
Linux入门攻坚——12、Linux网络属性配置相关知识2
CentOS 7网络属性配置: 传统命名机制:以太网eth[0,1,2,...],wlan[0,1,2...] 可预测功能的命名机制: udev支持多种不同的命名方案: Firmware ,拓扑结构 在对待设备文件这块,Linux改…...
如何自己实现一个分布式事务
实现分布式事务是一个复杂的过程,它需要精心设计并考虑数据的一致性、系统的可用性和分区容错能力。分布式事务确保在分布式系统中,即使是跨多个数据库、服务或消息队列,事务要么完全成功,要么完全失败。 以下是实现分布式事务的…...
使用Nonebot编写QQ机器人
使用 NoneBot 这个工具,来编写 QQ 机器人。 安装基础软件 一、安装 NoneBot 库 直接使用 pip 安装即可 pip install nonebot二、安装酷Q 软件和 HTTP API 插件 酷Q 软件可以直接到官网下载,https://cqp.cc/b/news,或者可以到网盘下载&am…...
认识SpringBoot中的条件注解
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏&…...
使用PAI-DSW搭建基于LangChain的检索知识库问答机器人
教程简述 在本教程中,您将学习如何在阿里云交互式建模(PAI-DSW)中,基于LangChain的检索知识库实现知识问答。旨在建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 LangChain是一个开源的框架,…...
优雅的通过Shell脚本生成Go的程序包
前言 随着Go语言的普及,越来越多的开发人员选择使用Go编写代码。虽然越来越多的公司项目已使用持续集成/持续部署(CI/CD)工具,用于自动化构建、测试和部署Go程序包,但存在一些部署在ECS服务器的Go程序包或需要手动编译…...
益生菌抗癌?补充这种益生菌,抑制肝癌,还改善肠道健康
撰文 | 宋文法 肠道菌群,是人体不可分割的组成部分,生活在我们肠道内的数万亿细菌对健康起着重要作用,它们影响着人的新陈代谢、消化能力、抵御感染、控制人体对药物的反应,甚至还能预防某些癌症。 非酒精性脂肪肝病,是…...
LLM漫谈(二)| QAnything支持任意格式文件或数据库的本地知识库问答系统
一、QAnything介绍 QAnything (Question and Answer based on Anything) 是致力于支持任意格式文件或数据库的本地知识库问答系统,可断网安装使用。 您的任何格式的本地文件都可以往里扔,即可获得准确、快速、靠谱的问答体验。 目前已支持格式: PDF&…...
Linux环境vscode clang-format格式化:vscode clang format command is not available亲测有效!
问题现象 vscode安装了clang-format插件,但是使用就报错 问题原因 设置中配置的clang-format插件工具路径不正确。 解决方案-亲测有效! 确认本地安装了clang-format工具:终端输入clang-format(也可能是clang-format-13等版本…...
Vue3前端 响应式数据 知识点
一、ref(基本类型数据,也可以定义对象类型的响应式数据。此时底层用的还是reactive) ref 创建基本类型的响应式数据 作用:定义响应式变量语法: let xxx ref(初始值)返回值: 一个 RefImp1 的实例对象,简称 ref对象或ref,ref 对象的 value 属…...
golang数据库连接池设置多少比较合适,如何设置?
设置数据库连接池的大小需要综合考虑应用程序的需求、数据库系统的性能、服务器资源等因素。连接池大小的不合理设置可能导致性能问题或资源浪费。 以下是一些建议: 考虑应用程序的并发需求: 连接池的大小应该足够满足应用程序的并发需求。如果你的应用…...
一、Mybatis 简介
本章概要 简介持久层框架对比快速入门(基于Mybatis3方式) 1.1 简介 https://mybatis.org/mybatis-3/zh/index.html MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投G…...
苹果Vision Pro将于1月27日上市!
在无数期待中,苹果全新产品Vision Pro头显终于定下上市日期。 彭博社记者马克古曼(Mark Gurman)于近日在X(前推特)平台爆料了这一信息,预计苹果Vision Pro头显将于2024年1月27日率先在美国上市。 在过去看…...
密码学(一)
文章目录 前言一、Cryptographic Primitives二、Cryptographic Keys2.1 Symmetric key cryptography2.2 asymmetric key cryptography 三、Confidentiality3.1 Symmetric key encryption algorithms3.2 asymmetric key block ciphers3.3 其他 四、Integrity4.1 secure hashing …...
VueRouter
1、用户权限问题 可以在路由全局前置守卫判断当前vuex里是否有token 有token值证明刚才登录过, 无token值证明未登录 router.beforeEach((to, from, next) > {const token store.state.tokenif (token) {// 如果有token, 证明已登录if (!store.state.userInfo.username) {/…...
什么是React.FC | 封装ant design弹框组件之:ant design 修改密码弹框组件
文章目录 一、什么是React.FC组件的 props 是什么意思二、封装ant design弹框组件之:ant design 修改密码弹框组件定义修改密码弹框组件使用修改密码弹框组件:[重要]关于提交时候,不同组件 表单数据共享报错:Button cannot be used as a JSX component.一、什么是React.FC …...
DHCP
一、DHCP 1.1 什么是dhcp DHCP动态主机配置协议,通常被应用在大型的局域网络环境中,主要作用是集中地管理、分配IP地址,使网络环境中的主机动态的获得IP地址、DNS服务器地址等信息,并能够提升地址的使用率。 DHCP作为用应用层协…...
VS code的使用介绍
VS code的使用介绍 简介下载和安装常用的插件使用教程快捷键 集成Git未找到 Git。请安装 Git,或在 "git.path" 设置中配置。操作步骤打开文件夹初始化仓库文件版本控制状态提交文件到git打开git操作栏位 好用的插件ChineseDraw.io Integration实体关系 Gi…...
【蓝桥杯选拔赛真题57】python兔子分胡萝卜 第十四届青少年组蓝桥杯python 选拔赛比赛真题解析
目录 python兔子分胡萝卜 一、题目要求 1、编程实现 2、输入输出...
Spring MVC中JSON数据处理方式!!!
添加json依赖 <!--spring-json依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency> 注解 RequestBody:作…...
学习JavaEE的日子 阶段回顾
标识符 含义:给类、变量、方法、接口取名字的时候使用到的字符序列 组成:大小写字母 、数字、$、_、中文 注意事项: 不能以数字开头 区分大小写字母 不能使用除了$和_以外的特殊符号 不能使用Java的关键字 考虑到编码问题不要使用中文 关…...
深入理解 Flink(一)Flink 架构设计原理
大数据分布式计算引擎设计实现剖析 MapReduce MapReduce 执行引擎解析 MapReduce 的组件设计实现图 Spark 执行引擎解析 Spark 相比于 RM 的真正优势的地方在哪里:(Simple、Fast、Scalable、Unified) DAG 引擎中间计算结果可以进行内存持…...
Python pip 常用指令
前言 Python的pip是一个强大的包管理工具,它可以帮助我们安装、升级和管理Python的第三方库。以下是一些常用的pip指令。 1. 安装第三方库 使用pip安装Python库非常简单,只需要使用pip install命令,后面跟上库的名字即可。 # 安装virtuale…...
Eureka工作原理详解
摘要:本文将详细介绍Eureka的工作原理,包括服务注册、服务发现、心跳检测等关键概念。通过阅读本文,您将了解到Eureka如何实现高可用、可扩展的服务注册中心。 一、引言 在微服务架构中,服务注册与发现是一个重要的环节。为了实…...
开源加解密库之GmSSL
一、简介 GmSSL是由北京大学自主开发的国产商用密码开源库,实现了对国密算法、标准和安全通信协议的全面功能覆盖,支持包括移动端在内的主流操作系统和处理器,支持密码钥匙、密码卡等典型国产密码硬件,提供功能丰富的命令行工具及…...
小程序分销商城,打造高效线上购物体验
小程序商城系统,为您带来前所未有的在线购物体验。它不仅提供线上商城购物、在线下单、支付及配送等功能,还凭借其便捷性成为众多商家的首选。 想象一下,商家可以展示琳琅满目的商品,包括图片、文字描述、价格及库存等详尽信息。而…...
Selenium-java 定位元素时切换iFrame时的方法
具体方法如下图所示,如果iFrame中嵌套多层iFrame需要逐层定位到需要的那一层iFrame,完成操作后,执行该代码:driver.switchTo() .defaultContent() ; 是返回最顶部的frame...
网站后台模板 免费/网站优化的方式有哪些
公司的下午技术茶,听一些大咖谈何为敏捷,聚焦在下面几点敏捷宣言:个人与交互可用的软件客户协作响应变化个人感觉现在大家所谓的敏捷是一种理想状态,我们现有的瀑布模型、双V模型已加入了敏捷的概念,是敏捷思维和传统开…...
深圳微商城网站制作公司/谷歌google下载安卓版 app
出现 #1271 - Illegal mix of collations for operation UNION 的原因是两个字符编码不匹配造成的。 我遇到的是 utf8_general_ci 和 utf8_unicode_ci 这两个编码不匹配, 只要在查询语句的对应列前加 COLLATE utf8_unicode_ci 就可以将 utf8_general_ci 的字符编…...
wordpress 图片无法上传/网站策划书模板
您必须将每个标签输入组合包装在一个元素中,然后将该元素包装在某个容器中.此容器应具有最小宽度,并显示:inline-block ;.然后你让所有的输入项浮动到右边,你已经完成了.这导致了一个非常简单,干净和语义标记与eqaully清洁和可维护的CSS,没有JavaScript,jQuery或其他…...
枣庄专业做网站/seo优化的价格
链接:https://ac.nowcoder.com/acm/contest/330/E 来源:牛客网 题目描述 精通程序设计的 Applese 叕写了一个游戏。 在这个游戏中,有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同。请你帮它统…...
如何为网站做优化/搜索引擎优化排名案例
合作微信:xydf321456Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。1.前言处理机(CPU)是整个计算机系…...
怎样做网站公司/2024很有可能再次封城吗
编写任何javascript程序我们要首先获得对象, jQuery选择器能彻底改变我们平时获取对象的方式, 可以获取几乎任何语意的对象, 比如"拥有title属性并且值中包含test的<a>元素", 完成这些工作只需要编写一个jQuery选择器字符串. 学习jQuery选择器是学习jQuery最重…...