Bootstrap

MybatisPlus学习笔记

一、Mybatis-Plus简介

(一) 什么是Mybatis-Plus

        MybatisPlus是一个 MyBatis (opens new window)的增强工具,在 MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。愿景是成为 MyBatis最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。

(二) Mybatis-Plus的优势

无侵入:

        只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。

损耗小:

        启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作。

强大的 CRUD 操作:

        内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。

支持 Lambda 形式调用:

        通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错。

支持主键自动生成:

        支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

支持 ActiveRecord 模式:

        支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作。

支持自定义全局通用操作:

        支持全局通用方法注入( Write once, use anywhere )。

内置代码生成器:

        采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用。

内置分页插件:

        基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询。

分页插件支持多种数据库:

        支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库。

内置性能分析插件:

        可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。

内置全局拦截插件:

        提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作。

(三)MybaisPlus的框架结构

二、SpringBoot整合Mybatis-Plus入门案例

(一) 创建SpringBoot工程添加依赖

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

(二) 创建数据库表employee

(三)构建数据模型Employee

此处省略了get、set方法以及toSytring方法 

package com.jn.entity;
public class Employee {
    @TableField(value = "empId")
    private Long empId;
    @TableField(value = "name")
    private String name;
    @TableField(value = "empGender")
    private String empGender;
    @TableField(value = "email")
    private String email;
    @TableField(value = "age")
    private Integer age;
}

(四)配置application.yml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///mybatisdatabase200
    username: root
    password: 123456
    logging:
      level:
        com:
          jn:
            mybatisplus:
              dao: debug

(五) 编写Spring Boot 启动类

package com.jn;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.jn.dao")
public class MybatisPlus01Application {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlus01Application.class, args);
    }

}

(六) 编写mapper接口

package com.jn.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jn.entity.Employee;

public interface EmployeeMapper extends BaseMapper<Employee> {
}

(七)启动服务测试结果

@RunWith(SpringRunner.class)
@SpringBootTest
class MybatisPlus01ApplicationTests {

    @Autowired
    private EmployeeMapper employeeMapper;

    @Test
    public void selectAll() {
        employeeMapper.selectList(null).forEach(System.out::println);
    }

}

三、Lombok插件

(一)lombok插件简介

        lombok是一个插件,用途是使用注解给你类里面的字段,自动的加上属性,构造器,ToString方法,Equals方法等等,比较方便的一点是,你在更改字段的时候,lombok会立即发生改变以保持和你代码的一致性。

(二)常用的 lombok 注解介绍

        @Getter 加在类上,可以自动生成参数的getter方法。
        @Setter 加在类上,可以自动生成参数的setter方法
        @ToString 加在类上,调用toString()方法,可以输出实体类中所有属性的值
        @RequiredArgsConstructor会生成一个包含常量,和标识了NotNull的变量的构造方法。生成的构造方法是私有的private。这个我用的很少。
        @EqualsAndHashCode
                1.它会生成equals和hashCode方法
                2.默认使用非静态的属性
                3.可以通过exclude参数排除不需要生成的属性
                4.可以通过of参数来指定需要生成的属性
                5.它默认不调用父类的方法,只使用本类定义的属性进行操作,可以使用callSuper=true来解决,会在@Data中进行讲解。
        @Data这个是非常常用的注解,这个注解其实是五个注解的合体:
        @NoArgsConstructor生成一个无参数的构造方法。
        @AllArgsConstructor生成一个包含所有变量的构造方法。
        @Value这个注解要和Spring的@Value注解区分,Spring的是从配置文件读取内容,这个注解是在类中的所有字段默认全部声明为private final类型,只会生成Getter方法,不会生成Setter方法,很少用。
        @Cleanup主要用于关闭资源使用。

(三)idea安装lombok插件

        首先我们需要安装IntelliJ IDEA中的lombok插件,打开IntelliJ IDEA后点击菜单栏中的File-->Settings,或者使用快捷键Ctrl+Alt+S进入到设置页面

        我们点击设置中的Plugins进行插件的安装,在右侧选择Browse repositories...,然后在搜索页面输入lombok变可以查询到下方的Lombok Plugin,鼠标点击Lombok Plugin可在右侧看到Install按钮,点击该按钮便可安装。安装完成之后重启idear即可。

(四)lombok插件的使用

1.去除Employee类中的setter和getter方法

package com.jn.entity;

import com.baomidou.mybatisplus.annotation.TableField;

public class Employee {
    @TableField(value = "empId")
    private Long empId;
    @TableField(value = "name")
    private String name;
    @TableField(value = "empGender")
    private String empGender;
    @TableField(value = "email")
    private String email;
    @TableField(value = "age")
    private Integer age;
}

2.在Employee类上添加lombok注解

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
@Data   // 自动生成getter、setter、toString、equals、hashCode等方法
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    @TableField(value = "empId")
    private Long empId;
    @TableField(value = "name")
    private String name;
    @TableField(value = "empGender")
    private String empGender;
    @TableField(value = "email")
    private String email;
    @TableField(value = "age")
    private Integer age;
}

四、Mybatis-Plus通用CRUD

(一)BaseMapper接口方法介绍

baseMaper中提供了CRUD方法,具体方法如下:
插入一条记录
        int insert(T entity);
根据 entity 条件,删除记录
        int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
删除(根据ID 批量删除)
        int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
根据 ID 删除
        int deleteById(Serializable id);
根据 columnMap 条件,删除记录
        int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
根据 whereEntity 条件,更新记录
        int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
根据 ID 修改
        int updateById(@Param(Constants.ENTITY) T entity);
        List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
查询(根据 columnMap 条件)
        List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
根据 Wrapper 条件,查询全部记录
        List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
        List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 entity 条件,查询全部记录(并翻页)
        IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 Wrapper 条件,查询全部记录(并翻页)
        IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
根据 Wrapper 条件,查询总记录数
        Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

(二)环境搭建

1.创建数据库表employee

2.构建实体类并使用lombok注解

@Data   // 自动生成getter、setter、toString、equals、hashCode等方法
@AllArgsConstructor
@NoArgsConstructor
public class Employee {
    @TableField(value = "empId")
    private Long empId;
    @TableField(value = "name")
    private String name;
    @TableField(value = "empGender")
    private String empGender;
    @TableField(value = "email")
    private String email;
    @TableField(value = "age")
    private Integer age;
}

(三)insert方法

    // 测试插入
    @Test
    public void insert() {
        Employee employee = new Employee();
        employee.setName("任我行");
        employee.setEmail("[email protected]");
        employee.setEmpGender("男");
        employee.setAge(18);
        employeeMapper.insert(employee);
    }

(四)@TableId注解

属性

类型

必须指定

默认值

描述

value

String

""

主键字段名

type

Enum

IdType.NONE

主键类型

        注意:上述代码封装实体类已经和数据库里面的字段名称保持一致,主键也已经设置,所以就不用在实体封装类里面加入此注解了。 

IdType

描述

AUTO

数据库ID自增

NONE

无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

INPUT

insert前自行set主键值

ASSIGN_ID

分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)

ASSIGN_UUID

分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法)

(五)@TableName

        当表的跟实体类不一致的时候,要使用@TableName注解进行映射

(六)@TableField注解

        描述:字段注解(非主键)

属性

类型

默认值

描述

value

String

""

数据库字段名

el

String

""

映射为原生 #{ ... } 逻辑,相当于写在 xml 里的 #{ ... } 部分

exist

boolean

true

是否为数据库表字段

condition

String

""

字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的

update

String

""

字段 update set 部分注入, 例如:update="%s+1":表示更新时会set version=version+1(该属性优先级高于 el 属性)

insertStrategy

Enum

N

DEFAULT

举例:NOTNULL: `insert into tablea(column) values (#{columnProperty})`

updateStrategy

Enum

N

DEFAULT

举例:IGNORED: update table_a set column=#{columnProperty}

whereStrategy

Enum

N

DEFAULT

举例:NOT_EMPTY: where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>

fill

Enum

FieldFill.DEFAULT

字段自动填充策略

select

boolean

true

是否进行 select 查询

keepGlobalFormat

boolean

false

是否保持使用全局的 format 进行处理

jdbcType

JdbcType

JdbcType.UNDEFINED

JDBC类型 (该默认值不代表会按照该值生效)

typeHandler

Class<? extends TypeHandler>

UnknownTypeHandler.class

类型处理器 (该默认值不代表会按照该值生效)

numericScale

String

""

指定小数点后保留的位数

(七)插入数据获取主键值


mysql-plus会自获取自增主键,把数据库的empId设置为自增。测试获取自增主键。
测试:

    //插入数据获取主键值
    @Test
    public void insertGetId() {
        Employee employee = new Employee();
        employee.setName("风清扬");
        employee.setEmail("[email protected]");
        employee.setEmpGender("男");
        employee.setAge(88);
        employeeMapper.insert(employee);
        System.out.println(employee.getEmpId());
    }

(八)更新数据的通用方法

1.updateById方法

        根据id进行记录更新,如果对象属性未传值,则不会更新该字段,保持数据库表原来字段值。

    //更新数据的测试
    @Test
    public void updateById() {
        Employee employee = new Employee();
        employee.setEmpId(11L);
        employee.setName("小林子");
        employee.setEmail("[email protected]");
        employee.setEmpGender("不男不女");
        employeeMapper.updateById(employee);
    }

2.updateAllColumnById方法

        根据id进行记录更新,无论对象属性传不传值,每列都进行更新,为赋值的字段被更新为null

        测试结果:直接报错,MybatisPlus由2.3升级到3.4 UpdateAllColumnById() 以及 deleteAll() 没法使用。

(九)查询数据的通用方法

1.selectById方法

        根据id查询指定记录

    //根据id查询
    @Test
    public void selectById() {
        Employee employee = employeeMapper.selectById(11L);
        System.out.println(employee);
    }

2.selectBatchIds方法

        批量查询指多个id的记录集合

    //批量查询多个id
    @Test
    public void selectBatchIds() {
        employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3)).forEach(System.out::println);
    }

3.selectByMap方法

        根据Map集合中传入的条件进行查询,每个条件都是and关系。

    //根据Map查询
    @Test
    public void selectByMap() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("age", "18");
        employeeMapper.selectByMap(map).forEach(System.out::println);
    }

(十)删除数据方法

1.deleteById方法

        根据id删除记录

    //根据id删除
    @Test
    public void deleteById() {
        employeeMapper.deleteById(11L);
    }

2.deleteByMap方法

        根据Map中的条件进行删除,map中的条件在sql语句中是and关系。

    //Map删除
    @Test
    public void deleteByMap() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("empGender", "男");
        employeeMapper.deleteByMap(map);
    }

3.deleteBatchIds方法

        根据传入List集合中的id进行批量删除 

    //批量删除
    @Test
    public void deleteBatchIds() {
        employeeMapper.deleteBatchIds(Arrays.asList(2,4));
    }

五、Mybatis-Plus条件构造器

(一)条件构造器介绍

        在mybatis-plus中提了构造条件的类Wrapper,它可以根据自己的意图定义我们需要的条件。Wrapper是一个抽象类,一般情况下我们用它的子类QueryWrapper来实现自定义条件查询.

(二)selectOne方法

        先向数据库里面表里面插入数据 

INSERT INTO employee (name, age, empGender, email) VALUES
('吴邪', 26, '男', '[email protected]'),
('张起灵', 700, '男', '[email protected]'),
('王胖子', 28, '男', '[email protected]'),
('吴三省', 45, '男', '[email protected]'),
('解连环', 42, '男', '[email protected]'),
('陈文锦', 40, '女', '[email protected]'),
('霍仙姑', 80, '女', '[email protected]'),
('潘子', 35, '男', '[email protected]'),
('阿宁', 25, '女', '[email protected]'),
('黑眼镜', 300, '男', '[email protected]'),
('云彩', 18, '女', '[email protected]'),
('老痒', 26, '男', '[email protected]'),
('陈皮阿四', 80, '男', '[email protected]'),
('二月红', 900, '男', '[email protected]'),
('齐羽', 500, '男', '[email protected]'),
('解雨臣', 26, '男', '[email protected]'),
('霍秀秀', 22, '女', '[email protected]'),
('苏万', 18, '男', '[email protected]'),
('李簇', 18, '男', '[email protected]'),
('杨好', 18, '男', '[email protected]'),
('塌肩膀', 200, '男', '[email protected]'),
('蓝袍藏人', 1000, '男', '[email protected]'),
('汪藏海', 2000, '男', '[email protected]'),
('蛇沼鬼母', 1500, '女', '[email protected]'),
('禁婆', 500, '女', '[email protected]'),
('海猴子', 30, '男', '[email protected]'),
('血尸', 20, '男', '[email protected]'),
('烛九阴', 500, '男', '[email protected]'),
('鸡冠蛇', 50, '男', '[email protected]'),
('尸蹩王', 100, '男', '[email protected]');
INSERT INTO employee (name, age, empGender, email) VALUES
('张海客', 600, '男', '[email protected]'),
('张海杏', 550, '女', '[email protected]'),
('张海盐', 400, '男', '[email protected]');

        再进行测试 

    //selectOne
    @Test
    public void selectOne() {
        QueryWrapper<Employee> wrapper = new QueryWrapper<>();
        wrapper.eq("empGender", "男");
        wrapper.eq("name", "吴邪");
        Employee employee = employeeMapper.selectOne(wrapper);
        System.out.println(employee);
    }

(三).selectList方法

    //selectList方法,查询姓名中里面有"张"的且年龄大于100的人员
    @Test
    public void selectList() {
        QueryWrapper<Employee> wrapper = new QueryWrapper<>();
        wrapper.like("name", "张").ge("age", 100);
        employeeMapper.selectList(wrapper).forEach(System.out::println);
    }

    //查询性别为男或者姓刘,按年龄的升序排序
    @Test
    public void selectList2() {
        QueryWrapper<Employee> wrapper = new QueryWrapper<>();
        wrapper.eq("empGender", "男").or().like("name", "刘").orderByAsc("age");
        employeeMapper.selectList(wrapper).forEach(System.out::println);
    }

    //查询姓张并且(年龄大于100或者邮箱不为null)
    @Test
    public void selectList3() {
        QueryWrapper<Employee> wrapper = new QueryWrapper<>();
        wrapper.like("name", "张").and(i -> i.gt("age", 100).or().isNotNull("email"));
        employeeMapper.selectList(wrapper).forEach(System.out::println);
    }

(四).selectPage方法

1、配置分页类 

        selectPage用于分页,在mybatis-plus中分页有两种一种是罗辑分页或叫内存分页,另一种是物理分页,内存分页就是把数据全部查询出来放到内容中,返回你想要的一部分数据,当数据量非常庞大时这种方法就行不通了,因为太耗内容,所以一般采用物理分页,需要springboot中加入物理分页配置:

@Configuration
public class MybatisPlusPageConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return interceptor;
    }
}

2、编写测试方法

    //测试分页
    @Test
    public void selectPage() {
        QueryWrapper<Employee> wrapper = new QueryWrapper<>();
        wrapper.ge("age", 18);
        Page<Employee> page = new Page<>(1, 5);
        Page<Employee> employeePage = employeeMapper.selectPage(page, wrapper);
        System.out.println("当前页:" + employeePage.getCurrent());
        System.out.println("每页记录数:" + employeePage.getSize());
        System.out.println("总页数:" + employeePage.getPages());
        System.out.println("总记录数:" + employeePage.getTotal());
        List<Employee> records = employeePage.getRecords();
        records.forEach(System.out::println);
    }

3、查看测试结果 

(五)update方法

    //根据姓名和年龄修改记录
    @Test
    public void update() {
        QueryWrapper<Employee> updateWrapper = new QueryWrapper<>();
        updateWrapper.eq("name", "哈哈哈").eq("age", 200);
        Employee employee = new Employee();
        employee.setName("张启山");
        employee.setEmail("[email protected]");
        employee.setAge(22);
        employee.setEmpGender("男");
        int result =employeeMapper.update(employee, updateWrapper);
        System.out.println(result);
    }

(六).delete方法

    //根据姓名和年龄删除记录
    @Test
    public void delete() {
        QueryWrapper<Employee> deleteWrapper = new QueryWrapper<>();
        deleteWrapper.eq("name", "张海盐").eq("age", 400);
        int result = employeeMapper.delete(deleteWrapper);
        System.out.println(result);
    }

六、Mybatis-Plus的Service封装

(一)通用service简介

        Mybatis-Plus除了通用的Mapper还有通用的Servcie层,这也减少了相对应的代码工作量,把通用的接口提取到公共。其实按照MP的这种思想,可以自己也实现一些通用的Controller。

(二).通用service常用方法介绍

        此接口类里卖有很多可用的方法 

(三)通用service的案例

1.构建maven工程添加依赖

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

2.实体类创建

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee implements Serializable {
    @TableId(value = "empId", type = IdType.AUTO)
    private Integer empId;
    @TableField(value = "name")
    private String name;
    @TableField(value = "empGender")
    private String empGender;
    @TableField(value = "email")
    private String email;
    @TableField(value = "age")
    private Integer age;
}

3.实体类的Mapper接口

@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}

4.配置文件编写

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///mybatisdatabase200
    username: root
    password: 123456
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl

5.构建service接口

public interface EmployeeService extends IService<Employee> {
}

6.构建service实现类

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}

7.通用servcie测试

7.1save
@RunWith(SpringRunner.class)
@SpringBootTest
class MybatisPlus02ApplicationTests {
    @Autowired
    private EmployeeService employeeService;

    //测试Save
    @Test
    void testSave() {
        Employee employee = new Employee();
        employee.setName("小医仙");
        employee.setEmpGender("女");
        employee.setEmail("[email protected]");
        employee.setAge(18);
        boolean save = employeeService.save(employee);
        System.out.println(save);
    }
}

7.2SaveOrUpdate 
    //测试SaveOrUpdate
    @Test
    void testSaveOrUpdate() {
        Employee employee = new Employee();
        employee.setEmpId(53);
        employee.setName("古熏儿");
        employee.setEmpGender("女");
        employee.setEmail("古熏儿@163.com");
        employee.setAge(18);
        boolean save = employeeService.saveOrUpdate(employee);
        System.out.println(save);
    }

7.3GetOne
    //测试getOne
    @Test
    void testGetOne() {
        QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "吴邪");
        Employee employee = employeeService.getOne(queryWrapper);
        System.out.println(employee);
    }

七、Mybatis-Plus新代码生成器

(一)代码生成器介绍

        代码生成器顾名思义就是为我们生成一些代码,省去了我们一些时间。AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率,MyBatis-Plus从3.0.3 之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖,才能实现代码生成器功能。

(二)构建maven工程引入相关依赖

        <!--generator-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.9</version>
        </dependency>
        <!--freemarker-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--ApiModel-->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.20</version>
        </dependency>

(三)编写新生成器代码

        在测试类下面编写代码生成器 

@SpringBootTest
class MybatisPlus03ApplicationTests {

    //编写代码生成器
    @Test
    public void testCodeGenerator() {
        //全局配置
        FastAutoGenerator.create("jdbc:mysql:///mybatisdatabase200", "root", "123456")
                .globalConfig(builder -> {
                    builder.author("baomidou") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir("C:\\Users\\20665\\IdeaProjects\\frame\\MybatisPlus03\\src\\main\\java"); // 指定输出目录
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder ->
                        builder.parent("com.jn.generator") // 设置父包名
                                .pathInfo(Collections.singletonMap(OutputFile.xml, "C:\\Users\\20665\\IdeaProjects\\frame\\MybatisPlus03\\src\\main\\resources\\mapper")) // 设置mapperXml生成路径
                )
                .strategyConfig(builder ->
                        builder.addInclude("employee") // 设置需要生成的表名
                                .addTablePrefix() // 设置过滤表前缀
                )
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }


}

(四)执行生成器代码完成测试 

1、在主启动类上用@MapperScan扫描mapper接口

@SpringBootApplication
@MapperScan("com.jn.generator.mapper")
public class MybatisPlus03Application {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlus03Application.class, args);
    }

}

2、在生成的contorller中编写查询方法  

@Controller
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private IEmployeeService employeeService;

    //测试新代码生成器
    @RequestMapping("/emp")
    public List<Employee> testCodeGenerator() {
        List<Employee> list = employeeService.list();
        return list;
    }

}

(五)出现错误

Unknown column 'emp_gender' in 'field list' 

 

(六)解决错误 

        在生成的实体类里面加入TableField注解,然后再进行测试 

    @TableId(value = "empId", type = IdType.AUTO)
    private Integer empId;

    @TableField(value = "name")
    private String name;
    @TableField(value = "empGender")
    private String empGender;
    @TableField(value = "email")
    private String email;
    @TableField(value = "age")
    private Integer age;

 (七)双错啦​​​​​​​

        然后在网上一直找解决的方法,第一种情况是SpringBoot的启动程序目录下面没有Controller控制层,这不是扯蛋,老子已经是自动生成的了 ,如图:

         第二种情况就是要在启动类上加入@SpringBootApplication(scanBasePackages="controller"),这是来搞笑的吧

(八)找到错误 

        发现自动生成的Controller控制层类使用的是@Controller注解,后面在测试的过程中也没有加入@RequestBody来转换Json字符串,改成这样就行了:直接使用@RestController

@RestController
@RequestMapping("/employee")
public class EmployeeController {

    @Autowired
    private IEmployeeService employeeService;

    //测试新代码生成器
    @RequestMapping("/emp")
    public List<Employee> testCodeGenerator() {
        List<Employee> list = employeeService.list();
        return list;
    }

}

(九)终极测试 

        启动SpringBoot在浏览器访问 localhost:8080/employee/emp

 

;