MyBatisPlus的知识点

MyBatisPlus的知识点

简介

  • MyBatisPlus,简称MP,是基于MyBatis框架基础上开发的增强型工具,旨在简化开发提高效率

  • 官网:https://mybatis.plus/ 或:https://mp.baomidou.com

  • MyBatisPlus特性:

    • 无侵入:在MyBatis的基础上只做增强不做改变,不会对现有的工程产生影响;
    • 强大的CRUD操作:内置通用Mapper,少量配置即可实现单表CRUD操作;
    • 支持Lambda:编写查询条件无需担心字段写错;
    • 支持主键自动生成;
    • 内置分页插件
  • MyBatisPlus对比MyBatis有哪些优势?

    • MyBatisPlus封装了一些常用的操作,可以使用简单的代码实现一些复杂的操作,减少了代码量;
    • MyBatisPlus提供了一些常用的CRUD操作(添加数据(Create)、读取查询数据(Read)、修改数据(Update)、删除数据(Delete)),可以减少一些常规的操作代码;
    • MyBatisPlus提供了一些高级功能,比如:分页、逻辑删除、多表查询、乐观锁等等,这些功能可以大大提高开发效率;
    • MyBatisPlus提供了丰富的插件支持,可以方便地进行二级缓存性能优化分页插件等等的集成;
    • MyBatisPlus可以通过配置文件注解的方式进行配置,开发者可以根据需要选择合适的配置方式

开发方式

  • 基于MyBatis使用MyBatisPlus
  • 基于Spring使用MyBatisPlus
  • 基于SpringBoot使用MyBatisPlus

SpringBoot整合MyBatisPlus

整合步骤:

1.创建SpringBoot工程(使用快速构建)

在这里插入图片描述

在这里插入图片描述

2.引入mybatisplus整合SpringBoot的依赖:
<!--        mybatisplus整合SpringBoot的起步依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>
3.引入常用的依赖:
<!--   druid数据源依赖     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.20</version>
        </dependency>
        <!--        使用@Data注解依赖,简化POJO实体类的开发-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.26</version>
        </dependency>
4.配置application.yml文件:
#JDBC连接池配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: "010802" #若为纯数字则要加上双引号,非纯数字则不需要
5.创建User实体类:
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author :LTY
 * @date :Created in 2023/6/26 16:38
 * @description:实体类
 * @modified By:
 * @version: $
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;

    private String name;

     private String password;

    private Integer age;

    private String tel;
}
6.创建数据层UserDao接口:
package com.itcast.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.itcast.pojo.User;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author :ATO
 * @date :Created in 2023/6/26 16:59
 * @description:数据层接口
 * @modified By:
 * @version: $
 */
@Mapper  //表示这个接口在编译时会生成相应的实现类
@Repository //此注解为Spring注解,主动识别当前类要交给Spring容器管理的,然后生成dao层的bean
public interface UserDao extends BaseMapper<User> {

}
7.编写测试类:
package com.itcast.mybatisplus_01;

import com.itcast.dao.UserDao;
import com.itcast.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
@MapperScan(value="com.itcast.dao") //扫描包下的所有类或接口,作用为:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类
public class Mybatisplus01ApplicationTests {

    @Autowired
    private UserDao userDao;

//    查询所有数据
    @Test
    void testGetAll() {
        List<User> users = userDao.selectList(null);
        System.out.println(users);
    }

}

标准数据层开发

  • 标准数据层CRUD功能
功能自定义接口MP接口
新增boolean save(T t)int insert(T t)
删除boolean delete(int id)int deleteById(Serializable id)
修改boolean update(T t)int updateById(T t)
依据id字段查询T getById(int id)T selectById(Serializable id)
查询全部数据List getAll()List selectList()
分页查询PageInfo getAll(int page, int size)IPage selectPage(IPage page)
按条件查询List getAll(Condition condition)IPage selectPage(Wrapper queryWrapper)
1.新增数据
    //新增一条数据
    @Test
    void testSave() {
        User user = new User();
        user.setName("彭昱畅");
        user.setAge(24);
        user.setPassword("12344");
        user.setTel("34354545");
        userDao.insert(user);
    }
2.删除数据
    //删除数据
    @Test
    void testDelete() {
//        id的类型为long型,故在后面要加上L或l
        userDao.deleteById(1673332182423891970l);
    }
3.修改数据
  //修改数据
    @Test
    void testUpdate() {
        //依据id更新,只更新user中不为null的字段
        User user = new User();
        user.setId(4L);
        user.setAge(30);
        userDao.updateById(user);
    }
4.依据id查询数据
  //依据id进行查询
    @Test
    void testSelectById() {
        User user = userDao.selectById(4L);
        System.out.println(user);
    }

标准分页功能

1.创建一个配置类,对分页插件进行配置: 分页查询拦截器
package com.itcast.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;

/**
 * @author :LTY
 * @date :Created in 2023/6/26 22:37
 * @description:分页插件的配置类
 * @modified By:
 * @version: $
 */设置分页拦截器作为Spring管理的bean
 @Configuration
public class MpConfig {
    
    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
//        创建MyBatisPlus的拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //添加一个具体的内置的分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
2.编写分页查询语句
    //分页查询
    @Test
    void testGetByPage() {
//        current表示第几页,size表示展示的条数
        Page page = new Page(1,2);
        userDao.selectPage(page,null);
        System.out.println("当前页码值为: " + page.getCurrent());
        System.out.println("每页显示数: " + page.getSize());
        System.out.println("一共有: " + page.getPages() +"页");
        System.out.println("一共: " + page.getTotal() + "条数据");
        System.out.println("数据: " + page.getRecords());
    }
3.开启MyBatisPlus日志
  • 若想要在控制台上打印SQL语句,则在application.yml配置文件中添加:

    #开启mp的日志(输出到控制台)
    mybatis-plus:
      configuration:
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    

    控制台显示结果为:

    在这里插入图片描述

条件查询的三种格式

  • MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合
去除控制台生成的大量的日志方法
  • 在resources下新建一个logback.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
  • 在配置文件application.yml里的开启mp日志(mybatis-plus:)后面添加:
global-config:
    banner: false  #表示斑不显示

在这里插入图片描述

  • 在配置文件application.yml里的spring:下添加:
main:
    banner-mode: off

在这里插入图片描述

条件查询的方式
  • 方式一:常规格式
    //    按条件查询
    @Test
    void testGetAll() {
        QueryWrapper qw = new QueryWrapper();
//        lt: <  gt: >  ge:大于等于  le:小于等于
//        查询年龄小于24岁的数据
        qw.lt("age",24);
        List<User> users = userDao.selectList(qw);
        System.out.println(users);
    }
  • 方式二:lambda格式按条件查询。相比方式一,此方式避免了属性名书写错误。
   @Test
    void testGetAll() {
        //方式二:lambda格式按条件查询
        QueryWrapper<User> qw = new QueryWrapper<User>();
//        查询年龄小于24岁的数据
        qw.lambda().lt(User::getAge,24);
        List<User> users = userDao.selectList(qw);
        System.out.println(users);
    }
  • 方式三:
 @Test
    void testGetAll() {
 LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
//        查询年龄小于24岁的数据
          lqw.lt(User::getAge,24);
        List<User> users = userDao.selectList(lqw);
        System.out.println(users);
   }
  • 多条件查询

    • 查询区间的数据
        @Test
        void testGetAll() {
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    //        查询年龄大于20小于30岁的数据
              //  lqw.lt(User::getAge,30);
              // lqw.gt(User::getAge,20);
              //或简写为: 链式格式
            lqw.lt(User::getAge,30).gt(User::getAge,20);
            List<User> users = userDao.selectList(lqw);
            System.out.println(users);
        }
    
    • 查询两边的数据
        @Test
        void testGetAll() {
       LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
    		 //查询小于20岁或者大于30岁的数据
    		  lqw.lt(User::getAge,20).or().gt(User::getAge,30);
            List<User> users = userDao.selectList(lqw);
            System.out.println(users);
        }
    
null值的处理
  • 新建一个UserQuery实体类,继承于原来的User实体类,用于封装User模型查询条件:
package com.itcast.pojo.query;

import com.itcast.pojo.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author :LTY
 * @date :Created in 2023/6/27 0:04
 * @description:封装用于User模型的查询条件的实体类
 * @modified By:
 * @version: $
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserQuery extends User {
//    原来属性数据有上下限时,需要在这里创建新的变量
    private Integer age2;
}
  • 编写测试:
    //null值的处理
    @Test
    void testDealNull() {
        //模拟页面传递过来的查询数据
        UserQuery userQuery = new UserQuery();
//        userQuery.setAge(10);
        userQuery.setAge2(30);

        //null判定
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();

        //        方式一:if语句控制条件追加(不推荐)
//        if(null != userQuery.getAge2()) {
//            lqw.lt(User::getAge,userQuery.getAge2());
//        }
//        if(null != userQuery.getAge()) {
//            lqw.gt(User::getAge,userQuery.getAge());
//        }

//        方式二:条件参数控制
        //先判定第一个条件是否为true,若为true,则连接当前条件
        lqw.lt(null != userQuery.getAge2(),User::getAge,userQuery.getAge2());
        lqw.gt(null != userQuery.getAge(),User::getAge,userQuery.getAge());
        List<User> users = userDao.selectList(lqw);
        System.out.println(users);
    }

查询投影

查询部分属性
 @Test
    void test3() {

        //lambda格式
//        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        查询某些字段
//        lqw.select(User::getId,User::getName,User::getAge);

        //非lambda格式
        QueryWrapper qw = new QueryWrapper();
        qw.select("id","name","age");
        List<User> users = userDao.selectList(qw);
        System.out.println(users);
    }
查询统计数、分组
      @Test
    void test3() {
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        //统计
        lqw.select("count(*) as count,tel");
//        按电话号码分组
        lqw.groupBy("tel");
        List<Map<String,Object>> users = userDao.selectMaps(lqw);
        System.out.println(users);
    }

查询条件设置

查询条件
  • 范围匹配:>、=、between
  • 模糊匹配:like
  • 空判定:null
  • 包含性匹配:in
  • 分组:group
  • 排序:order

条件构造器官网:https://baomidou.com/pages/10c804/#abstractwrapper

用户登录(eq匹配)
  • eq : 等同于 =
//    等匹配查询
    @Test
    void testEquals() {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //等同于= 验证登录操作
        lqw.eq(User::getName,"Jock").eq(User::getPassword,"itcat");
        User user = userDao.selectOne(lqw);
        System.out.println(user);
    }
范围查询
  • lt : 小于
  • le : 小于等于
  • gt : 大于
  • ge : 大于等于
  • eq : 等于(即:equals)
  • between : 两数之间
 @Test
    void testArea() {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //范围查询 lt le gt ge eq between
        //区间查询 
        lqw.between(User::getAge,20,30);
        List<User> user = userDao.selectList(lqw);
        System.out.println(user);
    }
模糊匹配
  • like() : 前后加百分号,如 %J%
  • likeLeft() : 前面加百分号,如:%J
  • likeRight : 后面加百分号,如:J%
  @Test
    void testArea2() {
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        //模糊匹配 like    likeLeft : %J; likeRight : J%
        lqw.like(User::getName,"J");
        List<User> user = userDao.selectList(lqw);
        System.out.println(user);
    }

映射匹配兼容性

字段映射

(1)情况一:表字段与编码属性设计不同步,即表字段与实体类中的字段不相同

​ 解决方法:

  • 名称:@TableField

  • 类型:属性注解

  • 添加位置:模型类属性定义的上方

  • 作用:设置当前属性对应的数据库表中的字段关系

  • 例子:

    public class User {
    //pwd为表中的字段
       @TableField(value="pwd")
       private String password;
    }
    
  • 相关属性:value(默认) : 设置数据库表中的字段名称

(2)情况二:实体类中添加了数据库中没有定义的属性

​ 解决方法:

public class User {
   @TableField(exist = false)
   private  Integer online; 
}
  • 相关属性:exist : 设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用

(3)情况三:采用默认查询开放了更多的字段查看权限

​ 解决方法:

public class User {
//pwd为表中的字段
   @TableField(value="pwd",select = false)
   private String password;
}
  • select : 设置属性是否参与查询,此属性与select()映射配置不冲突
表名映射

(4)情况四:表名与实体类的名称不同步

​ 解决方法:

  • 名称:@TableName
  • 类型:类注解
  • 添加位置:模型类的上方
  • 作用:设置当前类对应与数据库关系
  • 例子: value : 设置数据库表名称
@TableName("tb_user")  //tb_user为表名
public class User {
   .....
}
  • 可使用全局配置

不在实体类的上方添加@TableName(“tb_user”),直接在application.yml配置文件中配置:

table-prefix:tb_

在这里插入图片描述

id生成策略

id生成策略控制
  • 名称:@TableId
  • 类型:属性注解
  • 位置:模型类中用于表示主键的属性定义上方
  • 作用:设置当前类中主键属性的生成策略
  • 例子:
public class User {
    //AUTO 数据库ID自增  该类型请确保数据库设置了ID自增  否则无效
     //@TableId(type = IdType.AUTO)
    //INPUT 用户输入ID 该类型可以通过自己注册自动填充插件进行填充
	//@TableId(type = IdType.INPUT)
	//ASSIGN_ID 雪花算法
    @TableId(type = IdType.ASSIGN_ID)
	private Long id;
}
  • 相关属性:
    • value : 设置数据库主键名称
    • type : 设置主键属性的生成策略,值参照IdType枚举值
  • @TableId的IdType的各选项
    • Auto(0) : 使用数据库id自增策略控制id生成
    • NONE(1) : 不设置id生成策略
    • INPUT(2) : 用户手工输入id
    • ASSIGN_ID(3) : 雪花算法生成id(可兼容数值型与字符串型)
    • AAIGN_UUID(4) : 以UUID生成算法作为id生成策略
雪花算法

占位符:0 时间戳(41) 机器码(5+5) 序列号(12)

0 | 00100110111011010101100001101010011000110 | 10000 | 1001 | 000000000010
  • 全局配置雪花算法

​ 在application.yml配置文件的mybatis-plus:下添加:

db-config:
      id-type: assign_id

在这里插入图片描述

然后去除实体类中属性上方的@TableId(type = IdType.ASSIGN_ID)即可。

多数据操作(删除与查询)

删除多条数据
  @Test
    void testDelete() {
       // List<Long> list = new ArrayList<>();
       // list.add(1673588033600581634L);
      //  list.add(1673594396900741121L);
      //  list.add(667L);
        //或:
        List<Long> list = Arrays.asList(new Long[]{1673596821212651522l,1673596925982240770l});
        userDao.deleteBatchIds(list);
    }
查询多条数据
    @Test
    void testSelect() {
        //查询多条数据
       // List<Long> list = new ArrayList<>();
       // list.add(1L);
       // list.add(2L);
        //list.add(3L);
        //或:
        List<Long> list = Arrays.asList(new Long[]{1L, 2L, 3L});
        userDao.selectBatchIds(list);
    }

逻辑删除

  • 删除操作业务问题:业务数据从数据库中丢弃
  • 逻辑删除:为数据设置是否可用状态字段,删除时设置字段为不可用状态,数据保留在数据库中
操作步骤
  • 先在表中添加用于显示状态的字段

在这里插入图片描述

  • 在实体类中添加该字段,并使用@TableLogic设定当前字段为逻辑删除标记字段:

在这里插入图片描述

或者在application.yml配置文件中进行@TableLogic的全局配置:

      logic-delete-field: status #\此字段为数据库中设置逻辑删除的字段
      logic-not-delete-value: 0 #设置可用状态
      logic-delete-value: 1    #设置不可用状态

在这里插入图片描述

运行结果:

在这里插入图片描述

乐观锁(Update)

操作步骤
1.操作数据库表

首先在数据库表中添加一个字段,用于标记正在操作该数据库表的用户。

在这里插入图片描述

2.修改实体类
  • 在实体类中添加该字段

在这里插入图片描述

3.新建一个乐观锁拦截器配置类
  • 配置拦截器实现锁机制对应的动态SQL语句拼装
package com.itcast.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author :LTY
 * @date :Created in 2023/6/26 22:37
 * @description:乐观锁的配置类
 * @modified By:
 * @version: $
 */
@Configuration
public class MpConfig {

    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
//        定义MyBatisPlus的拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //添加乐观锁拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}
4.编写测试类
  @Test
    void testUpdate() {
       // User user = new User();
      //  user.setId(2l);
      //  user.setName("Amy");
       //  user.setVersion(1);
       // userDao.updateById(user);
        
         //不收集version数据
          //1.先通过要修改的数据id将当前数据查询出来
        User user = userDao.selectById(2L);
          //2.将要修改的属性逐一设置
          user.setName("李湘");
          userDao.updateById(user);
    }

运行结果:

在这里插入图片描述

模拟秒杀操作
    @Test
    void testUpdate() {
        //1.先通过要修改的数据id将当前数据查询出来
          //模拟A用户进行修改
        User user = userDao.selectById(2L);  //version=3
        //模拟B用户进行修改
        User user2 = userDao.selectById(2L); //version=3
        user2.setName("李玉 aaa");
        userDao.updateById(user2);    //version=4
        //2.将要修改的属性逐一设置
        user.setName("李湘 bbb");
        userDao.updateById(user);    version=3条件不成立,故此操作不执行
    }

运行结果:

在这里插入图片描述

代码生成器

使用这个可以超快速生成entity、service、controller层

  • 模板:由MyBatisPlus提供
  • 数据库相关配置:读取数据库获取信息
  • 开发者自定义配置:手工配置
步骤
1.新建一个SpringBoot项目

在这里插入图片描述

2.pom.xml文件的配置:
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.itcast</groupId>
    <artifactId>mybatisplus_04_generator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatisplus_04_generator</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <!--    依赖坐标-->
    <dependencies>
        <!--        spring webmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.6</version>
        </dependency>
        <!--        mybatisplus依赖坐标-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.2</version>
        </dependency>
        <!--        druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        <!--        mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <!--            test依赖-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>3.0.2</version>
            <scope>test</scope>
        </dependency>
        <!--        lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
<!--        若导包爆红,则可能是版本问题,降低版本即可 -->
        <!--        代码生成器  若版本为3.5.2则velocity依赖可以不导入 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.2</version>
        </dependency>
       <!--velocity模板引擎  -->
                <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.0</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
3.CodeGenerator代码生成器类
  • 此类作为自动生成器的入口

    在这里插入图片描述

package com.itcast;

import com.baomidou.mybatisplus.annotation.IdType;
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.generator.config.rules.DateType;

/**
 * @author :LTY
 * @date :Created in 2023/6/27 23:26
 * @description:
 * @modified By:
 * @version: $
 */
public class CodeGenerator {

    public static void main(String[] args) {
        //1.获取代码生成器的对象
        AutoGenerator autoGenerator = new AutoGenerator();

        //设置数据库相关配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql:///mybatisplus_db?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false&useUnicode=true");
        dataSource.setUsername("root");
        dataSource.setPassword("010802");
        autoGenerator.setDataSource(dataSource);

        //设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        //设置代码生成后存放的路径
        //user.dir表示获取当前的目录
        String projectPath = System.getProperty("user.dir");
        globalConfig.setOutputDir("D:\\idea-file\\mybatisplus_04_generator" + "/src/main/java");
        //设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setOpen(false);
        //设置作者
        globalConfig.setAuthor("LTY");
        //设置是否覆盖原始生成的文件
        globalConfig.setFileOverride(true);
        //设置数据层接口名,%s为占位符,指代模块名称 dao命名方式,自动生成的dao类前面加前缀
        globalConfig.setMapperName("%sDao");
        //service 命名方式,自动生成的Service类前面会自动添加前缀
        globalConfig.setServiceName("%sService");
        //数据库中的时间类型对应的java类,此设置表示Date类,默认为java8的时间类
        globalConfig.setDateType(DateType.ONLY_DATE);
        //设置Id生成策略  ASSIGN_ID为雪花算法
        globalConfig.setIdType(IdType.ASSIGN_ID);
        globalConfig.setEnableCache(false); //XML 二级缓存
       autoGenerator.setGlobalConfig(globalConfig);

        //设置包名相关配置
        PackageConfig packageConfig = new PackageConfig();
        //设置生成的包名,与代码所在位置不冲突,二者叠加组成完整路径
        packageConfig.setParent("com.mybatisplus");
        //设置实体类包名
        packageConfig.setEntity("domain");
        //设置数据访问层包名
        packageConfig.setMapper("dao");
        //设置业务层包名
        packageConfig.setService("service");
        autoGenerator.setPackageInfo(packageConfig);

        //策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        //设置当前参与生成的表名,参数为可变参数 要生成多个表的话在后面添加即可
        strategyConfig.setInclude("tb_user");
        //设置数据库表的前缀名称,模块名 = 数据库表名 - 前缀名 如:User = tb_user - tb_
        strategyConfig.setTablePrefix("tb_");
        //设置是否启用Rest风格
        strategyConfig.setRestControllerStyle(true);
        //设置乐观锁字段名
        strategyConfig.setVersionFieldName("version");
        //设置逻辑删除字段名 status为你数据库表中用于设置逻辑删除的字段
        strategyConfig.setLogicDeleteFieldName("status");
        //设置是否启用lombok
        strategyConfig.setEntityLombokModel(true);
        autoGenerator.setStrategy(strategyConfig);

        //2.执行生成操作
        autoGenerator.execute();


    }
}

点击运行。

运行结果为如下情况,则证明代码自动生成成功了。

在这里插入图片描述

在这里插入图片描述

测试UserDao
  • 配置application.yml文件:
#JDBC连接池
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=utf-8
    username: root
    password: "010802"  #若密码为纯数字,则需要加上双引号

#开启mp的日志(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  • 编写测试类
package com.itcast.mybatisplus_04_generator;


import com.itcast.CodeGenerator;
import com.mybatisplus.dao.UserDao;
import com.mybatisplus.domain.User;
import com.mybatisplus.service.UserService;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
@MapperScan("com.mybatisplus.dao") //扫描包下的所有类或接口,作用为:指定要变成实现类的接口所在的包,包下面的所有接口在编译之后都会生成相应的实现类
class Mybatisplus04GeneratorApplicationTests {

   @Autowired(required = false)
 private UserDao userDao;

    @Test
    void contextLoads() {
       List<User> users = userDao.selectList(null);
       System.out.println(users);
    }

}
  • 修改UserDao接口
@Mapper
@Repository

在这里插入图片描述

  • 修改实体类

在这里插入图片描述

运行结果为:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值