良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架
教学目标了解并掌握MyBatis-Plus代码生成器的实现
视频教程MyBatisPlus实战教程与开发建议
概念代码生成器,顾名思义就是通过程序生成想要的代码。其原理非常简单,可以简单理解为:模板 + 数据 = 输出。
比如:
模板--Mapper.ftl
package ${basepackage}.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import ${basepackage}.${domain}; public interface ${domain}Mapper extends baseMapper<${domain}> { }
数据
{ basepackage:"com.langfeiyes.mp", domain:"Department" }
输入:数据 + 模板
将模板中${占位符} 替换成数据,并将渲染好的结果输出到DepartmentMapper.java文件中
package com.langfeiyes.mp.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import com.langfeiyes.mp.domain.Department; public interface DepartmentMapper extends baseMapper{ }
那么此时的DepartmentMapper.java类就编写好了,后续如果将Department替换成Employee,那么EmployeeMapper.xml也就能快速编写成功。
package com.langfeiyes.mp.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import com.langfeiyes.mp.domainEmployee; public interface EmployeeMapper extends baseMapper{ }
MyBatis-Plus 也提供一套代码生成器-AutoGenerator,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
旧版旧版代码生成器指的是mybatis-plus-generator 3.5.1 以下版本
以User用户为例子
步骤1:创建User数据表
CREATE TABLE `mybatis-plus`.`user` ( `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户id', `username` varchar(255) NULL COMMENT '用户名', `password` varchar(255) NULL COMMENT '密码', PRIMARY KEY (`id`) );
步骤2:导入相关依赖
com.baomidou mybatis-plus-generator3.5.0 org.freemarker freemarker2.3.31 com.ibeetl beetl3.9.3.RELEASE org.apache.velocity velocity-engine-core2.3
注意上面3个模板只需要导入一个即可,默认是Velocity
步骤3:编写代码生成器
package com.langfeiyes.mp.generator; import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.sql.DataSource; @Component public class MyCodeGenerator { @Autowired private DataSource dataSource; //获取数据源-如果没有springboot环境,可以直接调用 private DataSource getDataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); druidDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"); druidDataSource.setUsername("root"); druidDataSource.setPassword("admin"); return druidDataSource; } //获取全局配置 private GlobalConfig getGlobalConfig(){ String projectPath = System.getProperty("user.dir"); GlobalConfig gc = new GlobalConfig.Builder() .outputDir(projectPath + "/src/main/java") //输出目录 .author("dafei") //作者 .openDir(true) //是否打开目录 //.enableSwagger() //是否开启swagger模式 //.fileOverride() //如果文件已经存在则覆盖 .build(); return gc; } //获取包配置 private PackageConfig getPageConfig(){ PackageConfig packageConfig = new PackageConfig.Builder() .parent("com.langfeiyes") //父包名,根包 .moduleName("mp") //模块名 .entity("entity") //指定实体对象包名,默认:entity .service("service") //指定服务接口包名,默认:service .serviceImpl("service.impl") //指定服务接口实现类包名,默认:service.impl .mapper("mapper") //指定映射接口包名,默认:mapper .xml("xml") //指定映射xml文件包名,默认:mapper.xml .controller("controller") //指定controller包名,默认:controller .build(); //构建 return packageConfig; } //获取模板配置 private TemplateConfig getTemplateConfig(){ TemplateConfig templateConfig = new TemplateConfig.Builder() //.entity("entity") //指定实体对象模板路径 //.service("service", //指定服务接口模板路径 // "serviceImpl") //指定服务接口模板路径 //.mapper("mapper") //指定映射接口模板路径 //.mapperXml("xml") //指定映射xml文件模板路径 //.controller("controller") //指定controller模板路径 .build(); //注意,处理自定义模板,一般使用默认的 return templateConfig; } //策略配置 //配置数据库与数据表相关的 public StrategyConfig getStrategy(){ StrategyConfig config = new StrategyConfig.Builder() //.addFieldPrefix("字段前缀") //.addExclude("排除哪些表") //.addInclude("指定哪些表") .addInclude("user") //.addTablePrefix("添加表前缀") .build(); return config; } public void excute() { // 代码生成器 AutoGenerator mpg = new AutoGenerator(new DataSourceConfig.Builder(dataSource).build()) // 全局配置 .global(getGlobalConfig()) // 包配置 .packageInfo(getPageConfig()) //模板配置 .template(getTemplateConfig()) //策略配置 .strategy(getStrategy()) //注入配置 .injection(null); //mpg.execute(new BeetlTemplateEngine()); mpg.execute(new FreemarkerTemplateEngine()); //mpg.execute(new VelocityTemplateEngine()); } }
步骤4:测试
@SpringBootTest public class CodeBuilderTest { @Autowired MyCodeGenerator myCodeGenerator; @Test public void testCode() throws SQLException { myCodeGenerator.excute(); } }
注意:如果是低版本的druid,会包错误:SQLFeatureNotSupportedException
主要是druid数据源中dataSource.getConnection().getSchema() 没有实现,直接丢异常,换新版本即可
新版com.alibaba druid-spring-boot-starter1.2.8
新版代码生成器指的是mybatis-plus-generator 3.5.1 以上版本, *** 作最大的变化是使用了lambda语法
以User用户为例子
前面 *** 作 *** 作步骤都一样
步骤1:创建user用户表
步骤2:导入相关依赖
com.baomidou mybatis-plus-generator3.5.1
步骤3:编写代码生成器代码
package com.langfeiyes.mp.generator; import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.*; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.sql.DataSource; @Component public class MyCodeGenerator { @Autowired private DataSource dataSource; public void excute() { FastAutoGenerator.create(new DataSourceConfig.Builder(dataSource)) .globalConfig(builder -> builder .outputDir(System.getProperty("user.dir") + "/src/main/java") //输出目录 .author("dafei") //作者 //.enableSwagger() //是否开启swagger模式 //.fileOverride() //如果文件已经存在则覆盖 ) .packageConfig(builder -> builder .parent("com.langfeiyes") //父包名,根包 .moduleName("mp") //模块名 .entity("domain") //指定实体对象包名,默认:entity .service("service") //指定服务接口包名,默认:service .serviceImpl("service.impl") //指定服务接口实现类包名,默认:service.impl .mapper("mapper") //指定映射接口包名,默认:mapper .xml("xml") //指定映射xml文件包名,默认:mapper.xml .controller("controller") //指定controller包名,默认:controller ) .strategyConfig(builder -> builder //.addFieldPrefix("字段前缀") //.addExclude("排除哪些表") //.addInclude("指定哪些表") .addInclude("user") //.addTablePrefix("添加表前缀") ) .templateEngine(new FreemarkerTemplateEngine()) .execute(); } }
步骤4:测试
@SpringBootTest public class CodeBuilderTest { @Autowired MyCodeGenerator myCodeGenerator; @Test public void testCode() throws SQLException { myCodeGenerator.excute(); } }
最终结果
总结从代码简化程度来说还可以,如果有可能,更建议大家手写一个
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)