# 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}