1. 为什么用FreeMarker
简介: FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
总之: 就是使用FreeMarker可以基于模版生成我们所需要的任何文件,并且可以将我们需要的参数引入进去。
2. 如何在Java项目中使用
2.1 引入依赖(pom.xml)
1 | <!--普通Java项目--> |
2.2 文件模版
2.2.1 创建模版文件(hello.ftl)
.ftl一般是freemarker模版的常用后缀
2.2.2 简单编写模版内容(hello.ftl)
1 | 你好:${username} |
2.2.3 编写测试代码(Test.java)
1 |
|
2.3 字符串模版
2.3.1 编写测试代码
1 |
|
3. FreeMarker FTL常用指令
3.1 if指令
规则
1 | <#if 条件> |
测试
1 | <#--测试模版--> |
3.2 list指令
规则
1 | <#--数据名称 as 别名--> |
测试
1 | //java测试代码中例子 |
1 | <#--list指令:循环迭代 语法: 数据名称 as 别名--> |
3.3 include指令
规则
1 | <#--模版包含--> |
测试
1 | <#--include--> |
3.4 assign指令
规则
1 | <#--定义--> |
测试
1 | <#assign model2="zhangsan"> |
4.内置函数
?html
:html字符转义?cap_first
:字符串的第一个字母变为大写形式?lower_case
:字符串的小写形式?upper_case
:字符串的大写形式?trim
:去掉字符串首尾的空格?substring
:截取字符串?length
:取长度?size
:序列中元素的个数?int
:数字的整数部分(比如-1.9?int结果就是-1)
5. 数据库元数据
5.1 什么是元数据
元数据(MetaData),是指定义数据结构的数据。那么数据库元数据就是指定义数据库各类对象结构的数据。例如数据库名称 、表名 、列名 、用户名 、版本名 以及从SQL语句得到的结果中的大部分字符串 是元数据。
5.2 数据库元数据的作用
- 在应用设计时可以充分利用数据库元数据
- 深入数据库组织结构,理解数据访问相关实现原理。
5.3 如何获取元数据
使用JDBC来处理数据库的接口主要有三个,即Connection、PreparedStatement和ResultSet这三个,对于这三个接口,还可以获取不同类型元数据,通过元数据可以获得数据库信息。
数据库元数据 ( DatabaseMetaData ) : 是由Connection对象通过getMetaData方法获取,主要是封装了数据库本身的一些整体综合信息,例如数据库产品名称,数据库版本号,数据库URL,是否支持事务等等。
5.3.1 数据库元数据常用方法
- getDatabaseProductName: 获取数据库的产品名称
- getDatabaseProductName: 获取数据库的版本号
- getUserName: 获取数据库的用户名
- getURL: 获取数据库连接的URL
- getDriverName: 获取数据库驱动名称
- driverVersion: 获取数据库的驱动版本号
- isReadOnly: 查看数据库是否只读
- supportTransactions: 查看数据库是否支持事务
5.3.2 构建环境
1 | <dependency> |
5.3.3 获取数据库基本信息
1 |
|
5.3.4 获取所有数据库名称
1 |
|
5.3.5 获取指定数据库表信息
ResultSet getTables(String catalog, String schemaPattern,String tableNamePattern, String types[])
- catalog
- mysql: 当前操作的数据库
- oralce: 当前操作的数据库
- schemaPattern
- mysql: null
- oracle: 用户名(大写)
- tableNamePattern
- null: 查询所有表
- 非空: 查询目标表
- types
- TABLE: 表
- VIEW: 视图
1 |
|
5.3.6 获取表中的字段信息
ResultSet getColumns(String catalog, String schemaPattern,String tableNamePattern, String columnNamePattern)
可以debug去看
- catalog
- mysql: 当前数据库
- oracle: 当前数据库
- schemaPattern
- mysql: none
- oracle: 用户名(大写)
- tableNamePattern: 表名
- columnNamePattern
- null: 所有列名
- 非空: 某一列名
参数 | 描述 |
---|---|
TABLE_CAT | 表的目录 |
TABLE_SCHEM | 模式的目录 |
TABLE_NAME | 表名 |
COLUMN_NAME | 列名 |
TYPE_NAME | 列的数据类型名称 |
COLUMN_SIZE | 列的大小 |
COLUMN_DEF | 列的默认值 |
ORDINAL_POSITION | 表中列的索引 |
IS_AUTOINCREMENT | 如果列是自动递增的,则返回yes;如果列不是自动递增的,则返回false;如果无法确定,则返回一个空的String(“”)。 |
IS_GENERATEDCOLUMN | 如果该列是生成的列,则返回yes;如果该列不是生成的列,则返回false;如果无法确定,则返回一个空的String(“”)。 |
REMARKS | 列备注 |
1 |
|
5.4 参数元数据
参数元数据 ( ParameterMetaData ):是由PreparedStatement对象通过getParameterMetaData方法获取而来,主要是针对PreparedStatement对象和其预编译的SQL语句提供一些信息,ParameterMetaData能提供占位符参数的个数,获取指定位置占位符的SQL类型等。
方法有多个,但是有作用的只有这一个,其余的不准确
- getParameterCount: 获取预编译SQL语句中占位符参数的个数
1 |
|
5.5 结果集元数据
结果集元数据( ResultSetMetaData ): 是由ResultSet对象通过getMetaData方法获取而来,主要是针对由数据库执行的SQL脚本命令获取的结果集对象ResultSet中提供的一些信息,比如结果集中的列数、指定列的名称、指定列的SQL类型等等,可以说这个事对于框架来说非常重要的一个对象。
以下是有关ResultSetMetaData的常用方法:
- getColumnCount:获取结果集中列的个数
- getColumnType:获取指定列的SQL类型对应于Java中Types类的字段
- getColumnTypeName:获取指定列的SQL类型
- getClassName:获取指定列SQL类型对应于Java中的类型(包加类名)
1 | @Test |
6. 代码生成器分析逻辑
- 用户填写的数据库信息,工程搭建信息需要构造到实体类对象中方便操作
- 数据库表信息,数据库字段信息需要构造到实体类中
- 构造Freemarker数据模型,将数据库表对象和基本配置存入到Map集合中
- 借助Freemarker完成代码生成
- 自定义公共代码模块
7.抽象出的实体类
7.1 数据库实体类
1 | public class Database { |
7.2 表实体类
1 | public class Table { |
7.3 列实体类
1 | public class Column { |