这一章主要是完成代码生成的模块,用到的工具是 freemaker ,在完成代码生成模块的同时会完成小节部分的代码。
freemaker 的基本用法
一般来说一个 freemaker 的模版基本会包括下面四部分。
文本:直接输出的部分
注释:<#–2333–>格式部分,不会输出
插值:即${…}或#{…}格式的部分,将使用数据模型中的部分替代输出
FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出
引入 freemaker
首先在 course 的依赖管理中添加 freemaker 依赖:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.29</version>
</dependency>
然后在 course 中新建 generator 包作为代码生成模块,pom 文件中添加 freemaker 依赖。
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
数据库持久层生成
mabatis generator 生成持久层
修改 server 中 resource 的 generatorConfig 最后的 tableName 和 domainObjectName 。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 添加后sql语句中的关键字和表用``区分-->
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<!-- 生成xml文件自动覆盖之前的文件 -->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<!-- 生成实例类的tostring方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!-- 删除所有注释-->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--连接数据库,修改自己的数据库名用户名密码-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/course"
userId="root"
password="czj666666">
</jdbcConnection>
<!-- domain类的位置 -->
<javaModelGenerator targetProject="src/main/java"
targetPackage="com.course.server.domain"/>
<!-- mapper xml的位置 -->
<sqlMapGenerator targetProject="src/main/resources"
targetPackage="mapper"/>
<!-- mapper类的位置 -->
<javaClientGenerator targetProject="src/main/java"
targetPackage="com.course.server.mapper"
type="XMLMAPPER" />
<!-- <table tableName="test" domainObjectName="Test"></table>-->
<!-- <table tableName="chapter" domainObjectName="Chapter"></table>-->
<table tableName="section" domainObjectName="Section"></table>
</context>
</generatorConfiguration>
运行 mybatis-generator 后生成持久层代码。
生成数据库表
这里用之前的 doc/db/all.sql 来生成数据库表,并添加数据。
drop table if exists `section`;
create table `section` (
`id` char(8) not null default '' comment 'ID',
`title` varchar(50) not null comment '标题',
`course_id` char(8) comment '课程|course.id',
`chapter_id` char(8) comment '大章|chapter.id',
`video` char(200) comment '视频',
`time` int comment '时长|单位秒',
`charge` char(1) comment '收费|C 收费;F 免费',
`sort` int comment '顺序',
`created_at` DATETIME(3) comment '创建时间',
`updated_at` datetime(3) comment '修改时间',
primary key (`id`)
)engine=innodb default charset=utf8mb4 comment='小节';
insert into `section` (id, title, course_id, chapter_id, video, time, charge, sort, created_at, updated_at)
values ('00000001','测试小节01','00000001','00000000','',500,'F',1,now(),now());
控制层服务层模版文件
freemaker 工具类
在 generator 模块中,创建如下结构的包。ftl 包存放 freemaker 模版文件,控制层和服务层代码都由这里的 ftl 模版生成;util 包存放 freemaker 工具类,server 中的 main 方法会调用抽离的工具类;server 中包含生成代码的 main 方法。
这里首先创建了一个 freemaker 的工具类。其中包含了 init 方法和 generator 方法。
其中 init 方法的作用是初始化 freemaker 设置,加载模版文件;generatro 方法的作用是生成文件并写入 map 对应的代码。
package com.course.generator.util;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
public class FreemarkerUtil {
static Template temp;
public static void initConfig(String ftlPath,String ftlName) throws IOException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_29);
cfg.setDirectoryForTemplateLoading(new File(ftlPath));
cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_