本站建设:代码生成starter

原创 临窗旋墨 2021-06-22 阅读:5299 分类: 专题: 本站建设 标签: ,springboot

003-编码代码生成starter

2020-04-01

说明: 初始的代码生成是直接放在boot-war-web项目的pers.vic.boot.console.generator模块下的, 个人觉得应该抽离成一个starter,更方便集成一些。

另:boot-starter-generator 既可以作为starter集成, 也可以下放开 GeneratorApplication.java上的@SpringBootApplication从而独立运行

一 生成代码的基本思路

  1. 连接数据库获取数据库表的全部信息(本项目暂只实现mysql版本)
    • 支持多种数据库,定义dao接口,不同的数据库做不同的实现,根据配置文件指定Primary
  2. 解析表的基本信息,列的基本信息映射成对象
  3. 编写各层模板(本项目使用的是velocity),根据解析的数据对模板进行填充
  4. 导出填充后的模板

boot-starter-generator 的简单说明

1 配置文件 参考 generator-config.properties
properties 复制代码
#代码生成器,配置信息
#包名
generator.packageName=pers.vic.boot.console
#模块名
generator.moduleName=system
#作者
generator.author=Vic.xu
#Email
generator.email=xuduochoua@163.com
#表前缀(类名不会包含表前缀)
generator.tablePrefix=t_

#实体中忽略的字段(在基类中的字段) 另:列名转换成属性名的时候 is_delete格式会变成delete
#generator.ignores=id,is_enable,is_delete,create_time,update_time
generator.ignores=ID,CREATE_USER_ID,CREATE_TIME,LAST_UPDATE_USER_ID,LAST_UPDATE_TIME,ENABLE_FLAG


#需要填充的模板
generator.templates[0]=generator/templates/Entity.java.vm
generator.templates[1]=generator/templates/Mapper.java.vm
generator.templates[2]=generator/templates/Mapper.xml.vm
generator.templates[3]=generator/templates/Service.java.vm
generator.templates[4]=generator/templates/Controller.java.vm

#数据类型转换,配置信息:数据库类型->java类型
generator.dataTypeConvert.tinyint=Integer
generator.dataTypeConvert.smallint=Inteer
generator.dataTypeConvert.mediumint=Integer
generator.dataTypeConvert.int=Integer
generator.dataTypeConvert.integer=Integer
generator.dataTypeConvert.bigint=Long
generator.dataTypeConvert.float=Float
generator.dataTypeConvert.double=Double
generator.dataTypeConvert.decimal=BigDecimal
generator.dataTypeConvert.bit=Boolean
generator.dataTypeConvert.enum=String

generator.dataTypeConvert.char=String
generator.dataTypeConvert.varchar=String
generator.dataTypeConvert.tinytext=String
generator.dataTypeConvert.text=String
generator.dataTypeConvert.mediumtext=String
generator.dataTypeConvert.longtext=String

generator.dataTypeConvert.date=Date
generator.dataTypeConvert.time=Date
generator.dataTypeConvert.datetime=Date
generator.dataTypeConvert.timestamp=Date
2 代码生成starter 入口 GeneratorAutoconfigigure
  • 根据配置的generator.database 数据库类型, 注册不同的GeneratorDao实现类,本项目暂时已经实现了mysql版本的GeneratorDao;dao的对数据库的查询操作使用的是jdbcTemplate
复制代码
/**
 * @description: 代码生成starter 入口
 * @author: Vic.xu
 * @date: 2020年3月10日 上午10:54:39
 */
@Configuration
@ConditionalOnClass(value = { JdbcTemplate.class })
@ConditionalOnWebApplication
@ConditionalOnExpression("${generatir.enabled:true}")
@EnableConfigurationProperties(GeneratorProperties.class)
public class GeneratorAutoconfigigure {

	/**
	 * 本项目中支持的各个数据库类型
	 */
	@Autowired
	private Collection<GeneratorDao> generatorDaoList;
	
	/**
	 * 当前配置的数据库类型 默认MYSQL
	 */
	@Value("${generator.database:mysql}")
	private String database;

	@Primary
	@Bean
	public GeneratorDao getGeneratorDao() {
		DatabaseType type = DatabaseType.getByName(database);
		Assert.notNull(type, "当前项目未支持" + database + "类型的数据库代码生成");
		GeneratorDao dao = null;
		for(GeneratorDao generatorDao : generatorDaoList) {
			if(type == generatorDao.databaseType()) {
				dao = generatorDao;
				break;
			}
		}
		Assert.notNull(dao, "当前项目未实现" + database + "类型的数据库的GeneratorDao");
		
		return dao;
	}

}
  • 配置类GeneratorProperties
java 复制代码
/** 
 * @description: 附件配置项
 * @author: Vic.xu
 * @date: 2019年12月11日 上午9:33:21
 */
@Configuration
@ConfigurationProperties(prefix = GeneratorProperties.GENERATOR_PREFIX)
@PropertySource("classpath:config/generator-config.properties")
@JsonIgnoreProperties({"beanExpressionResolver"})
public class  GeneratorProperties implements Serializable{
	private static final long serialVersionUID = 1L;

	public static final String GENERATOR_PREFIX = "generator";
	
	@Value("${generator.database:mysql}")
	private String database;
	
	/**
	 * 包名
	 */
	private String packageName;
	
	/**
	 * 包名
	 */
	private String moduleName;
	
	/**
	 * 作者
	 */
	private String author;
	
	/**
	 * email
	 */
	private String email;
	
	/**
	 * 表前缀 若存在则生成的实体名会去掉前缀
	 */
	private String tablePrefix;
	
	/**
	 * 实体中忽略的表字段
	 */
	private Set<String> ignores;
	/**
	 * 大文本类型的数据库数据格式,不应该出现在列表页
	 */
	private Set<String> textTypes;
	
	/**
	 * 需要填充的数据模板
	 */
	private List<String> templates;
	
	/**
	 * 数据类型转换 数据库类型--> java 类型
	 */
	private Map<String, String> dataTypeConvert;
	

	@Override
	public String toString() {
		return "GeneratorProperties [packageName=" + packageName + ",\n moduleName=" + moduleName + ",\n author=" + author
				+ ",\n email=" + email + ",\n tablePrefix=" + tablePrefix + ",\n ignores=" + ignores + ",\n templates="
				+ templates + ",\n dataTypeConvert=" + dataTypeConvert + "]";
	}

	public String getPackageName() {
		return packageName;
	}

	public String getModuleName() {
		return moduleName;
	}

	public String getAuthor() {
		return author;
	}

	public String getEmail() {
		return email;
	}

	public String getTablePrefix() {
		return tablePrefix;
	}

	public Set<String> getIgnores() {
		return ignores;
	}
	
	

	public List<String> getTemplates() {
		return templates;
	}

	public Map<String, String> getDataTypeConvert() {
		return dataTypeConvert;
	}

	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}

	public void setModuleName(String moduleName) {
		this.moduleName = moduleName;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public void setTablePrefix(String tablePrefix) {
		this.tablePrefix = tablePrefix;
	}

	public void setIgnores(Set<String> ignores) {
		this.ignores = ignores;
	}

	public void setTemplates(List<String> templates) {
		this.templates = templates;
	}

	public void setDataTypeConvert(Map<String, String> dataTypeConvert) {
		this.dataTypeConvert = dataTypeConvert;
	}

	/**
	 * @return the database
	 */
	public String getDatabase() {
		return database;
	}

	/**
	 * @param database the database to set
	 */
	public void setDatabase(String database) {
		this.database = database;
	}

	/**
	 * @return the textTypes
	 */
	public Set<String> getTextTypes() {
		return textTypes;
	}

	/**
	 * @param textTypes the textTypes to set
	 */
	public void setTextTypes(Set<String> textTypes) {
		this.textTypes = textTypes;
	}

}
3 测试代码生成GeneratorTest

暂时生成的zip中的文件是放在一个文件夹下,并未分包,可根据需要修改此逻辑

复制代码
//查询当前数据库的表列表
public void list() {}
// 某个表的详情
public void detail() {}
// 导出某个或者多个表生成的
public void export() {}
4 生成的文件包含
  1. 实体依赖BaseEntity等

    java 复制代码
    public class DevelopPlan extends BaseEntity {}
  2. mybatis的xml,包含页面列查询,详情查询,新增,修改,删除等基本操作,参见BaseMapper接口

  3. mapper:依赖BaseMapper

    java 复制代码
    public interface DevelopPlanMapper extends BaseMapper<DevelopPlan> {
    }
  4. service依赖BaseService

    java 复制代码
    @Service
    public class DevelopPlanService extends BaseService<DevelopPlanMapper, DevelopPlan>{}
  5. controller依赖BaseController

    java 复制代码
    @RestController
    @RequestMapping("/develop/plan")
    public class DevelopPlanController extends BaseController<DevelopPlanService, DevelopPlan>{}

三 自动生成的starter的页面 , 使用thymeleaf编写,简单内置页面导出功能

后台管理地址:console.xuqiudong.cc

image-20210917162635503

本项目gitee源码地址

本项目主要生成的模板包括:mapper,mapper.xml, service, controller, 以及前端的list.html和form.html, 可以根据吱声需要 重写generator.templates下的模板文件

评论区

avatar
未登录

暂无评论,来发表第一条评论吧~