columnConfigMap;
/**
* 是否开启 Mapper 生成。
*/
private Boolean mapperGenerateEnable = Boolean.TRUE;
}
```
## 列配置 `ColumnConfig`
ColumnConfig 支持的配置如下:
```java
public class ColumnConfig implements Serializable {
/**
* 字段名称。
*/
private String columnName;
/**
* insert 的时候默认值,这个值会直接被拼接到 sql 而不通过参数设置。
*/
private String onInsertValue;
/**
* update 的时候自动赋值,这个值会直接被拼接到 sql 而不通过参数设置。
*/
private String onUpdateValue;
/**
* 是否是大字段,大字段 APT 不会生成到 DEFAULT_COLUMNS 里。
*/
private Boolean isLarge;
/**
* 是否是逻辑删除字段,一张表中只能存在 1 一个逻辑删除字段。
*/
private Boolean isLogicDelete;
/**
* 是否为乐观锁字段。
*/
private Boolean version;
/**
* 配置的 jdbcType。
*/
private JdbcType jdbcType;
/**
* 属性的类型。
*
*
原始类型直接写类型名称,例如:int/long/float/double/boolean
* 对象类型请写对应类的全限定名,例如:java.lang.String/com.example.enums.Gender
*/
private String propertyType;
/**
* 属性的默认值,例如:long 类型默认值:0L,枚举类型默认值:Gender.MALE。
*/
private String propertyDefaultValue;
/**
* 自定义 TypeHandler。
*/
private Class extends TypeHandler> typeHandler;
/**
* 脱敏方式。
*/
private String mask;
/**
* 字段是否为主键。
*/
private boolean isPrimaryKey = false;
/**
* ID 生成策略。
*/
private KeyType keyType;
/**
* ID 生成器值。
*/
private String keyValue;
/**
* sequence 序列执行顺序。
*/
private Boolean keyBefore;
/**
* 是否是租户 ID。
*/
private Boolean tenantId;
}
```
## 自定 Entity 的义属性类型
**方式 1:通过 JdbcTypeMapping**
MyBatis-Flex 内置了一个名为:`JdbcTypeMapping` 的 java 类,我们可以用其配置映射 Jdbc 驱动的数据类型为自定义的
数据类型,在开始生成代码之前,可以先调用其进行配置,例如:
```java
JdbcTypeMapping.registerMapping(LocalDateTime.class, Date.class);
```
那么,当我们生成代码的时候,发现 JDBC 驱动的数据类型为 `LocalDateTime`,则 Entity 对应的属性类型为 `Date`。
**方式 2:通过 JdbcTypeMapper**
示例代码如下:
```java
JdbcTypeMapping.setTypeMapper(new JdbcTypeMapping.JdbcTypeMapper() {
@Override
public String getType(String jdbcType, Table table, Column column) {
if (table.getName().equals("tb_sys_permission")
&& column.getName().equals("type")){
return PermissionType.class.getName();
}
return null;
}
});
```
在以上的示例中,如果表名为 `tb_sys_permission` 且 列名为 `type`,生成的 Entity 的属性类型为 `PermissionType`;
> 注意,通过 JdbcTypeMapper 设置的优先级要高于 `JdbcTypeMapping.registerMapping` 设置的内容。
**方式 3:使用 ColumnConfig 定义**
如下方示例代码所示:
```java 4
ColumnConfig columnConfig = new ColumnConfig();
//定义该属性的类型为 java.util.List
columnConfig.setPropertyType("java.util.List");
columnConfig.setTypeHandler(CommaSplitTypeHandler.class);
columnConfig.setColumnName("your_column_name");
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setColumnConfig("your_table_name", columnConfig);
Generator generator = new Generator(dataSource, globalConfig);
generator.generate();
```
## 自定义代码模板
通过 `GlobalConfig`(全局配置)的 `setTemplateEngine()` 方法,可以配置自己的模板引擎以及模板,以下是内置的 `EnjoyTemplate`
的代码示例:
```java
public class EnjoyTemplate implements ITemplate {
private Engine engine;
public EnjoyTemplate() {
Engine engine = Engine.use(engineName);
if (engine == null) {
engine = Engine.create(engineName, e -> {
e.addSharedStaticMethod(StringUtil.class);
e.setSourceFactory(new FileAndClassPathSourceFactory());
});
}
this.engine = engine;
// 以下配置将支持 user.girl 表达式去调用 user 对象的 boolean isGirl() 方法
Engine.addFieldGetterToFirst(new FieldGetters.IsMethodFieldGetter());
}
@Override
public void generate(Map params, String templateFilePath, File generateFile) {
if (!generateFile.getParentFile().exists() && !generateFile.getParentFile().mkdirs()) {
throw new IllegalStateException("Can not mkdirs by dir: " + generateFile.getParentFile());
}
// 开始生成文件
try (FileOutputStream fileOutputStream = new FileOutputStream(generateFile)) {
engine.getTemplate(templateFilePath).render(params, fileOutputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
}
```
## 自定义数据方言
在 MyBatis-Flex 的代码生成器中,已经内置了 4 种方言,他们分别是:
- 默认方言
- MySQL 方言
- Oracle 方言
- SQLite 方言
方言可以通过如下的方式进行使用:
```java 3
Generator generator = new Generator(dataSource
, globalConfig
, IDialect.ORACLE); //使用哪个方言
generator.generate();
```
> 不传入方言的情况下,使用默认方言。
针对不同的数据库,我们也可以通过自定义方言来实现代码生成,例如:
MyDialect.java
```java
class MyDialect implements IDialect {
//重写相关构建方法
}
```
开始使用 MyDialect
```java 3
Generator generator = new Generator(dataSource
, globalConfig
, new MyDialect()); //使用哪个方言
generator.generate();
```
## 添加其他产物的生成
通过实现 `IGenerator` 来实现,比如 Entity 实体类的代码如下:
```java
public class EntityGenerator implements IGenerator {
private String templatePath = "/templates/enjoy/entity.tpl";
@Override
public void generate(Table table, GlobalConfig globalConfig) {
if (!globalConfig.isEntityGenerateEnable()) {
return;
}
PackageConfig packageConfig = globalConfig.getPackageConfig();
EntityConfig entityConfig = globalConfig.getEntityConfig();
String entityPackagePath = packageConfig.getEntityPackage().replace(".", "/");
File entityJavaFile = new File(packageConfig.getSourceDir(), entityPackagePath + "/" +
table.buildEntityClassName() + ".java");
if (entityJavaFile.exists() && !entityConfig.isOverwriteEnable()) {
return;
}
Map params = new HashMap<>(4);
params.put("table", table);
params.put("entityConfig", entityConfig);
params.put("packageConfig", packageConfig);
params.put("javadocConfig", globalConfig.getJavadocConfig());
globalConfig.getTemplateConfig().getTemplate().generate(params, templatePath, entityJavaFile);
}
}
```
如果我们想生成其他产物,比如 `html` ,可以通过编写自己的类,来实现 IGenerator 接口,例如:
```java
public class HtmlGenerator implements IGenerator {
@Override
public void generate(Table table, GlobalConfig globalConfig) {
//在这里生成 html 代码
}
}
```
最后,通过 `GeneratorFactory` 来注册 `HtmlGenerator` 即可:
```java
GeneratorFactory.registerGenerator("html",new HtmlGenerator());
```
## 注意事项!!!
在 MySQL 或者 Oracle 的某些版本中,代码生成器可能无法获取 `表` 或者 `字段` 的注释内容,我们在数据源配置时,注意添加如下的配置信息:
**MySQL**
JdbcUrl 上注意添加 `useInformationSchema=true` 配置,如下代码所示:
```java
HikariDataSource dataSource = new HikariDataSource();
//注意:url 需添加上 useInformationSchema=true 才能正常获取表的注释
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/db?useInformationSchema=true&characterEncoding=utf-8");
dataSource.setUsername("username");
dataSource.setPassword("password");
```
**Oracle**
JdbcUrl 上注意添加 `remarksReporting=true` 配置,如下代码所示:
```java
HikariDataSource dataSource = new HikariDataSource();
//注意:url 需添加上 remarksReporting=true 才能正常获取表的注释
dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl?remarksReporting=true");
dataSource.setUsername("username");
dataSource.setPassword("password");
```