mybatis-plus逆向工程-根据表生成代码

1,556 阅读3分钟

mybatis-plus功能很强大,可以帮助我们减少写sql的时间。下面就直接进入主题,怎么使用mybatis-plus在springboot项目中,自动生成controller、service、mapper和entity。上才艺。

  • 首先需要再springboot项目的Maven中引入mybatis-plus依赖
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.3.1</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.2</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.3.1</version>
</dependency>
  • 然后创建你想工程类。直接上代码,该工具类一般是与启动类在同一个文件夹,当然你也可以把他放到项目中随意文件夹下都行。
/**
 * mybatisplus自动根据数据库的表生成部分代码,包括,entity、mapper(接口和mapper.xml)、service、controller
 * author yuzi
 */
public class MybatisPlusGenerator {

    //////////******************以下配置根据项目自己手动配置*******************************////////

    //生成文件所在项目路径
    private static String baseProjectPath;
    static{
        baseProjectPath = System.getProperty("user.dir");
    }

    //基本包名
    private static String basePackage = "com.yuzi";
    //作者
    private static String authorName = "yuzi";
    //要生成的表名
    private static String[] tables = {"t_scence"};
    //table前缀
    private static String prefix = "t_";

    //数据库配置四要素
    //数据库类型默认配置的是: DbType.MYSQL ,如有改变修改gen.setDataSource
    private static String driverName = "com.mysql.jdbc.Driver";
    // 配置自己的数据库连接。需要注意mysql8.0的话需要指定时区serverTimezone,否则会报错。
    private static String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai";
    // 数据库连接名
    private static String username = "root";
    // 数据库密码
    private static String password = "密码";

    //模块相关名称
    //controller包名
    private static String controllerName = "controller";
    //实体类包名
    private static String entity = "entity";
    //mapper接口包名
    private static String mapper = "mapper";
    //service接口包名
    private static String service = "service";
    //service实现类包名
    private static String serviceImpl = "service.impl";

    //////////*************************************************////////


    public static void main(String[] args) {


        AutoGenerator gen = new AutoGenerator();

        /**
         * 数据库配置
         */
        gen.setDataSource(new DataSourceConfig()
                .setDbType(DbType.MYSQL)
                .setDriverName(driverName)
                .setUrl(url)
                .setUsername(username)
                .setPassword(password)
                .setTypeConvert(new MySqlTypeConvert() {
                    @Override
                    public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                        System.out.println("转换类型:" + fieldType);
                        return super.processTypeConvert(globalConfig, fieldType);
                    }
                }));

        /**
         * 全局配置
         */
        gen.setGlobalConfig(new GlobalConfig()
                .setOutputDir(baseProjectPath + "/src/main/java")//输出目V1.001__init_task_tables.sql录
                .setFileOverride(false)// 是否覆盖文件
                .setActiveRecord(true)// 开启 activeRecord 模式
                .setEnableCache(false)// XML 二级缓存
                .setBaseResultMap(true)// XML ResultMap
                .setBaseColumnList(true)// XML columList
                .setDateType(DateType.ONLY_DATE)//使用 java.util.date ,否则默认是使用jkd8的 java.time 包下的
                .setOpen(false)//生成后打开文件夹
                .setAuthor(authorName)
                // 自定义文件命名,注意 %s 会自动填充表实体属性!
                .setMapperName("%sMapper")
                .setXmlName("%sMapper")
        );

        /**
         * 策略配置
         */
        gen.setStrategy(new StrategyConfig()
                        // .setCapitalMode(true)// 全局大写命名
                        //.setDbColumnUnderline(true)//全局下划线命名
                        .setTablePrefix(new String[]{prefix})// 此处可以修改为您的表前缀
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                        .setInclude(tables) // 需要生成的表
                        .setRestControllerStyle(true)
                        .setEntityLombokModel(true)
        );

        /**
         * 包配置
         */
        gen.setPackageInfo(new PackageConfig()
                .setParent(basePackage)// 自定义包路径
                .setEntity(entity)
                .setMapper(mapper)
                .setXml("mybatis/mapper")
        );

        /**
         * 注入自定义配置
         */
        // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
        InjectionConfig abc = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };
        //自定义文件输出位置(非必须)
        List<FileOutConfig> fileOutList = new ArrayList<>();
        fileOutList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return baseProjectPath + "/src/main/resources/mybatis/mapper/" + tableInfo.getEntityName() + ".xml";
            }
        });
        abc.setFileOutConfigList(fileOutList);
        gen.setCfg(abc);

        /**
         * 指定模板引擎 默认是VelocityTemplateEngine ,需要引入相关引擎依赖
         */
        gen.setTemplateEngine(new FreemarkerTemplateEngine());

        /**
         * 模板配置
         */
        gen.setTemplate(
                // 关闭默认 xml 生成,调整生成 至 根目录
                new TemplateConfig().setXml(null)
        );

        // 执行生成
        gen.execute();
    }
}
  • 把上述文件配置好执行就可以了,如果小伙伴执行之后发现报错了,并且报错信息如下,是因为缺少模板依赖。
Exception in thread "main" java.lang.NoClassDefFoundError: freemarker/template/Configuration
	at com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine.init(FreemarkerTemplateEngine.java:41)
	at com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine.init(FreemarkerTemplateEngine.java:34)
	at com.baomidou.mybatisplus.generator.AutoGenerator.execute(AutoGenerator.java:103)
	at com.yuzi.MybatisPlusGenerator.main(MybatisPlusGenerator.java:164)
Caused by: java.lang.ClassNotFoundException: freemarker.template.Configuration
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 4 more

需要增加的依赖如下,这里博主使用的是springboot是2.6.4版本,小伙伴需要根据自己的版本修改版本号:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-freemarker</artifactId>
  <version>2.6.4</version>
</dependency>

添加完成之后运行,成功

image.png