# fount4j-generator
**Repository Path**: mark0931/fount4j-generator
## Basic Information
- **Project Name**: fount4j-generator
- **Description**: 基于 Beetl 模板引擎的数据库反向工程项目。内置 MyBatis 的 Entity、Dao、Mapper 文件模板。
- **Primary Language**: Java
- **License**: LGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2016-12-28
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Fount4j Generator
Fount4j Generator 是使用 Java 语言编写的,基于 [Beetl](https://github.com/javamonkey/beetl2.0) 模板引擎的数据库反向工程项目。内置 [MyBatis](https://github.com/mybatis/mybatis-3) 的 Entity、Dao、Mapper 文件模板。
## 特点
- 生成的文件中增加了自定义的内容后,再次生成不会被合并;
- 支持自定义实体类、Dao 类、映射文件的名字,而不像 mybatis-generator 生成为 EntityMapper.java 和 EntityMapper.xml;
- 可以自定义文件的模板,实现深度定制需求;
- 通过自定义解析类,能够很方便地扩展生成器。
## 用法
### 命令行方式启动
1. 下载该项目附件中的压缩包 [下载地址](http://git.oschina.net/mwxx/fount4j-generator/attach_files/download?i=72428&u=http%3A%2F%2Ffiles.git.oschina.net%2Fgroup1%2FM00%2F00%2FC8%2FPaAvDFhzR_iAJPSuACohSV39pXQ018.zip%3Ftoken%3D78ba16323f2a5b523c1d82ea7cf13a5d%26ts%3D1483950089%26attname%3Dfount4j-generator-1.0.0-beta.zip)
2. 解压后将自己使用的数据库驱动 jar 包放入 libs 目录
3. 修改 ./assets/generator.yml 配置文件
4. 运行 start.bat
### 使用项目源码
git clone 或者 [zip 打包下载项目](http://git.oschina.net/mwxx/fount4j-generator/repository/archive/master)
### 使用项目 jar 包
1. 下载项目附件中的 jar 包 [下载地址](http://git.oschina.net/mwxx/fount4j-generator/attach_files/download?i=72429&u=http%3A%2F%2Ffiles.git.oschina.net%2Fgroup1%2FM00%2F00%2FC8%2FPaAvDFhzSAmATntuAAC0hsZsEas142.jar%3Ftoken%3Db8f07b3aea29dcfbef2351b02e385786%26ts%3D1483950089%26attname%3Dfount4j-generator-1.0.0-beta.jar)
2. 将 jar 包加入自己的项目依赖中,编写 Java 代码调用生成器。
3. 在项目目录 assets 目录下新建 generator.yml 配置文件
dataSource:
driverClass: org.h2.Driver
url: jdbc:h2:file:./assets/data/fount4j-generator
user: sa
password: ""
introspectors:
-
type: entity
ignoreTablePrefix: FT_
# 代码路径
resourcePath: ./src/main/resources
packageName: com.fount4j.demo.entity
-
type: dao
resourcePath: ./src/main/resources
packageName: com.fount4j.demo.dao
imports:
- org.springframework.stereotype.Repository
-
type: mapper
resourcePath: ./src/main/resources
packageName: mappers.mysql
# 要生成的表
tables:
-
name: FT_USER
4. 编写代码调用生成器
GeneratorContext context = new YmlGeneratorContext("./config/generator.yml");
Generator generator = new Generator(context);
generator.generate();
## 项目依赖的库
- snakeyaml 用于解析 YAML 配置文件 [下载jar包](http://central.maven.org/maven2/org/yaml/snakeyaml/1.17/snakeyaml-1.17.jar)
- beetl 模板引擎 [下载jar包](http://central.maven.org/maven2/org/beetl/beetl-core/2.2.5/beetl-core-2.2.5.jar)
- antlr4-runtime [下载jar包](http://central.maven.org/maven2/org/antlr/antlr4-runtime/4.2/antlr4-runtime-4.2.jar)
## 帮助
### 配置文件
对 YAML 配置文件不熟悉的可以先通过[YAML 教程](http://www.ruanyifeng.com/blog/2016/07/yaml.html)了解配置文件的语法。
# 需要加入到 classPath 中的 jar 包
classPathEntry:
- "./libs/h2-1.4.193.jar"
dataSource:
class: com.fount4j.generator.introspector.DataSourceIntrospector
driverClass: org.h2.Driver
url: jdbc:h2:file:./assets/data/fount4j-generator
user: sa
password: ""
# 其他属性会在创建数据库连接时传入 DriverManager.getConnection(url, properties) 方法
# 如:MySQL 需要配置“useInformationSchema: "true"”才能获取到表的注释
otherProperty: ""
# 模板配置
template:
# Beetl 配置文件的位置,默认从 ClassPath 加载文件,如以 file: 开头则以绝对路径加载配置
config: ./config/beetl.cfg
# 模板根目录
root: ./template/
# 基础解析器配置,继承 com.fount4j.generator.introspect.TableIntrospectorector 可以实现更多自定义操作
tableIntrospector: com.fount4j.generator.introspector.extend.TableIntrospector
# 表字段解析器
columnIntrospector: com.fount4j.generator.introspector.extend.ColumnIntrospector
introspectors:
-
# 解析器的类路径
class: com.fount4j.generator.introspector.extend.EntityIntrospector
# 模板文件名以及解析结果在模板变量中的键值
infoKey: entity
# 是否生成文件,有的解析器只负责解析参数,不生成文件
generate: true
# 是否忽略数据库表的前缀,多个前缀使用“,”隔开,如“FT_,SYS_”
# 配置该参数后,“FT_USER”表转换实体类名称时,按照表名为“USER”处理
ignoreTablePrefix: FT_
# 代码路径
resourcePath: E:\code\fount4j-generator\src\main\resources
# 实体类包路径
packageName: com.fount4j.demo.entity
# 实体类中要添加的导入,例如放在不同包下面的父类
imports:
- com.fount4j.base.entity.BaseEntity
-
# 项目内部封装了 entity, dao, mapper 三种 type
# 当配置了 type 时,可以不配置 class 以及 infoKey
# type: entity 等同于 class: com.fount4j.generator.introspector.extend.EntityIntrospector infoKey: entity
# type: dao 等同于 class: com.fount4j.generator.introspector.extend.DaoIntrospector infoKey: dao
# type: mapper 等同于 class: com.fount4j.generator.introspector.extend.MyBatisMapperIntrospector infoKey: mapper
type: dao
resourcePath: ./src/main/resources
packageName: com.fount4j.demo.dao
# Dao 类名相对于 Entity 的后缀,如 Entity 为 User,那么 Dao 类的名字会是 UserDao
nameSuffix: Dao
# Dao 中要添加的导入,如 Spring 的 Repository 注解
imports:
- org.springframework.stereotype.Repository
-
class: com.fount4j.generator.introspector.extend.MyBatisMapperIntrospector
infoKey: mapper
resourcePath: ./src/main/resources
packageName: mappers.mysql
nameSuffix: Mapper
# 要生成的表
tables:
-
# 表名,大小写需要与数据库一致
name: FT_USER
# 表的 catalog
catalog: ""
# 表的 schema
schema: PUBLIC
-
name: FT_CONFIG
### 文件自定义内容
在文件中,以注释的方式,在自定义内容前后行增加``````标签,即可在下次生成文件时保持自定义区域不被覆盖。如:
// 这是 Java 类中标注自定义区域的方式
public String toString() {
...
}
//
####
### 修改模板内容
修改模板前建议通过[Beetl 官网](http://ibeetl.com/)了解本项目所使用的模板引擎相关知识。
### 生成的文件 ###
#### 实体类:FtUser.java ####
package com.fount4j.demo.entity;
/**
* 用户表
* FT_USER
*
* @author Fount4j generator
*/
public class FtUser {
/**
* 主键:用户ID
* ID BIGINT(19)
*/
private Long id;
...
/**
* 登录名
* LOGIN_NAME VARCHAR(50)
*/
private String loginName;
/**
* get 主键:用户ID
* ID BIGINT(19)
*
* @return 主键:用户ID
*/
public Long getId() {
return id;
}
...
}
#### Dao 类:FtUserDao.java ####
package com.fount4j.demo.dao;
import com.fount4j.demo.entity.FtUser;
/**
* 用户表 Dao
* FT_USER
*
* @author Fount4j generator
*/
public interface FtUserDao {
/**
* 插入一条记录(忽略空列)
*
* @param record 用户表
* @return 影响的行数
*/
int insertSelective(FtUser record);
/**
* 根据主键删除一条记录
*
* @param key 主键
* @return 影响的行数
*/
int deleteByPrimaryKey(Long key);
/**
* 更新一条记录
*
* @param record 用户表
* @return 影响的行数
*/
int updateByPrimaryKey(FtUser record);
/**
* 更新一条记录(不更新 NULL 的字段)
*
* @param record 用户表
* @return 影响的行数
*/
int updateByPrimaryKeySelective(FtUser record);
/**
* 根据主键查询一条记录
*
* @param key 主键
* @return 用户表
*/
FtUser selectByPrimaryKey(Long key);
}
#### 映射文件:FtUserMapper.xml ####
...
ID,CREATE_TIME,UPDATE_TIME,LOGIN_NAME,REAL_NAME,EMAIL,MOBILE,PASSWORD,STATUS
insert into FT_USER (
ID,
LOGIN_NAME,
...
) values (
#{id,jdbcType=BIGINT},
#{loginName,jdbcType=VARCHAR},
...
)
delete from FT_USER where ID = #{id,jdbcType=BIGINT}
update FT_USER
set
LOGIN_NAME = #{loginName,jdbcType=VARCHAR},
...
where ID = #{id,jdbcType=BIGINT}
update FT_USER
set
LOGIN_NAME = #{loginName,jdbcType=VARCHAR},
...
where ID = #{id,jdbcType=BIGINT}