简介
Mysql Mybatis代码生成工具。
- 根据 Mysql create table DDL 生成表对应的实体,Mybatis Mapper , 表名列名常量,Sql Builder
- 整合 mybatis-dynamic-sql ,支持动态Sql
- 【Mybatis官方插件】自动代码生成的所有功能都支持,除此之外还供了更多的功能,比如 for update 语句,批量插入功能,select语句选择性返回字段等等
使用
<dependency>
<groupId>io.github.wuda0112</groupId>
<artifactId>yhan-code-generator-core</artifactId>
<version>VERSION</version>
</dependency>
<dependency>
<groupId>io.github.wuda0112</groupId>
<artifactId>yhan-code-generator-ddl-parser-mysql</artifactId>
<version>VERSION</version>
</dependency>
<dependency>
<groupId>io.github.wuda0112</groupId>
<artifactId>yhan-code-generator-lang</artifactId>
<version>VERSION</version>
</dependency>
Create Table DDL 解析
String ddl = "CREATE TABLE `my_schema`.`user_basic` (\n" +
"\t`id` INT(10) UNSIGNED NOT NULL,\n" +
"\t`username` VARCHAR(50) NULL DEFAULT NULL,\n" +
"\t`nickname` VARCHAR(50) NULL DEFAULT NULL,\n" +
"\tPRIMARY KEY (`id`),\n" +
"\tUNIQUE INDEX `idx_username` (`username`),\n" +
"\tINDEX `idx_nickname` (`nickname`)\n" +
")";
MySqlCreateTableStatementParser parser = new MySqlCreateTableStatementParser();
List<Table> tables = parser.parse(ddl);
生成实体
EntityGenerator entityGenerator = new EntityGenerator();
JavaFile javaFile = entityGenerator.genJavaFile(table, packageName);
生成表和列的常量
TableMetaInfoGenerator generator = new TableMetaInfoGenerator();
JavaFile javaFile = generator.genJavaFile(table, packageName);
生成Mybatis Mapper
MyBatisMapperGenerator myBatisMapperGenerator = new MyBatisMapperGenerator();
JavaFile javaFile = myBatisMapperGenerator.genJavaFile(table, packageName);
生成Sql Builder
SqlBuilderGenerator generator = new SqlBuilderGenerator();
JavaFile javaFile = generator.genJavaFile(table, packageName);
生成 mybatis-dynamic-sql 所需的SqlTable
SqlTableGenerator generator = new SqlTableGenerator();
JavaFile javaFile = generator.genJavaFile(table, packageName);
快速体验
有完整的Test代码
- GeneratorTestBase.java 中先指定代码生成后的包名,以及在你电脑上存放的位置,比如放在E://code目录下
- EntityGeneratorTest 生成实体类
- MybatisMapperGeneratorTest 生成Mybatis Mapper
- SqlBuilderGeneratorTest 生成SqlBuilder
- TableMetaInfoGeneratorTest 生成表的常量
- SqlTableGeneratorTest 生成mybatis-dynamic-sql所需的SqlTable
- TableTest Create Table DDL解析
特点
- insert,update语句默认都是操作selective模式
- 支持批量insert,并且能返回自增的主键ID
@InsertProvider(
type = UserBasicSqlBuilder.class,
method = "batchInsertUseGeneratedKeys"
)
@Options(
keyProperty = "id",
useGeneratedKeys = true
)
int batchInsertUseGeneratedKeys(@Param("list") List<UserBasic> list);
- 支持for update 语句
@SelectProvider(
type = UserBasicSqlBuilder.class,
method = "selectByPrimaryKeyForUpdate"
)
UserBasic selectByPrimaryKeyForUpdate(@Param("id") Long id,
@Param("retrieveColumns") String[] retrieveColumns);
- 所有的select方法,都不会默认去返回所有列,必须指定返回哪些列,举例,【retrieveColumns】用于指定需要返回的列,放心,不用去写很多字符串,直接使用【UserBasicMetaInfo】中的各种常量即可
UserBasic selectByPrimaryKey(@Param("id") Long id,
@Param("retrieveColumns") String[] retrieveColumns);
- 不仅可以根据主键查询,当表中有索引时,也会生成根据索引查询的方法。当索引是唯一索引时,生成的查询方法,返回值是表对应的实体;其他索引时,生成的查询方法则返回实体的集合,并且输入参数有分页参数 。
比如【username】字段上有唯一索引,则生成的查询方法是,注意返回值和输入参数
@SelectProvider(
type = UserBasicSqlBuilder.class,
method = "selectByUsername"
)
UserBasic selectByUsername(@Param("username") String username,
@Param("retrieveColumns") String[] retrieveColumns);
比如【nickname】字段是有普通索引,则生成的查询方法是,注意返回值和输入参数
@SelectProvider(
type = UserBasicSqlBuilder.class,
method = "selectByNickname"
)
List<UserBasic> selectByNickname(@Param("nickname") String nickname, @Param("offset") int offset,
@Param("rowCount") int rowCount, @Param("retrieveColumns") String[] retrieveColumns);
- 支持【mybatis-dynamic-sql】,提供动态sql能力
@SelectProvider(
type = UserBasicSqlBuilder.class,
method = "selectOneByExample"
)
UserBasic selectOneByExample(
@Param("whereClauseProvider") WhereClauseProvider whereClauseProvider,
@Param("retrieveColumns") String[] retrieveColumns);
@SelectProvider(
type = UserBasicSqlBuilder.class,
method = "selectListByExample"
)
List<UserBasic> selectListByExample(
@Param("whereClauseProvider") WhereClauseProvider whereClauseProvider,
@Param("offset") int offset, @Param("rowCount") int rowCount,
@Param("retrieveColumns") String[] retrieveColumns);
@SelectProvider(
type = UserBasicSqlBuilder.class,
method = "countByExample"
)
int countByExample(@Param("whereClauseProvider") WhereClauseProvider whereClauseProvider);
- 不使用XML文件,使用Java引用的方式,有错误能更容易发现