更强大的 code generator 自定义工具
我们以前用 mybatis 的 generator 感觉很爽,通用mapper(tk.mapper) 也很爽,但是。。。


还有更爽的 就是这两种结合 并且 还可以直接生成简单的 service controller 层 还可以包含 swagger
直接上代码:
引入依赖 pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.jcbjcb.tools</groupId> <artifactId>jcbjcb-tools</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>jcbjcb-generator</artifactId> <name>jcbjcb-generator</name> <description>Demo project for Spring Boot</description> <packaging>jar</packaging> <properties> <java.version>1.8</java.version> </properties> <dependencies><!-- <dependency>--><!-- <groupId>com.jcbjcb.tools</groupId>--><!-- <artifactId>jcbjcb-commom</artifactId>--><!-- <version>${project.version}</version>--><!-- </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 通用mapper --> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-generator</artifactId> <version>1.1.5</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.1.5</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.7</version> <configuration> <configurationFile> ${basedir}/src/main/resources/generator/generatorConfig.xml </configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.1.5</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> </dependencies> </plugin> </plugins> </build></project>

generatorConfig.xml

<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration> <properties resource="generator/config.properties"/> <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <plugin type="tk.mybatis.mapper.generator.MapperPlugin"> <property name="mappers" value="tk.mybatis.mapper.common.Mapper,tk.mybatis.mapper.common.MySqlMapper"/> <!-- caseSensitive 是否区分大小写,默认值 false。如果数据库区分大小写,这里就需要配置为 true,这样当表名为 USER 时,会生成 @Table(name = "USER") 注解,否则使用小写 user 时会找不到表。 --><!-- <property name="caseSensitive" value="false"/>--> <!-- forceAnnotation 是否强制生成注解,默认 false,如果设置为 true,不管数据库名和字段名是否一致,都会生成注解(包含 @Table 和 @Column)。 --><!-- <property name="forceAnnotation" value="false"/>--> <!-- beginningDelimiter 和 endingDelimiter 开始和结束分隔符,对于有关键字的情况下适用。--><!-- <property name="beginningDelimiter" value="`"/>--><!-- <property name="endingDelimiter" value="`"/>--> <!-- useMapperCommentGenerator 是否使用通用 Mapper 提供的注释工具,默认 true 使用,这样在生成代码时会包含字段的注释(目前只有 mysql 和 oracle 支持),设置 false 后会用默认的,或者你可以配置自己的注释插件。--><!-- <property name="useMapperCommentGenerator " value="true"/>--> <!-- generateColumnConsts 在生成的 model中,增加字段名的常量,便于使用 Example 拼接查询条件的时候使用。--><!-- <property name="generateColumnConsts" value="`"/> --> <!-- lombok 增加 model 代码生成时,可以直接生成 lombok 的 @Getter@Setter@ToString@Accessors(chain = true) 四类注解, 使用者在插件配置项中增加 <property name="lombok" value="Getter,Setter,ToString,Accessors"/> 即可生成对应包含注解的 model 类。--><!-- <property name="lombok" value="Getter,Setter,ToString,Accessors"/>--> <property name="lombok" value="Data"/> <property name="swagger" value="true"/> </plugin> <!--mapper接口--> <plugin type="tk.mybatis.mapper.generator.TemplateFilePlugin"> <property name="targetProject" value="src/main/java"/> <property name="targetPackage" value="com.jcbjcb.tools.generator.mapper"/> <property name="templatePath" value="file:src\main\resources\generator/template/mapper.ftl"/> <property name="mapperSuffix" value="Mapper"/> <property name="fileName" value="${tableClass.shortClassName}${mapperSuffix}.java"/> <!--默认值是下面这个,可以不配置--> <property name="templateFormatter" value="tk.mybatis.mapper.generator.formatter.FreemarkerTemplateFormatter"/> <property name="encoding" value="UTF-8"/> </plugin> <!--输出单个文件,每个表都会生成一个对应的文件 biz--> <plugin type="tk.mybatis.mapper.generator.TemplateFilePlugin"> <property name="targetProject" value="src/main/java"/> <property name="targetPackage" value="com.jcbjcb.tools.generator.biz"/> <property name="templatePath" value="file:src\main\resources\generator/template/biz.ftl"/> <property name="mapperSuffix" value="Biz"/> <property name="fileName" value="${tableClass.shortClassName}${mapperSuffix}.java"/> <!--默认值是下面这个,可以不配置--> <property name="templateFormatter" value="tk.mybatis.mapper.generator.formatter.FreemarkerTemplateFormatter"/> <property name="encoding" value="UTF-8"/> </plugin> <!--输出单个文件,每个表都会生成一个对应的文件 controller--> <plugin type="tk.mybatis.mapper.generator.TemplateFilePlugin"> <property name="targetProject" value="src/main/java"/> <property name="targetPackage" value="com.jcbjcb.tools.generator.control"/> <property name="templatePath" value="file:src\main\resources\generator/template/controller.ftl"/> <property name="mapperSuffix" value="Controller"/> <property name="fileName" value="${tableClass.shortClassName}${mapperSuffix}.java"/> <!--默认值是下面这个,可以不配置--> <property name="templateFormatter" value="tk.mybatis.mapper.generator.formatter.FreemarkerTemplateFormatter"/> <property name="encoding" value="UTF-8"/> </plugin> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.url}" userId="${jdbc.user}" password="${jdbc.password}"> </jdbcConnection> <javaModelGenerator targetPackage="com.jcbjcb.tools.generator.entity" targetProject="src/main/java"/> <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/><!-- <javaClientGenerator targetPackage="com.jcbjcb.generator.mapper"--><!-- targetProject="src/main/java"--><!-- type="XMLMAPPER"/>--> <table tableName="tab_school"> <generatedKey column="id" sqlStatement="mysql" identity="true"/> </table> </context></generatorConfiguration>

config.properties

jdbc.driverClass = com.mysql.cj.jdbc.Driver jdbc.url = jdbc:mysql://127.0.0.1:3306/school_score?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false jdbc.user = root jdbc.password = root

代码生成模板
biz.ftl

package ${package};import com.jcbjcb.tools.common.biz.BaseBiz;import ${package?substring(0,package?last_index_of('.'))}.mapper.${tableClass.shortClassName}Mapper;import ${tableClass.fullClassName};import org.springframework.stereotype.Service;<#assign dateTime = .now>/*** @description ${tableClass.shortClassName}业务层* @author jcb* @since ${dateTime?string["yyyy-MM-dd HH:mm:ss"]}*/@Servicepublic class ${tableClass.shortClassName}Biz extends BaseBiz<${tableClass.shortClassName}Mapper, ${tableClass.shortClassName}> {}

controller.ftl

package ${package};import com.jcbjcb.tools.common.rest.BaseController;import ${package?substring(0,package?last_index_of('.'))}.biz.${tableClass.shortClassName}Biz;import ${tableClass.fullClassName};import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;<#assign dateTime = .now>/*** @description ${tableClass.shortClassName}控制层* @author jcb* @since ${dateTime?string["yyyy-MM-dd HH:mm:ss"]}*/@RestController@RequestMapping("/${tableClass.variableName}")public class ${tableClass.shortClassName}Controller extends BaseController<${tableClass.shortClassName}Biz, ${tableClass.shortClassName}> {}

mapper.ftl

package ${package};import com.jcbjcb.tools.common.mapper.BaseMapper;import ${tableClass.fullClassName};import org.apache.ibatis.annotations.Mapper;import org.springframework.stereotype.Repository;<#assign dateTime = .now>/** * @description ${tableClass.shortClassName}数据层 * @author jcb * @since ${dateTime?string["yyyy-MM-dd HH:mm:ss"]}*/@Mapper@Repositorypublic interface ${tableClass.shortClassName}Mapper extends BaseMapper<${tableClass.shortClassName}> {}

基础类

BaseMapper.class

package com.jcbjcb.tools.common.mapper;import tk.mybatis.mapper.common.Mapper;import tk.mybatis.mapper.common.MySqlMapper;public interface BaseMapper<T> extends Mapper<T>, MySqlMapper<T> {}

BaseBiz.class

package com.jcbjcb.tools.common.biz;import com.github.pagehelper.Page;import com.github.pagehelper.PageHelper;import com.github.pagehelper.PageInfo;import com.jcbjcb.tools.common.util.Query;import org.springframework.beans.factory.annotation.Autowired;import tk.mybatis.mapper.common.Mapper;import tk.mybatis.mapper.entity.Example;import java.lang.reflect.ParameterizedType;import java.util.List;import java.util.Map;public abstract class BaseBiz<M extends Mapper<T>,T> { @Autowired protected M mapper; public void setMapper(M mapper) { this.mapper = mapper; } public T selectOne(T entity) { return mapper.selectOne(entity); } public T selectById(Object id) { return mapper.selectByPrimaryKey(id); } public List<T> selectList(T entity) { return mapper.select(entity); } public List<T> selectListAll() { return mapper.selectAll(); } public Long selectCount(T entity) { return new Long(mapper.selectCount(entity)); } public void insert(T entity) { mapper.insert(entity); } public void insertSelective(T entity) { mapper.insertSelective(entity); } public void delete(T entity) { mapper.delete(entity); } public void deleteById(Object id) { mapper.deleteByPrimaryKey(id); } public void updateById(T entity) { mapper.updateByPrimaryKey(entity); } public void updateSelectiveById(T entity) { mapper.updateByPrimaryKeySelective(entity); } public List<T> selectByExample(Object example) { return mapper.selectByExample(example); } public int selectCountByExample(Object example) { return mapper.selectCountByExample(example); } public PageInfo<T> selectByQuery(Query query) { Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]; Example example = new Example(clazz); if(query.entrySet().size()>0) { Example.Criteria criteria = example.createCriteria(); for (Map.Entry<String, Object> entry : query.entrySet()) { criteria.andLike(entry.getKey(), "%" + entry.getValue().toString() + "%"); } } Page<Object> result = PageHelper.startPage(query.getPage(), query.getLimit()); List<T> list = mapper.selectByExample(example); return new PageInfo<T>(list); }}

BaseController.class

package com.jcbjcb.tools.common.rest;import com.github.pagehelper.PageInfo;import com.jcbjcb.tools.common.biz.BaseBiz;import com.jcbjcb.tools.common.util.ObjectRestResponse;import com.jcbjcb.tools.common.util.Query;import com.jcbjcb.tools.common.util.TableRestResponse;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;import java.util.List;import java.util.Map;public class BaseController<Biz extends BaseBiz,Entity> { @Autowired protected HttpServletRequest request; @Autowired protected Biz baseBiz; @RequestMapping(value = "",method = RequestMethod.POST) @ResponseBody public ObjectRestResponse<Entity> add(@RequestBody Entity entity){ baseBiz.insertSelective(entity); return new ObjectRestResponse<>(entity); } @RequestMapping(value = "/{id}",method = RequestMethod.GET) @ResponseBody public ObjectRestResponse<Entity> get(@PathVariable int id){ ObjectRestResponse<Entity> entityObjectRestResponse = new ObjectRestResponse<>(); Object o = baseBiz.selectById(id); entityObjectRestResponse.setData((Entity)o); return entityObjectRestResponse; } @RequestMapping(value = "/{id}",method = RequestMethod.PUT) @ResponseBody public ObjectRestResponse<Entity> update(@RequestBody Entity entity){ baseBiz.updateSelectiveById(entity); return new ObjectRestResponse<>(entity); } @RequestMapping(value = "/{id}",method = RequestMethod.DELETE) @ResponseBody public ObjectRestResponse<Entity> remove(@PathVariable int id){ baseBiz.deleteById(id); return new ObjectRestResponse<>(); } @RequestMapping(value = "/all",method = RequestMethod.GET) @ResponseBody public List<Entity> all(){ return baseBiz.selectListAll(); } @RequestMapping(value = "/page",method = RequestMethod.GET) @ResponseBody public TableRestResponse<Entity> list(@RequestParam Map<String, Object> params){ //查询列表数据 Query query = new Query(params); PageInfo<Entity> pageInfo = baseBiz.selectByQuery(query); return new TableRestResponse<>(pageInfo.getList()); }}

最后执行

mvn mybatis-generator:generate 生成代码

或者在idea上mvn插件里面生成


具体代码在 github 上
https://github.com/jcbjcb/jcbjcb-tools