• MyBatis-Plus快速开发


    1. 代码生成器原理分析

    观察我们之前写的代码,会发现其中也会有很多重复内容,比如:

    在这里插入图片描述

    那我们就想,如果我想做一个Order模块的开发,是不是只需要将内容全部更换成Order即可,如:

    在这里插入图片描述

    所以我们会发现,做任何模块的开发,对于这段代码,基本上都是对红色部分的调整,所以我们把去掉红色内容的东西称之为模板,红色部分称之为参数,以后只需要传入不同的参数,就可以根据模板创建出不同模块的dao代码。

    除了Dao可以抽取模块,其实我们常见的类都可以进行抽取,只要他们有公共部分即可。再来看下模型类的模板:

    在这里插入图片描述

    • ① 可以根据数据库表的表名来填充
    • ② 可以根据用户的配置来生成ID生成策略
    • ③可以根据数据库表字段名称来填充

    所以只要我们知道是对哪张表进行代码生成,这些内容我们都可以进行填充。

    分析完后,我们会发现,要想完成代码自动生成,我们需要有以下内容:

    • 模板:MyBatisPlus提供,可以自己提供,但是麻烦,不建议
    • 数据库相关配置:读取数据库获取表和字段信息
    • 开发者自定义配置:手工配置,比如ID生成策略

    2. 代码生成器实现

    步骤1:创建一个Maven项目

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    代码2:导入对应的jar包

    
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0modelVersion>
    	<parent>
    		<groupId>org.springframework.bootgroupId>
    		<artifactId>spring-boot-starter-parentartifactId>
    		<version>2.7.6version>
    		<relativePath/> 
    	parent>
    	<groupId>com.dcxuexigroupId>
    	<artifactId>springboot_mp_05_generatorartifactId>
    	<version>0.0.1-SNAPSHOTversion>
    	<name>springboot_mp_05_generatorname>
    	<description>Demo project for Spring Bootdescription>
    	<properties>
    		<java.version>1.8java.version>
    	properties>
    	<dependencies>
    		
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-webartifactId>
    		dependency>
    		
    		<dependency>
    			<groupId>com.baomidougroupId>
    			<artifactId>mybatis-plus-boot-starterartifactId>
    			<version>3.4.1version>
    		dependency>
    		
    		<dependency>
    			<groupId>com.alibabagroupId>
    			<artifactId>druidartifactId>
    			<version>1.2.11version>
    		dependency>
    		
    		<dependency>
    			<groupId>org.projectlombokgroupId>
    			<artifactId>lombokartifactId>
    			<version>1.18.24version>
    		dependency>
    		
    		<dependency>
    			<groupId>com.baomidougroupId>
    			<artifactId>mybatis-plus-generatorartifactId>
    			<version>3.4.1version>
    		dependency>
    		
    		<dependency>
    			<groupId>org.apache.velocitygroupId>
    			<artifactId>velocity-engine-coreartifactId>
    			<version>2.3version>
    		dependency>
    		
    		<dependency>
    			<groupId>com.mysqlgroupId>
    			<artifactId>mysql-connector-jartifactId>
    			<scope>runtimescope>
    		dependency>
    		
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-testartifactId>
    			<scope>testscope>
    		dependency>
    	dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.bootgroupId>
    				<artifactId>spring-boot-maven-pluginartifactId>
    			plugin>
    		plugins>
    	build>
    
    project>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79

    步骤3:编写引导类

    @SpringBootApplication
    public class SpringbootMp05GeneratorApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringbootMp05GeneratorApplication.class, args);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    步骤4:创建代码生成类

    package com.dcxuexi;
    
    
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    import com.baomidou.mybatisplus.annotation.IdType;
    /***
     * @Title CodeGenerator
     * @Description TOTD
     * @Auter DongChuang
     * @Date 2022/11/26 16:34
     * @Version 1.0.0
     */
    public class CodeGenerator {
        public static void main(String[] args) {
            //1.获取代码生成器的对象
            AutoGenerator autoGenerator = new AutoGenerator();
    
            //设置数据库相关配置
            DataSourceConfig dataSourceConfig = new DataSourceConfig();
    
            dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
            dataSourceConfig.setUrl("jdbc:localhost:3306/mybatis");
            dataSourceConfig.setUsername("root");
            dataSourceConfig.setPassword("root");
            autoGenerator.setDataSource(dataSourceConfig);
    
            //设置全局配置
            GlobalConfig globalConfig = new GlobalConfig();
            globalConfig.setOutputDir(System.getProperty("user.dir")+"/springboot_mp_05_generator/src/main/java");    //设置代码生成位置
            globalConfig.setOpen(false);    //设置生成完毕后是否打开生成代码所在的目录
            globalConfig.setAuthor("DongChuang");    //设置作者
            globalConfig.setFileOverride(true);     //设置是否覆盖原始生成的文件
            globalConfig.setMapperName("%sDao");    //设置数据层接口名,%s为占位符,指代模块名称
            globalConfig.setIdType(IdType.AUTO);   //设置Id生成策略
            autoGenerator.setGlobalConfig(globalConfig);
    
            //设置包名相关配置
            PackageConfig packageInfo = new PackageConfig();
            packageInfo.setParent("com.dcxuexi");   //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
            packageInfo.setEntity("domain");    //设置实体类包名
            packageInfo.setMapper("dao");   //设置数据层包名
            autoGenerator.setPackageInfo(packageInfo);
    
            //策略设置
            StrategyConfig strategyConfig = new StrategyConfig();
            strategyConfig.setInclude("platform_user","platform_region","platform_mobile_belong");  //设置当前参与生成的表名,参数为可变参数
            strategyConfig.setTablePrefix("platform_");  //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名  例如: User = platform_user - platform_
            strategyConfig.setRestControllerStyle(true);    //设置是否启用Rest风格
            strategyConfig.setVersionFieldName("version");  //设置乐观锁字段名
            strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
            strategyConfig.setEntityLombokModel(true);  //设置是否启用lombok
            autoGenerator.setStrategy(strategyConfig);
            //2.执行生成操作
            autoGenerator.execute();
    
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    mybatis-plus-generator 依赖的版本为3.4.1,使用的旧的代码生成器。官方文档:代码生成器配置旧

    如果依赖的版本是3.5.1版本及以上,需要使用新的代码生成器。官方文档:代码生成器配置新

    新的代码生成器代码,如下:

    public class CodeGenerator {
        public static void main(String[] args) {
            FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis",
                    "root","root")
                    .globalConfig(builder -> {
                        builder.outputDir(System.getProperty("user.dir")+"/springboot_mp_05_generator/src/main/java") //设置代码生成位置  /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
                                .author("DongChuang") // 设置作者
                                .fileOverride() // 覆盖已生成文件 默认值:false
                                .commentDate("yyyy-MM-dd"); // 注释日期
                    })
                    .packageConfig(builder -> {
                        builder.parent("com.dcxuexi") // 设置父包名
                                .controller("controller")//Controller 包名 默认值:controller
                                .entity("entity")//Entity 包名 默认值:entity
                                .service("service")//Service 包名 默认值:service
                                .mapper("mapper") //Mapper 包名 默认值:mapper
                                .pathInfo(Collections.singletonMap(OutputFile.xml,System.getProperty("user.dir")+ "/springboot_mp_05_generator/src/main/resources/mapper")); // 设置mapper.xml存放路径
                                //默认存放在mapper的xml下
                    })
                    .strategyConfig(builder -> {
                        builder.addInclude("platform_user","platform_region","platform_mobile_belong")  //设置当前参与生成的表名,参数为可变参数
                                .addTablePrefix("platform_") // 设置过滤表前缀
                                .serviceBuilder()//service策略配置
                                .formatServiceFileName("%sService")
                                .formatServiceImplFileName("%sServiceImpl")
                                .entityBuilder()// 实体类策略配置
                                .idType(IdType.AUTO)//主键策略  雪花算法自动生成的id
                                // 自动填充配置
                                .enableLombok() //开启lombok
                                .logicDeleteColumnName("deleted")// 说明逻辑删除是哪个字段
                                .versionColumnName("version")// 说明乐观锁是哪个字段
                                .enableTableFieldAnnotation()// 属性加上注解说明
                                .controllerBuilder() //controller 策略配置
                                .formatFileName("%sController")
                                .enableRestStyle() // 开启RestController注解
                                .mapperBuilder()// mapper策略配置
                                .formatMapperFileName("%sMapper")
                                .enableMapperAnnotation()//@mapper注解开启
                                .formatXmlFileName("%sMapper");
                    })
                    .execute();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    这里将自动生成的xml文件放在了main下的resource目录下,如果没有进行设置,默认存放在mapper的xml目录下。

    但是存放在这个目录下的xml文件时不能被解析的需要在yml文件中配置

    # mybatis-plus设置
    mybatis-plus:
      mapper-locations: classpath:mapper/*.xml #配置mapper xml文件的路径
    
    • 1
    • 2
    • 3

    步骤5:运行程序

    运行成功后,会在当前项目中生成很多代码,代码包含controller,servicemapperdomain

    在这里插入图片描述

    至此代码生成器就已经完成工作,我们能快速根据数据库表来创建对应的类,简化我们的代码开发。

    3. MP中Service的CRUD

    回顾我们之前业务层代码的编写,编写接口和对应的实现类:

    public interface UserService{
    	
    }
    
    @Service
    public class UserServiceImpl implements UserService{
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    接口和实现类有了以后,需要在接口和实现类中声明方法

    public interface UserService{
    	public List<User> selectInfo(); 
    }
    
    @Service
    public class UserServiceImpl implements UserService{
        @Autowired
        private UserDao userDao;
        
    	public List<User> selectInfo(){
            return userDao.selectInfo();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    MP看到上面的代码以后就说这些方法也是比较固定和通用的,那我来帮你抽取下,所以MP提供了一个Service接口和实现类,分别是:IServiceServiceImpl,后者是对前者的一个具体实现。

    以后我们自己写的Service就可以进行如下修改:

    public interface UserService extends IService<User>{
    	
    }
    
    @Service
    public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService{
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    修改以后的好处是,MP已经帮我们把业务层的一些基础的增删改查都已经实现了,可以直接进行使用。

    编写测试类进行测试:

    @SpringBootTest
    class SpringbootMp05GeneratorApplicationTests {
    
    	@Autowired
    	private UserService userService;
    
    	@Test
    	void contextLoads() {
    		List<User> userList = userService.selectInfo();
    		userList.forEach(System.out::println);
    	}
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行测试方法打印:

    在这里插入图片描述


    项目代码

  • 相关阅读:
    第二证券:特斯拉将推出低价电动汽车?最新消息
    搭建HBase2.x完全分布式集群(CentOS 9 + Hadoop3.x)
    eyb:Redis学习(3)
    DDoS攻击与CC攻击:网络安全的两大挑战
    [Win11]解决PS/2标准键盘带感叹号,笔记本键盘无法使用。代码19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个
    备战数学建模45-模拟退火算法SA(攻坚站9)
    关于《web课程设计》网页设计 用html css做一个漂亮的网站 仿新浪微博个人主页
    springboot疫情防控学生自助申报系统毕业设计源码260839
    “查找”学习提纲(三)——总结
    Https为什么是安全的
  • 原文地址:https://blog.csdn.net/qq_37726813/article/details/128055917