• 【快速搭建系列】idea使用Mybatis-plus(springboot)的快速上手使用和代码自动生成器的测试


    Mybatis-plus

    今天是1024程序员节,赶个热乎的。😎😎😎

    使用步骤

    新建项目

    1、在idea新建spring项目时选择使用Mybatis-plus

    少什么Meaven直接注入依赖

    实体类

    2、随便建一个实体类(User)

    • 解释:
      • 注解得写
      • @TableName():用来指定映射的表名
      • @TableField():如果与表中字段名映射不上的话就手动配置
      • 注:不用getter()、setter()
    package com.example.demo2.pojo;
    
    
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableName;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @TableName("smbms_user")
    public class User {
    	@TableId("id")
    	private Integer id; //id
    	@TableField("userCode")
    	private String userCode; //用户编码
    	@TableField("userName")
    	private String userName; //用户名称
    	@TableField("userPassword")
    	private String userPassword; //用户密码
    	private Integer gender;  //性别
    	private String birthday;  //出生日期
    	private String phone;   //电话
    	private String address; //地址
    	@TableField("userRole")
    	private Integer userRole;    //用户角色
    	@TableField("createdBy")
    	private Integer createdBy;   //创建者
    	@TableField("creationDate")
    	private String creationDate; //创建时间
    	@TableField("modifyBy")
    	private Integer modifyBy;     //更新者
    	@TableField("modifyDate")
    	private String modifyDate;   //更新时间
    
    }
    
    • 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

    Mapper

    3、在mapper中继承BaseMapper

    • 解释:
      • 别忘了注解
      • 不用写对应的mapper.xml
    package com.example.demo2.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.example.demo2.pojo.User;
    import org.apache.ibatis.annotations.Mapper;
    import org.springframework.stereotype.Repository;
    
    @Mapper	
    @Repository
    public interface UserMapper extends BaseMapper<User> {}	//接口继承BaseMapper<实体类>,不用写对应的mapper.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    按住ctrl单击进入BaseMapper< T >可以看到有很多Mybatis-plus已经写好的一些自带方法:

    //
    // Source code recreated from a .class file by IntelliJ IDEA
    // (powered by FernFlower decompiler)
    //
    
    package com.baomidou.mybatisplus.core.mapper;
    
    import com.baomidou.mybatisplus.core.conditions.Wrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import java.io.Serializable;
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    import org.apache.ibatis.annotations.Param;
    
    public interface BaseMapper<T> extends Mapper<T> {
        int insert(T entity);
    
        int deleteById(Serializable id);
    
        int deleteByMap(@Param("cm") Map<String, Object> columnMap);
    
        int delete(@Param("ew") Wrapper<T> queryWrapper);
    
        int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    
        int updateById(@Param("et") T entity);
    
        int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
    
        T selectById(Serializable id);
    
        List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
    
        List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
    
        T selectOne(@Param("ew") Wrapper<T> queryWrapper);
    
        Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
    
        List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
    
        List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
    
        List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
    
        <E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
    
        <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
    }
    
    • 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

    测试方法

    4、打开在test包里的主类Demo2ApplicationTests.java(项目名+ApplicationTests),在里面调用mapper中的方法即可

    package com.example.demo2;
    
    import com.example.demo2.mapper.UserMapper;
    import com.example.demo2.pojo.User;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.List;
    
    @SpringBootTest
    class Demo2ApplicationTests {
        //自动装配mapper
        @Autowired
        private UserMapper userMapper;
    
        @Test
        void contextLoads() {
        }
    
        //获取user表所有数据
        @Test
        void getData() {
            List<User> users = userMapper.selectList(null);
            System.out.println(users);
        }
    
        //根据id查数据
        @Test
        void selectById() {
            User user = userMapper.selectById(1);
            System.out.println(user);
        }
    
        //查总记录数
        @Test
        void selectCount() {
            Integer n = userMapper.selectCount(null);
            System.out.println(n);
        }
    
        //根据id修改
        @Test
        void updateById() {
            User user = new User();
            user.setId(16);
            user.setUserName("张三");
            user.setAddress("绿洲大道");
            Integer n = userMapper.updateById(user);
            System.out.println(n);
        }
    }
    
    • 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

    结果

    可在结果中直接查看

    请添加图片描述

    也可以选择单击单个方法查看(看着清晰),可以看到每个方法和耗时

    请添加图片描述

    代码自动生成

    使用步骤

    1、少什么Meaven直接注入依赖

    2、新建一个utils工具包,然后新建一个CodeGenerator.java

    请添加图片描述

    CodeGenerator.java

    • 解释:
      • 端口或者数据库自己改
      • 账号和密码用自己的
    package com.example.demo2.utils;
    
    import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
    import com.baomidou.mybatisplus.core.toolkit.StringPool;
    import com.baomidou.mybatisplus.core.toolkit.StringUtils;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.InjectionConfig;
    import com.baomidou.mybatisplus.generator.config.*;
    import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
    import com.baomidou.mybatisplus.generator.config.po.TableInfo;
    import com.baomidou.mybatisplus.generator.config.rules.FileType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    import com.baomidou.mybatisplus.generator.engine.BeetlTemplateEngine;
    import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    // 演示例子,执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
    public class CodeGenerator {
    
        /**
         * 

    * 读取控制台内容 *

    */
    public static String scanner(String tip) { Scanner scanner = new Scanner(System.in); StringBuilder help = new StringBuilder(); help.append("请输入" + tip + ":"); System.out.println(help.toString()); if (scanner.hasNext()) { String ipt = scanner.next(); if (StringUtils.isNotBlank(ipt)) { return ipt; } } throw new MybatisPlusException("请输入正确的" + tip + "!"); } public static void main(String[] args) { // 代码生成器 AutoGenerator mpg = new AutoGenerator(); // 全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir"); gc.setOutputDir(projectPath + "/src/main/java"); gc.setAuthor("Tuerlechat"); //作者名,根据需要自定义 gc.setOpen(false); // gc.setSwagger2(true); 实体属性 Swagger2 注解 mpg.setGlobalConfig(gc); // 数据源配置 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/smbms?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8"); //端口或者数据库自己改 // dsc.setSchemaName("public"); dsc.setDriverName("com.mysql.cj.jdbc.Driver"); //数据库驱动,根据需要自定义 dsc.setUsername("root"); //账号根据需要自定义 dsc.setPassword("root"); //密码根据需要自定义 mpg.setDataSource(dsc); // 包配置 PackageConfig pc = new PackageConfig(); pc.setModuleName(scanner("模块名")); pc.setParent("com"); //根据需要自定义 mpg.setPackageInfo(pc); // 自定义配置 InjectionConfig cfg = new InjectionConfig() { @Override public void initMap() { // to do nothing } }; // 如果模板引擎是 freemarker String templatePath = "/templates/mapper.xml.ftl"; // 如果模板引擎是 velocity // String templatePath = "/templates/mapper.xml.vm"; // 自定义输出配置 List<FileOutConfig> focList = new ArrayList<>(); // 自定义配置会被优先输出 focList.add(new FileOutConfig(templatePath) { @Override public String outputFile(TableInfo tableInfo) { // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; } }); // cfg.setFileCreate(new IFileCreate() { // @Override // public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { // // 判断自定义文件夹是否需要创建 // checkDir("调用默认方法创建的目录,自定义目录用"); // if (fileType == FileType.MAPPER) { // // 已经生成 mapper 文件判断存在,不想重新生成返回 false // return !new File(filePath).exists(); // } // // 允许生成模板文件 // return true; // } // }); cfg.setFileOutConfigList(focList); mpg.setCfg(cfg); // 配置模板 TemplateConfig templateConfig = new TemplateConfig(); templateConfig.disable(); // 配置自定义输出模板 //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 templateConfig.setEntity("templates/entity.java"); //创建实体类 templateConfig.setMapper("templates/mapper.java"); //创建mapper templateConfig.setService("templates/service.java"); //创建service templateConfig.setServiceImpl("templates/serviceImpl.java"); //创建serviceImpl templateConfig.setController("templates/controller.java"); //创建controller templateConfig.setXml(null); //创建xml mpg.setTemplate(templateConfig); // 策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); //strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!"); strategy.setEntityLombokModel(true); strategy.setRestControllerStyle(true); // 公共父类 //strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!"); // 写于父类中的公共字段 strategy.setSuperEntityColumns("id"); strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); strategy.setControllerMappingHyphenStyle(true); strategy.setTablePrefix(pc.getModuleName() + "_"); mpg.setStrategy(strategy); mpg.setTemplateEngine(new FreemarkerTemplateEngine()); mpg.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
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147

    结果

    然后在里面输入相应的信息,运行:

    请添加图片描述

    这时可以看到项目中已经添加进去了,

    一个是java包下的一堆包,一个是resources下的mapper下的包

    请添加图片描述

    一些小坑

    然后也可以像刚才那样测试运行,不过因为我已经有一个项目了,多建的不是本项目的包,只是测试了一下,所以并不能直接运行,因为springboot只扫描本项目包,所以测试运行需要:

    在新建的mapper里加注解:

    @Mapper
    @Repository
    
    • 1
    • 2

    然后把只把mapper拖到本项目的mapper包里,然后用测试类自动装配就能用了

  • 相关阅读:
    MySQL常用运算符详细介绍
    linux-磁盘应用
    【C++ 面试 - 新特性】每日 3 题(十)
    Zabbix 5.2实战系列之Grafana变量使用
    LLM大模型实战 —— DB-GPT阿里云部署指南
    @requestBody与@RequestParam
    vue 页面的css样式代码多,怎么把css样式代码做成独立的文件,然后引用进来;以及style的scoped标签介绍以及scoped穿透介绍
    nginx基础配置
    【数据结构初阶-排序】经典的排序算法,很有趣,有没有你不会的呢
    按键控制开关4017芯片数字电路
  • 原文地址:https://blog.csdn.net/weixin_55452293/article/details/127502794