FreeMarker
是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML
网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java
类库,是一款程序员可以嵌入他们所开发产品的组件。
下面使用测试类来说明FreeMarker
的基本用法,其实FreeMarker
就是一个模板引擎,和thymeleaf
和beetle
等都是一个品种的,FreeMarker
最初的目的只是为了渲染html
页面的,不过它可以渲染任何文件,只要你遵循它指定好的语法即可!
首先创建好一个基本的springboot
工程,然后导入FreeMarker
依赖,然后就可以开始测试了。
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>2.3.28version>
dependency>
说明:文件路径加载器加载的是存放模板的文件夹的绝对路径,数据模型是Map
,给里面存放数据即可,process
方法的参数1是数据模型,参数2是Writer
对象,执行此方法FreeMarker
会自动渲染页面。
@Test
public void test0() throws Exception {
//1,创建FreeMarker的配置类
Configuration cfg=new Configuration();
//2,指定模板加载器,将模板加入缓存中
//文件路径加载器,获取到templates文件的路径
String templates = this.getClass().getClassLoader().getResource("templates").getPath();
FileTemplateLoader fileTemplateLoader=new FileTemplateLoader(new File(templates));
cfg.setTemplateLoader(fileTemplateLoader);
//3,获取模板
Template template = cfg.getTemplate("test.ftl");
//4,构造数据模型
Map<String,Object> map=new HashMap<String, Object>();
map.put("username","测试人员");
map.put("password",1234);
List<String> list=new ArrayList<>();
list.add("第一个");
list.add("第二个");
map.put("list",list);
//5,文件输出
/**
* 处理模型
* 参数一 数据模型
* 参数二 writer对象(FileWriter(文件输出),printWriter(控制台输出))
*/
// template.process(map,new FileWriter(new File("D:\\a.txt")));
template.process(map,new PrintWriter(System.out));
}
test.ftl
模板
<#-- assign指令 在ftl模板中定义数据存入到root节点下 -->
<#assign name="傻子">
<#--然后就可以取出name的值-->
${name}
你好,${username}
<#--- if指令 -->
<#if password=1234>
简单密码
<#elseif password=123456>
一般密码
<#else>
复杂密码
</#if>
<#-- list指令 迭代循环 -->
<#list list as abc>
${abc}
</#list>
<#--模板包含,这样生成模板test.ftl的时候同时会包含模板test2.ftl-->
<#include "test2.ftl">
//字符串模板
public static void main(String[] args) throws Exception {
//1,创建配置对象
Configuration cfg=new Configuration();
//2,指定加载器
cfg.setTemplateLoader(new StringTemplateLoader());
//3,创建字符串模板
//字符串
String templateString="欢迎您,${username}";
//通过字符串创建模板
Template template=new Template("templateNames",new StringReader(templateString),cfg);
//4,构造数据
Map<String,Object> map=new HashMap<String, Object>();
map.put("username","测试人员");
map.put("password",1234);
List<String> list=new ArrayList<>();
list.add("第一个");
list.add("第二个");
map.put("list",list);
//5,处理模板
template.process(map,new PrintWriter(System.out));
}
@Test
public void test01() throws Exception{
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";//没有指定具体哪个数据库,现在获取的是整个连接
String username="root";
String password="1234";
//获取连接
Class.forName(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, username,password);
//获取元数据
DatabaseMetaData metaData = connection.getMetaData();
//获取数据库基本信息
System.out.println(metaData.getUserName());
System.out.println(metaData.supportsTransactions());//是否支持事务
System.out.println(metaData.getDatabaseProductName());//数据库类型(MYSQL)
connection.close();
/**
* 打印结果如下
* root@localhost
* true
* MySQL
*/
}
@Test
public void test2() throws Exception{
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";//没有指定具体哪个数据库,现在获取的是整个连接
String username="root";
String password="1234";
//获取连接
Class.forName(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, username,password);
//获取元数据
DatabaseMetaData metaData = connection.getMetaData();
//获取数据库列表名称
ResultSet resultSet = metaData.getCatalogs();
while (resultSet.next()){
System.out.println(resultSet.getString(1));
}
resultSet.close();
connection.close();
/**
* 打印连接中的所有数据库名称
* activiti
* dage
* dk
* dk1
* dk_front
* dk_front1
* information_schema
* laji
* light_master
* mysql
* performance_schema
* sakila
* solr
* sys
* test
* workflow
* world
*/
}
打印出该数据库下的所有表名。
@Test
public void test3() throws Exception{
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/laji?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true";//指定了数据库
String username="root";
String password="1234";
//获取连接
Class.forName(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, username,password);
//获取元数据
DatabaseMetaData metaData = connection.getMetaData();
//获取数据库中表信息(mysql可以这样写,oracle会有一点区别)
//参数1:当前操作的数据库 参数2:mysql可为空,oracle填写用户名(要大写) 参数3:null是查询所有表 非空是查询目标表 参数4:类型 table是表,view是视图
ResultSet resultSet = metaData.getTables("laji", null, null, new String[]{"TABLE"});
while (resultSet.next()){
//会打印出该数据库下的所有表名
System.out.println(resultSet.getString("TABLE_NAME"));
}
resultSet.close();
connection.close();
}
打印出指定表的所有字段名。
public static void main(String[] args) throws Exception{
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/laji?characterEncoding=utf8&serverTimezone=UTC";//指定了数据库
String username="root";
String password="1234";
//获取连接
Class.forName(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, username,password);
//获取元数据
DatabaseMetaData metaData = connection.getMetaData();
ResultSet city = metaData.getColumns("laji", null, "user", null);
while (city.next()){
//会打印出指定表的所有字段名
System.out.println(city.getString("COLUMN_NAME"));
}
}
/**
* 测试参数元数据
* 通过preparedStatement获取
* 目的:获取sql参数中的属性信息
*/
@Test
public void test4() throws Exception{
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/laji?characterEncoding=utf8&serverTimezone=UTC";//指定了数据库
String username="root";
String password="1234";
//获取连接
Class.forName(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, username,password);
String sql="select * from user where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,1);//设第一个参数为int 1
//获取参数元数据
ParameterMetaData metaData = preparedStatement.getParameterMetaData();
//得到参数的个数
int count = metaData.getParameterCount();//打印 1 (只有一个id参数)
System.out.println(count);
preparedStatement.close();
connection.close();
}
@Test
public void test5() throws Exception{
String driver="com.mysql.cj.jdbc.Driver";
String url="jdbc:mysql://127.0.0.1:3306/laji?characterEncoding=utf8&serverTimezone=UTC";//指定了数据库
String username="root";
String password="1234";
//获取连接
Class.forName(driver);//注册驱动
Connection connection = DriverManager.getConnection(url, username,password);
String sql="select * from user where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,1);//设第一个参数为int 1
//查询
ResultSet resultSet = preparedStatement.executeQuery();
//获取结果集元数据
ResultSetMetaData metaData = resultSet.getMetaData();
//获取查询字段个数
int count = metaData.getColumnCount();
for(int i=1;i<=count;i++){
//获取列名
String columnName = metaData.getColumnName(i);//第i个列
//获取字段类型 sql类型 varchar
int columnType = metaData.getColumnType(i);
//获取java类型 String
String columnClassName = metaData.getColumnClassName(i);
System.out.println(columnName+"---"+columnType+"---"+columnClassName);
}
preparedStatement.close();
connection.close();
}
/**
* 打印
* id---4---java.lang.Integer
* account---12---java.lang.String
* password---12---java.lang.String
* islogin---4---java.lang.Integer
*/
DataBase
实体
package com.ftx.demo.model;
/**
* @author FanJiangFeng
* @version 1.0.0
* @ClassName DataBase.java
* @Description TODO
* @createTime 2020年04月23日 14:15:00
*/
public class DataBase {
private static String mysqlUrl="jdbc:mysql://[ip]:[port]/[db]?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC";
private static String oracleUrl="jdbc:oracle:thin:@[ip]:[port]:[db]";
private String dbType;//数据库类型
private String userName;
private String passWord;
private String driver;
private String url;
public DataBase(){}
public DataBase(String dbType){
this(dbType,"127.0.0.1","3306","");
}
public DataBase(String dbType,String db){
this(dbType,"127.0.0.1","3306",db);
}
/**
*
* @param dbType 数据库类型 mysql/oracle
* @param ip ip
* @param port 3306
* @param db 数据库名称 test
*/
public DataBase(String dbType,String ip,String port,String db){
this.dbType=dbType;
if("MYSQL".equals(dbType.toUpperCase())){
this.driver="com.mysql.cj.jdbc.Driver";
this.url=mysqlUrl.replace("[ip]",ip).replace("[port]",port).replace("[db]",db);
}else{
this.driver="oracle.jdbc.driver.OracleDriver";
this.url=oracleUrl.replace("[ip]",ip).replace("[port]",port).replace("[db]",db);
}
}
}
Settings
实体
public class Settings {
private String project="example";
private String pPackage="com.example.demo";
private String projectComment;
private String author;
private String path1="com";
private String path2="example";
private String path3="demo";
private String pathAll;
}
Table
实体
//表实体
public class Table {
private String name;//表名称
private String name2;//处理后的表名称
private String comment;//介绍
private String key;//主键列
private List<Column> columnList;
Column
实体
public class Column {
private String columnName;//列名称
private String columnName2;//处理后的列名称
private String columnType;//列类型
private String columnDbType;//列在数据库中的类型
//本工程暂不处理备注和主键
private String columnComment;//列备注id
private String columnKey;//是否是主键
FileUtils
工具类
该工具类用到的主要是 查询整个目录的文件夹 和 递归获取某个目录下的所有文件夹 的方法
package com.ftx.demo.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
//文件处理工具类
public class FileUtils {
//得到相对路径
public static String getRelativePath(File baseDir,File file){
if(baseDir.equals(file)){
return "";
}
if(baseDir.getParentFile()==null){
return file.getAbsolutePath().substring(baseDir.getAbsolutePath().length());
}else{
return file.getAbsolutePath().substring(baseDir.getAbsolutePath().length()+1);
}
}
//查询整个目录下的所有文件
public static List<File> searchAllFile(File dir) throws IOException {
ArrayList arrayList=new ArrayList();
searchFiles(dir,arrayList);
return arrayList;
}
//递归获取某个目录下的所有文件
public static void searchFiles(File dir,List<File> collector){
if(dir.isDirectory()){
File[] files = dir.listFiles();
for(int i=0;i<files.length;i++){
searchFiles(files[i],collector);
}
}else{
collector.add(dir);
}
}
//创建文件
public static File mkdir(String dir,String file){
if(dir==null){
throw new IllegalArgumentException("文件夹不许为空");
}
File result=new File(dir,file);
if(result.getParentFile()!=null){
result.getParentFile().mkdirs();
}
return result;
}
}
PropertiesUtils
工具类
此工具类说明:静态代码块预加载,将自定义的配置文件properties
的内容全部加载到customMap
中,然后在其他类中调用此类获取customMap
中的键值对(键值对就是字都应以配置文件中所配置的内容)
package com.ftx.demo.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
//需要将自定义的配置信息写入到properties文件中,配置到相对于工程的properties文件下
public class PropertiesUtils {
public static Map<String,String> customMap=new HashMap<>();
//静态块,预加载,将自定义的配置文件properties的内容全部加载到customMap中
static {
File dir=new File("properties");
try {
List<File> files = FileUtils.searchAllFile(new File(dir.getAbsolutePath()));
for(File file:files){
if(file.getName().endsWith("properties")){
Properties prop=new Properties();
prop.load(new FileInputStream(file));
customMap.putAll((Map)prop);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//测试预加载是否成功(看是否打印出了properties配置文件的key和value)
public static void main(String[] args) {
for(String key:customMap.keySet()){
System.out.println(key+"---"+customMap.get(key));
}
}
}
DataBaseUtils
工具类
方法介绍:
1,获取数据库连接
2,获取数据库列表
3,获取数据库中的所有表和字段并构造实体类
4,根据表名的截取操作生成类名
package com.ftx.demo.util;
import com.ftx.demo.model.Column;
import com.ftx.demo.model.DataBase;
import com.ftx.demo.model.Table;
import org.junit.Test;
import javax.servlet.http.HttpSession;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class DataBaseUtils {
//获取数据库连接
public static Connection getConnection(DataBase db) throws Exception{
//获取连接
Class.forName(db.getDriver());//注册驱动
Connection connection = DriverManager.getConnection(db.getUrl(), db.getUserName(),db.getPassWord());
return connection;
}
//获取数据库列表
public static List<String> getShemas(DataBase db) throws Exception{
Connection connection = getConnection(db);
//获取元数据
DatabaseMetaData metaData = connection.getMetaData();
//获取所有数据库列表
ResultSet resultSet = metaData.getCatalogs();
List<String> list=new ArrayList<>();
while(resultSet.next()){
list.add(resultSet.getString(1));
}
resultSet.close();
connection.close();
return list;
}
//获取数据库中的所有表和字段并构造实体类(相当于一键生成数据库中所有表的增删改查代码)
public static List<Table> getDbInfo(DataBase db, HttpSession session) throws Exception{
//获取连接
Connection connection = getConnection(db);
//获取元数据
DatabaseMetaData metaData = connection.getMetaData();
List<Table> list=new ArrayList<>();
//获取当前数据库的所有表
String dbss=(String) session.getAttribute("db");
ResultSet tables = metaData.getTables(dbss, null, null, new String[]{"TABLE"});
while (tables.next()){
//表名
String table_name = tables.getString("TABLE_NAME");
//构造生成对应实体类的类名
String className = removePrefix(table_name);
//主键
ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, table_name);
//对主键遍历的原因(或许一张表有多个主键)
String keys="";
while (primaryKeys.next()){
String keyName = primaryKeys.getString("COLUMN_NAME");
keys+=keyName+",";
}
Table tab=new Table();
tab.setName(table_name);
tab.setName2(className);
tab.setKey(keys);
//处理表中的所有字段
ResultSet columns = metaData.getColumns(dbss, null, table_name, null);
List<Column> cols=new ArrayList<>();
while (columns.next()){
Column column=new Column();
//列名称
String column_name = columns.getString("COLUMN_NAME");
//java实体的属性名
String attName = column_name;
//java类型和数据库类型
String type_name = columns.getString("TYPE_NAME");
String javaType = PropertiesUtils.customMap.get(type_name);
column.setColumnName(column_name);
column.setColumnName2(attName);
column.setColumnDbType(type_name);
column.setColumnType(javaType);
cols.add(column);
}
tab.setColumnList(cols);
list.add(tab);
//关闭连接,释放资源
columns.close();
primaryKeys.close();
}
tables.close();
connection.close();
return list;
}
//根据表名的截取操作生成类名
public static String removePrefix(String tableName){
//从自定义的配置文件中拿到前缀的配置
String prefixes = PropertiesUtils.customMap.get("tableRemovePrefixes");
//这里就不字符串处理了,直接把表名当类名用了
String replace = tableName;
return replace;
}
// 测试 获取数据库中的所有表和字段并构造实体类 的方法是否可用
// public static void main(String[] args) throws Exception {
// DataBase db=new DataBase("MYSQL","laji");
// db.setUserName("root");
// db.setPassWord("1234");
// List