【java】【MyBatisPlus】【二】MyBatisPlus常规使用

news2024/11/15 17:51:50

目录

一、简述

1、概述

2、特性

3、支持数据库

 二、标准数据层开发

1、标准数据层CRUD功能

1.1 新增insert

1.2 删除功能deleteById

1.3 修改功能updateById

1.4 查询单个selectById

1.5 查询全部selectList

2、分页功能

2.1 设置MybatisPlus分页拦截器作为Spring管理的bean

2.2 分页查询IPage selectPage(IPage page)

三、DQL编程控制

1、条件查询方式IPage selectPage(Wrapper queryWrapper)

1.1 方式一查询(不推荐) :

 1.2 方式二查询(推荐):lambda格式减少列名出错

1.3 方式三查询(推荐):使用Lambda方式的API

1.4 组合查询:链式方式(并且)

1.5 组合查询:链式方式(或) 

1.6 条件查询 :null值处理

2、查询投影

2.1 适用于lambda方式(推荐)

2.2 适用于非lambda方式(不推荐)

 2.3 查询投影的【字段未定义的使用方式】(lambda方式不行)求count

 2.3 分组

3、查询条件设定

3.1 eq相等的查询条件

 3.2 between范围查询

 3.3 模糊匹配like查询(非全文检索版)

4、字段映射与表面映射

4.1 使用TableField(value="数据库字段名")注解 解决数据库字段与实体不一致问题

4.2 使用TableField(exist=false)注解解决数据库未定义属性

4.3 使用TableField(select=false)注解设置属性是否参与查询

4.4   使用TableName("数据库表名")注解设置数据库表名不一致问题

 四、DML编程控制

1、结合id生成规则(Insert)

2、多记录操作(Delete\Select)

3、逻辑删除(Delete/Update )

 4、乐观锁(并发控制)(Update)

 4.1 数据库加字段version,默认1

 4.2 实体类新增属性version以及@Version注解

 4.3 新增拦截器,优化之前的MybatisPlusConfig

4.4 运行修改方法

4.5 检验乐观锁 

五、快速开发 

1、代码生成器

 2、pom导入坐标

3、创建CodeGenetator文件

4、执行CodeGenetator


前言:MyBatisPlus简介、CRUD、分页、条件查询

一、简述

1、概述

 

2、特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

3、支持数据库

  • mysql 、mariadb 、oracle 、db2 、h2 、hsql 、sqlite 、postgresql 、sqlserver 、presto 、Gauss 、Firebird

  • Phoenix 、clickhouse 、Sybase ASE 、 OceanBase 、达梦数据库 、虚谷数据库 、人大金仓数据库 、南大通用数据库

 二、标准数据层开发

1、标准数据层CRUD功能

 

1.1 新增insert

@SpringBootTest
class MybatisQuickstartApplicationTests {

    @Autowired
    private EmpMapper empMapper;
    @Test
    void testSave(){
        Emp emp = new Emp();
        emp.setId(0);
        emp.setName("mimi");
        emp.setPassword("111111");
        emp.setUsername("咪咪");
        emp.setGender((short) 2);
        emp.setImage("11.jpg");
        emp.setEntrydate(LocalDate.now());
        emp.setJob((short) 2);
        emp.setDeptId(1);
        emp.setUpdateTime(LocalDateTime.now());
        emp.setCreateTime(LocalDateTime.now());
        empMapper.insert(emp);
    }

}

 

 

注意:这里因为id数据库是int类型的自增字段,我之前没有设置值,导致报错:org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.bocai.entity.Emp' with value '1715193012897251329' Cause: java.lang.IllegalArgumentException: argument type mismatch。 所以设定了一个值就OK 了

1.2 删除功能deleteById

   /**
     * 通过id删除数据,这里ID25是从库里查出来了………O(∩_∩)O哈哈~
     */
    @Test
    void testDelete(){
        empMapper.deleteById(25);
    }

 

1.3 修改功能updateById

    /**
     * 根据ID修改 ,这里的id是库里查的哦
     */
    @Test
    void testUpate(){
        Emp emp = new Emp();
        emp.setId(20);
        emp.setUpdateTime(LocalDateTime.now());
        emp.setName("手感好");
        empMapper.updateById(emp);
    }

注意:这里看上去是setId,实际上他转换成sql是id是where条件

1.4 查询单个selectById

    /**
     * 根据id查询
     */
    @Test
    void testGetById(){
        Emp emp = empMapper.selectById(20);
        System.out.println(emp);
    }

1.5 查询全部selectList

    /**
     * 查询全部
     */
    @Test
    void testGetAll() {
        List<Emp> empList = empMapper.selectList(null);
        System.out.println(empList);
    }

2、分页功能

2.1 设置MybatisPlus分页拦截器作为Spring管理的bean

 

package com.bocai.config;

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

/**
 * 配置MP的分页插件
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 1、定义MybatisPlus拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 2、添加具体的拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;

    }
}

2.2 分页查询IPage<T> selectPage(IPage<T> page)

上一步的拦截器必须添加 

    /**
     * 分页查询
     *
     */
    @Test
    void testGetByPage(){
        IPage page = new Page(1,5); // 当前第一页,每页5条
        empMapper.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());
    }

 

三、DQL编程控制

准备用户 

User

package com.bocai.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id; //ID
    private String name; //姓名

    private Integer age; //年龄

    private Short gender; // 性别 1 男  2  女

    private String phone; //电话
}

UserMapper

package com.bocai.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bocai.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

 

1、条件查询方式IPage<T> selectPage(Wrapper<T> queryWrapper)

1.1 方式一查询(不推荐) :

   /**
     * 条件查询  //  小于的查询条件lt(列名,值) 
     */
    @Test
    void testConditionGetAll() {
        //按条件查询
        QueryWrapper qw = new QueryWrapper<>();
        qw.lt("age",38); 
        List<User> userList = userMapper.selectList(qw);
        System.out.println(userList);
    }

 

 1.2 方式二查询(推荐):lambda格式减少列名出错

    /**
     * 条件查询  //  小于的查询条件lt(列名,值)
     */
    @Test
    void testConditionGetAll() {

        //按条件查询 方式二lambda格式
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.lambda().lt(User::getAge,38);
        List<User> userList = userMapper.selectList(qw);
        System.out.println(userList);
    }

1.3 方式三查询(推荐):使用Lambda方式的API

    /**
     * 条件查询  //  小于的查询条件lt(列名,值)
     */
    @Test
    void testConditionGetAll() {

        //按条件查询 方式三lambda格式
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,38);
        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

1.4 组合查询:链式方式(并且)

    /**
     * 条件查询  //  小于的查询条件lt(列名,值)
     */
    @Test
    void testConditionGetAll() {


        //按条件查询 多条件
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(User::getAge,49).gt(User::getAge,38);

        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

 

1.5 组合查询:链式方式(或) 


    /**
     * 条件查询  //  小于的查询条件lt(列名,值)
     */
    @Test
    void testConditionGetAll() {


        //按条件查询 多条件38到49之外
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        // 38到49之外
        lqw.lt(User::getAge,38).or().gt(User::getAge,49);

        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

1.6 条件查询 :null值处理

前置条件,我们需要模拟前端传参

package com.bocai.entity.query;

import com.bocai.entity.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserQuery extends User {
    private Integer age2; //年龄

}
    /**
     * 条件查询  
     */
    @Test
    void testConditionGetAll() {


        //按条件查询 处理null 问题
        // 模拟页面传统过来的查询数据
        UserQuery userQuery = new UserQuery();
//        userQuery.setAge(20);
        userQuery.setAge2(40);

        // null的判断

        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        // null方式判断是否为空,为空不执行这个
        lqw.lt(null != userQuery.getAge2(),User::getAge,userQuery.getAge2())
           .gt(null != userQuery.getAge(),User::getAge,userQuery.getAge());
        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

2、查询投影

查询投影就是查询显示哪些字段

2.1 适用于lambda方式(推荐)

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

        //========按条件查询 查询投影(适用于lambda方式)

        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.select(User::getId,User::getAge,User::getName);
        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

2.2 适用于非lambda方式(不推荐)

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

        //========按条件查询 查询投影(适用于非lambda方式)不推荐

    QueryWrapper<User> qw = new QueryWrapper<>();
        qw.select("id","age","name");
    List<User> userList = userMapper.selectList(qw);
        System.out.println(userList);
    }

 2.3 查询投影的【字段未定义的使用方式】(lambda方式不行)求count

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

   //========按条件查询 【字段未定义的使用方式】查询投影求count
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.select("count(*) as count");
        List<Map<String, Object>> maps = userMapper.selectMaps(qw);
        System.out.println(maps);
    }

 2.3 分组

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

    //========按条件查询 查询投影求count,并分组
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.select("count(*) as count, gender").groupBy("gender");
        List<Map<String, Object>> maps = userMapper.selectMaps(qw);
        System.out.println(maps);
    }

3、查询条件设定

条件构造器 | MyBatis-Plus

3.1 eq相等的查询条件

一条数据就使用selectOne

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

    //========按条件查询 查询条件设定 =匹配
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        //等同于=号
        lqw.eq(User::getName,"金毛狮王").eq(User::getAge,45);
        User user = userMapper.selectOne(lqw);
        System.out.println(user);
    }

 3.2 between范围查询

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

   //========按条件查询 范围查询between
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        //范围查询between
        lqw.between(User::getAge,38,57);
        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

 

 3.3 模糊匹配like查询(非全文检索版)

likeLeft  likeRight 模糊匹配%位置

 /**
     * 条件查询  //
     */
    @Test
    void testConditionGetAll() {

    //========按条件查询 模糊查询(非全文检索版)
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
       //========按条件查询 like 模糊查询   不在演示likeLeft   likeRight 模糊匹配%位置
        lqw.like(User::getName,"王");
        List<User> userList = userMapper.selectList(lqw);
        System.out.println(userList);
    }

 

4、字段映射与表面映射

4.1 使用TableField(value="数据库字段名")注解 解决数据库字段与实体不一致问题

 

4.2 使用TableField(exist=false)注解解决数据库未定义属性

实体有online字段,数据库没有

package com.bocai.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id; //ID
    private String name; //姓名
    private Integer age; //年龄
    private Short gender; // 性别 1 男  2  女
    private String phone; //电话
    @TableField(exist = false)
    private Integer online; //是否在线 1 在线 2 不在线
}

 

4.3 使用TableField(select=false)注解设置属性是否参与查询

 

4.4   使用TableName("数据库表名")注解设置数据库表名不一致问题

 

 四、DML编程控制

 

package com.bocai.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 员工实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
    @TableId(type= IdType.AUTO) //数据库自增ID方式
    private Integer id; //ID
    private String username; //用户名
    private String password; //密码
    private String name; //姓名
    private Short gender; //性别 , 1 男, 2 女
    private String image; //图像url
    private Short job; //职位 , 1 班主任 , 2 讲师 , 3 学工主管 , 4 教研主管 , 5 咨询师
    private LocalDate entrydate; //入职日期
    private Integer deptId; //部门ID
    private LocalDateTime createTime; //创建时间
    private LocalDateTime updateTime; //修改时间
}

 或者使用全部配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
    username: root
    password: XXX
  main:
    banner-mode: off  # 关闭控制台springboot的logo
mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台显示sql
  global-config:
    db-config:
      id-type: auto   # 数据库id生产规则全局 配置 # ASSIGN_ID雪花算法,数据库id建议使用Long类型
   #   table-prefix: tbl_    # 数据库表前缀全局配置
    banner: false   # 关闭控制台mybatis-plus的logo



1、结合id生成规则(Insert)

   /**
     * 新增
     */
    @Test
    void testSave(){
           Emp emp = new Emp();
//        emp.setId(0);  //实体类设置这个属性就不需要这个@TableId(type= IdType.AUTO)  //数据库自增ID 方式
        emp.setName("dadamimi");
        emp.setPassword("111111");
        emp.setUsername("大大咪咪");
        emp.setGender((short) 2);
        emp.setImage("11.jpg");
        emp.setEntrydate(LocalDate.now());
        emp.setJob((short) 2);
        emp.setDeptId(1);
        emp.setUpdateTime(LocalDateTime.now());
        emp.setCreateTime(LocalDateTime.now());
        empMapper.insert(emp);
    }

数据库ID建议使用Long类型,不然本文后面的雪花算法等长度不够 

 

IdType.AUTO:数据库自增
IdType.NONE:没有策略
IdType.INPUT:用户自己输入  。那么数据库的自增策略要移除,新增要指定id值
IdType.ASSIGN_ID:雪花算法。那么数据库的自增策略要移除,新增不需要指定id值
IdType.ASSIGN_UUID:UUID
/** @deprecated */
-======== 下面三个过时了===
IdType.ID_WORKER:生成整型 被他取代IdType.ASSIGN_ID:
IdType.ID_WORKER_STR:生成字符串 被他取代IdType.ASSIGN_ID:
IdType.UUID:被他取代IdType.ASSIGN_UUID:

2、多记录操作(Delete\Select)

    /**
     * 删除多条记录
     */
    @Test
    void testDeleteList(){
        List<Integer> list = new ArrayList<>();
        list.add(26);
        list.add(28);
        empMapper.deleteBatchIds(list);
    }

 

3、逻辑删除(Delete/Update )

 ​​​​​​​​​​​​​​

 

 

 

 

 

 全局配置,就不需要再实体去配置逻辑删除字段了

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
    username: root
    password: runa#2050
  main:
    banner-mode: off  # 关闭控制台springboot的logo
mybatis-plus:
  configuration:
    #在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台显示sql
  global-config:
    db-config:
      id-type: auto   # 数据库id生产规则全局 配置 # ASSIGN_ID雪花算法,数据库id建议使用Long类型
     # logic-delete-field: deleted # 全局配置逻辑删除字段名
     # logic-delete-value: 0 # 全局配置逻没有被删除的写0
      #logic-not-delete-value: 1  # 全局配置逻没有被逻辑删除的写1
    #   table-prefix: tbl_    # 数据库表前缀全局配置
    banner: false   # 关闭控制台mybatis-plus的logo



 4、乐观锁(并发控制)(Update)

 

 4.1 数据库加字段version,默认1

 

 4.2 实体类新增属性version以及@Version注解

 

 4.3 新增拦截器,优化之前的MybatisPlusConfig

 

package com.bocai.config;

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

/**
 * 配置MP的分页插件
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 1、定义MybatisPlus拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 2、添加分页的拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        // 3、添加乐观锁的拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;

    }
}
package com.bocai.config;

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

/**
 * 配置MP的分页插件
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 1、定义MybatisPlus拦截器
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 2、添加分页的拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        // 3、添加乐观锁的拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;

    }
}

4.4 运行修改方法

需要传Version数值进行修改

这个方式不需要version传值,因为查询出来的数据有version

 

4.5 检验乐观锁 

 

所有bbb 没有成功 ,下面是分析

五、快速开发 

1、代码生成器

 

 

 

 2、pom导入坐标

<?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>
        <!-- 1、修改为2.7.5 -->
        <version>2.7.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bocai</groupId>
    <artifactId>mybatis_quickstart</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!--   2、 删除这里
    <name>mybatis_quickstart</name>
    <description>mybatis_quickstart</description>
    -->
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--  3、 引入mybatisplus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <!--  4、 引入druid -->
        <!--
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>
        -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.23</version>
        </dependency>

        <!--   5、lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <scope>provided</scope> <!-- 不打包 -->
            <version>1.18.24</version>
        </dependency>

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

        <!-- velocity模版引擎   -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、创建CodeGenetator文件

package com.bocai;

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;

public class CodeGenerator {
    public static void main(String[] args) {
        AutoGenerator autoGenerator = new AutoGenerator();
        // 配置数据库
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("runa#2050");
        autoGenerator.setDataSource(dataSourceConfig);

        // 设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/mybatis_quickstart/src/main/java"); //设置代码生成文件输出位置  /mybatis_quickstart(这里目录依据你实际项目配置)
        globalConfig.setOpen(false); // 设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("春天的菠菜"); //设置作者
        globalConfig.setFileOverride(false); // 设置是否覆盖原始生成的文件默认是false
        globalConfig.setMapperName("%sMapper"); //设置数据层接口名,%s为占位符,  指代模块名称  也有这样写的%Dao,其实不指定的话 他默认就是Mapper
        globalConfig.setIdType(IdType.AUTO); //设置id生成策略,目前是数据库自增,   可以ASSIGN_ID雪花算法,但数据库就不能是自增属性了
        autoGenerator.setGlobalConfig(globalConfig);

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

        // 策略设置 这个是关键
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("dept");// 设置当前参与生成的  表名,参数为可变参数
//        strategyConfig.setInclude("tbl_user");// 设置当前参与生成的  表名,参数为可变参数,("tbl_user","sss","ssss")
//        strategyConfig.setTablePrefix("tbl_"); //设置数据库表的前缀名称。 模块名= 数据库名 - 前缀名  例如 User = tbl_user - tbl
        strategyConfig.setRestControllerStyle(true);  //设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version"); // 设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted"); //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true); //设置是否启用lambok
        autoGenerator.setStrategy(strategyConfig);

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

    }
}

4、执行CodeGenetator

 完美

下面那个xml可根据需要迁移到resources对应的文件目录下(包名目录相同) 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LSTM-Attention单维时间序列预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Redis基本命令和常用数据类型

文章目录 前言一、Redis简介二、基本操作1.赋值2.取值3.切换数据库4.查看数据库所有键&#xff08;key&#xff09;5.查看键值类型6.移动键值到其他数据库7.设置键值生存时间&#xff08;两种&#xff09;8.查看键值生存时间9.查看当前数据库大小10.判断键是否存在11.清空当前数…

IntelliJ IDEA 2020.2.1白票安装使用方法

先安装好idear Plugins 内手动添加第三方插件仓库地址&#xff1a;https://plugins.zhile.io 搜索&#xff1a;IDE Eval Reset插件进行安装 输入https://plugins.zhile.io 手动安装离线插件方法 安装包可以去笔者的CSDN资源库下载 安装mybaties插件

Simulink模型加密共享

1.前言 为了保护知识产权&#xff0c;有时候需要让用户能使用slx模型运行仿真&#xff0c;但是无法查看和修改模型和子系统的结构&#xff0c;这时可以用Simulink coder来生成受保护的模型。主要步骤如下&#xff1a; &#xff08;1&#xff09;将slx模型的各个子系统唯一命名…

Nginx负载均衡反向代理动静分离

文章目录 nginx负载均衡&反向代理&动静分离环境说明部署动静分离1.主机lnmp部署一个动态页面&#xff0c;在此以discuz论坛系统为例2.主机n1部署两个静态页面访问动、静态页面 配置负载均衡配置反向代理访问测试 nginx负载均衡&反向代理&动静分离 环境 主机名…

重测序基因组:Pi核酸多样性计算

如何计算核酸多样性 Pi 本期笔记分享关于核酸多样性pi计算的方法和相关技巧&#xff0c;主要包括原始数据整理、分组文件设置、计算原理、操作流程、可视化绘图等步骤。 基因组Pi核酸多样性&#xff08;Pi nucleic acid diversity&#xff09;是一种遗传学研究中用来描述种群内…

使用CDN构建读取缓存设计

在构建需要高吞吐量和最小响应时间的系统的API时&#xff0c;缓存几乎是不可避免的。每个在分布式系统上工作的开发人员都曾在某个时候使用过某种缓存机制。在本文中&#xff0c;我们将探讨如何使用CDN构建读取缓存设计&#xff0c;不仅可以优化您的API&#xff0c;还可以降低基…

JVM第十六讲:调试排错 - Java 线程分析之线程Dump分析

调试排错 - Java 线程分析之线程Dump分析 本文是JVM第十六讲&#xff0c;Java 线程分析之线程Dump分析。Thread Dump是非常有用的诊断Java应用问题的工具。 文章目录 调试排错 - Java 线程分析之线程Dump分析1、Thread Dump介绍1.1、什么是Thread Dump1.2、Thread Dump特点1.3、…

maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories

前言 略 说明 新设备上安装了mvn 3.8.5&#xff0c;编译新项目出错&#xff1a; [ERROR] Non-resolvable parent POM for com.admin.project:1.0: Could not transfer artifact com.extend.parent:pom:1.6.9 from/to maven-default-http-blocker (http://0.0.0.0/): Bl…

【LeetCode】 387. 字符串中的第一个唯一字符

题目链接 文章目录 所有方法 复杂度 ( O ( n ) O(n) O(n)、 O ( ∣ Σ ∣ ) O(|\Sigma|) O(∣Σ∣)) Python3方法一&#xff1a;collections.Counter() 统计频次方法二&#xff1a;哈希映射 { key字符&#xff1a;value【首次出现的索引 or -1 出现多次】}方法三&#xff1a; c…

账号合租平台源码Thinkphp6.1|内置详细搭建教程

小白账号合租平台说明 系统采用的是常见的租号平台模式,现在网络上流出的这种类型的源码还很少 平台介绍 1.租号模式,用户可自行选择单独租号或采用合租的模式。 2.支付,采用易支付通用接口 3.邀请返利,为了站长能更好推广推荐了邀请返利功能 4.用户提现功能 5.工单…

社会网络分析软件

UCINET UCINET 6 for Windows

vue3中弹框中的el-select下拉组件显示value而不显示label

1.场景 使用element-ui中的el-select&#xff0c;给选择框赋值时显示的值是value不是label 2.原因分析 3.解决方法 在点击编辑按钮后将获取到的对象中的os属性值改为string类型 <el-select v-model"form.os" clearable placeholder"请选择" style&qu…

【Java】正则表达式,校验数据格式的合法性。

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 正则表达式 正则表达式&#xff1a; ①可以校…

互联网Java工程师面试题·Java 面试篇·第一弹

目录 1、Java 中能创建 volatile 数组吗&#xff1f; 2、volatile 能使得一个非原子操作变成原子操作吗&#xff1f; 3、volatile 修饰符的有过什么实践&#xff1f; 4、volatile 类型变量提供什么保证&#xff1f; 5、10 个线程和 2 个线程的同步代码&#xff0c;哪个更容…

MPI并行编程技术

MPI并行编程技术 MPI含义及环境搭建安装点对点通信阻塞型接口MPI_SendMPI_Recv 阻塞式示例tag雅可比迭代示例死锁 MPI含义及环境搭建安装 MPICH官网 Github地址 MPI历史版本下载地址 安装教程 MPI介绍 MPI课程 点对点通信 阻塞型接口 MPI_Send MPI_Recv 阻塞式示例 tag 雅…

贪心算法(1)--经典贪心算法

目录 一、活动安排问题 二、最优装载问题 三、分数背包问题 四、多机调度问题 一、活动安排问题 1、策略 活动安排问题&#xff1a;设有n个活动的集合E{1,2,...,n}&#xff0c;每个活动i都有一个使用该资源的起始时间和一个结束时间&#xff0c;且。如果选择了活动i则它在…

新年学新语言Go之五

一、前言 Go虽然不算是面向对象语言&#xff0c;但它支持面向对象一些特性&#xff0c;面向接口编程是Go一个很重要的特性&#xff0c;而Go的接口与Java的接口区别很大&#xff0c;Go的接口比较复杂&#xff0c;这里仅用一个最简单例子做介绍&#xff0c;复杂的我也还没学。 …

VMware中安装centos无网络,配置教程

VMware虚拟机中装了centos7,装完之后一直无法联网&#xff0c;网上的教程都试了也没用&#xff0c;这里记录一下最后的解决方案。 VMware配置 1. 点击 虚拟机-》设置 windows配置 打开电脑网络连接 共享选项选中我们虚拟机网络中包含的VMnet8的 VMnet8网络就自动变成这样了&a…

软件研发流程、架构规范、技术标准、需求过程等全文档

前言&#xff1a; 软件项目管理全文档包括以下几个方面&#xff1a;需求分析、项目规划、过程管理、测试和部署。 全文档获取&#xff1a;Q:262086839 例图在文末。 正文&#xff1a; 一、需求分析是软件项目管理的第一步&#xff0c;也是非常关键的一步。在需求分析阶段&…