配置一下代码就出来,MyBatis-Plus又一神器_addtableprefix-程序员宅基地

技术标签: MyBatis-Plus精讲  

学习要求

良好的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<Department> {
}

那么此时的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<Employee> {
}

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:导入相关依赖

<!--代码生成器-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.0</version>
</dependency>

<!--模板依赖-freemarker-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.31</version>
</dependency>

<!--模板依赖-Beetl-->
<dependency>
    <groupId>com.ibeetl</groupId>
    <artifactId>beetl</artifactId>
    <version>3.9.3.RELEASE</version>
</dependency>

<!--模板依赖-Velocity-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

注意上面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() 没有实现,直接丢异常,换新版本即可

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

新版

新版代码生成器指的是mybatis-plus-generator 3.5.1 以上版本,操作最大的变化是使用了lambda语法

以User用户为例子

前面操作操作步骤都一样

步骤1:创建user用户表

步骤2:导入相关依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>

步骤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
                )
                /*.templateConfig(builder -> builder
                        //.entity("entity")                   //指定实体对象模板路径
                        //.service("service",  //指定服务接口模板路径
                        //        "serviceImpl")    //指定服务接口模板路径
                        //.mapper("mapper")                   //指定映射接口模板路径
                        //.mapperXml("xml")                         //指定映射xml文件模板路径
                        //.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();
    }
}

最终结果

总结

从代码简化程度来说还可以,如果有可能,更建议大家手写一个

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/langfeiyes/article/details/122725475

智能推荐

kylin集群解决无法加载到RowKeyWritable类-程序员宅基地

文章浏览阅读74次。问题:cdh集成kylin之后,对kylin的cube进行build操作的时候,在Convert Cuboid Data to HFile步骤报错:Class org..._implementation class missing org.apache.kylin.storage.istor

500 Server Error for HTTP GET “/?url=baidu“-程序员宅基地

文章浏览阅读433次。500 Server Error for HTTP GET "/?url=baidu"_500 server error for http get

OpenHarmony Arkts编译工具链开发_arkts 编译-程序员宅基地

文章浏览阅读717次。拷贝到typescript代码目录下的build_package目录。默认编译的工程为compiler目录下sample工程。_arkts 编译

【CLAPACK函数库】CLAPACK安装与使用,编译好了出现f2c_dgemm,dgesvd_错误主要是camkelist, gcc编译库的顺序要对_lapack函数库怎么用-程序员宅基地

文章浏览阅读1.6k次。参考链接:1、http://forum.ubuntu.org.cn/viewtopic.php?t=297486全部代码下载链接:测试环境:Ubuntu18.04编译之前安装gcc:sudo apt-get install gcc(有问题请搜索百度)make编译虽然可能有错误但是可以生成库暂时不管:当我们下载了CLAPCAK库编译好之后,使用test.c测试出现一下问题:dgesv..._lapack函数库怎么用

python执行hivesql_python 调用shell hive sql-程序员宅基地

文章浏览阅读1k次。def generate_csv_source(data_file):#判断文件是否存在if not os.path.exists(data_file):# 拉取hive表数据cmd_sql = 'hive -e "set hive.cli.print.header=true; \select * from dw.full_d_usr_channel_sum_v3 where ds<>..._python 执行hivesql 修改系统参数

帅到没朋友_7-4 帅到没朋友 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有-程序员宅基地

文章浏览阅读107次。当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。输入格式:输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤1..._7-4 帅到没朋友 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有

随便推点

And-程序员宅基地

文章浏览阅读91次。这道题大暴力就行了我们枚举每一个空,并判断是不是满足题目的条件x i,j=Ai and Aj,就行了,如果是的话,就把他加入数组,如果不是就继续下一个#include&lt;bits/stdc++.h&gt;using namespace std;int n,x[1001][1001];int a[1001][1001];int ans[1001];int main(){ sc...

Unity3D之动画系统和Timeline_unity3d timeline 同时播放几个-程序员宅基地

文章浏览阅读3.6k次。1. 普通动画 由Animation、Animator Controller以及Animator三部分构成,通过选中游戏物体点击Window-&gt;Animation(Ctrl+6)创建,或逐步创建Animation和Animator,Animator创建在物体身上,在Controller中添加相应的Animator Controller,Animation可独立创建在一个文件夹中,然后拖..._unity3d timeline 同时播放几个

算法仿真时,将Excel中真实数据导入simulink中的方法_matlab simulink in端口导入excel-程序员宅基地

文章浏览阅读1.6w次,点赞14次,收藏133次。方法比较有用,记录下来,自己以后还会用到;不然又要四处寻找方法。模拟数据进行算法仿真可行后,需要用到大量的真实试验数据评测算法的可信度;如何将Excel数据导入到simulink中,在此介绍一下自己找到的方法,简单可行。一个用From workspace模块;另一个用Constant模块。情况一:如果需要导入一个随时间变化的变量【From workspace】Excel中第一列为时..._matlab simulink in端口导入excel

JavaScript中的函数与数组-程序员宅基地

文章浏览阅读12次。JavaScript中的函数和数组是实现复杂逻辑和操作数据的重要工具。通过深入理解函数和数组的概念,并熟练掌握相关的语法和操作方法,我们可以更高效地开发JavaScript应用程序。匿名函数是没有名字的函数,可以直接赋值给变量或作为其他函数的参数传递。JavaScript是一种广泛使用的脚本语言,它提供了丰富的功能和数据结构,其中函数和数组是两个非常重要的概念。在本文中,我们将详细介绍JavaScript中的函数和数组,并提供相应的源代码示例。的数组,并使用索引访问和修改其中的元素。表示数组的第一个元素。

10分钟教你用Python爬取Baidu文库全格式内容_python爬取百度文库代码-程序员宅基地

文章浏览阅读2.3k次,点赞4次,收藏27次。返回百度文库,我们仔细看看源代码,其实我们可以发现,随着页面的变化,源代码是不断改变的,每次都只有3张图片的url。并且这个页码数也有一定的规律,如果在第二页,那么图片就是1,2,3,如果在第三页,图片就是2,3,4。但是,从常识来讲,如果网页的内容是异步加载的,那么直接通过百度搜索,是搜索不到网页内部的内容的,但是很显然,我们每次通过百度搜索都是可以直接找到文库中的文本内容的。对待异步加载的数据,我们通常采取的策略有两种,第一个就是直接找到发起异步请求的接口,自己构造请求头,发起请求,第二个就是通过。_python爬取百度文库代码

【数据结构与算法】常用算法_数据结构与算法和机器学习的算法-程序员宅基地

文章浏览阅读98次。五大常用算法分治动态规划贪婪回溯分支界限_数据结构与算法和机器学习的算法