MyBatis-Plus详细教程(雪花算法、条件构造器、分页插件、代码生成器)

简介

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生

image-20230107124533165

特性

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

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

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,

    更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

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

  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

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

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

  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速入门

创建数据库表

创建项目

创建SpringBoot项目

添加依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
​
 <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
 </dependency>
​
 <dependency>
   <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
 </dependency>
       

配置

spring.datasource.type=com.zaxxer.hikari.HikariDataSource # 使用默认的连接池
server.port=7777
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///jdbcDemo
spring.datasource.username=root
spring.datasource.password=123456

创建实体类

@Data
public class Person {
    private Long id; 
    private String name;
    private int age;
}

创建Mapper

mapper继承自BaseMapper

public interface PersonMapper extends BaseMapper<Person> {}

启动类配置

@SpringBootApplication
@MapperScan(basePackages = "com.whitecamellia.mapper")
public class MybatisplusdemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisplusdemoApplication.class, args);
    }
}

测试

单元测试

@SpringBootTest
class MybatisplusdemoApplicationTests {
​
    @Autowired
    private PersonMapper personMapper;
​
    @Test
    public void test1() {
        List<Person> list = personMapper.selectList(null);
        list.forEach(System.out::println);
    }
}

日志功能

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

如果配置为org.apache.ibatis.logging.stdout.StdOutImpl就只会在控制台窗口打印,不会记录到日志文件。如果需要保存打印的SQL到文件就不能设置为StdOutImpl,可以设置为Slf4jImpl,也可以不设置。然后对应接口所在包设置logback对应包的日志等级

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logging.level.root = warn
logging.level.com.whitecamellia.mybatis_plusdemo =debug
logging.file.name=log.log

结果

Person(id=1, name=zs, age=23)
Person(id=2, name=ls, age=24)

BaseMapper

测试BaseMapper新增功能

    
@Test
    public void testInsert() {
        //新增用户信息
        //INSERT INTO person ( id, name, age ) VALUES ( ?, ?, ? )
        Person person = new Person();
        person.setId(null);
        person.setAge(25);
        person.setName("王五");
        int row = personMapper.insert(person);
        System.out.println(row);//1
        //添加过程中读取 id值
        System.out.println(person.getId());//1500016221535105026 雪花算法
    }

测试BaseMapper删除功能

    
@Test
    public void testDelete() {
        //DELETE FROM person WHERE id=?
        //int i = personMapper.deleteById(1500017501649301505L);
      
        //Person person = new Person();
        //person.setId(2L);
        //personMapper.deleteById(person);
​
        //DELETE FROM person WHERE name = ? AND age = ?
        //HashMap<String, Object> map = new HashMap<>();
        //map.put("name", "王五");
        //map.put("age", "25");
        //int i = personMapper.deleteByMap(map);
​
        //DELETE FROM person WHERE id IN ( ? , ? )
        ArrayList<Long> list = new ArrayList<>();
        list.add(1L);
        list.add(2L);
        int i = personMapper.deleteBatchIds(list);
    }

测试BaseMapper修改功能

   @Test
    public void testUpdate() {
        //UPDATE person SET name=?, age=? WHERE id=?
        Person person = new Person();
        person.setId(1L);
        person.setName("zss");
        person.setAge(233);
        int row = personMapper.updateById(person);
    }

测试BaseMapper查询功能

 /**
     * 查询数据
     */
    @Test
    public void testQuery() {
        //SELECT id,name,age FROM person WHERE id=?
        //Person person1 = personMapper.selectById(1L);
​
        // SELECT id,name,age FROM person WHERE id IN ( ? , ? , ? )
        //List<Integer> list = Arrays.asList(1, 2, 3);
        //List<Person> list1 = personMapper.selectBatchIds(list);
​
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("name", "zs");
//        map.put("age", "23");
        //SELECT id,name,age FROM person WHERE name = ? AND age = ?
//        List<Person> list = personMapper.selectByMap(map);
        
//        QueryWrapper<Person> queryWrapper = new QueryWrapper<>();
//        queryWrapper.select("id","name");
//        List<Person> list = personMapper.selectList(queryWrapper);      
    }

自定义功能

如果你觉得BaseMapper提供的方法都不适用,也可以自己封装方法,和之前mybatis是一样的。

mybatisPlus对mybatis只是增强,不做改变。

mapper映射文件配置

mybatis-plus.mapper-locations=classpath:/mapper/*Mapper.xml

IService

继承关系

public interface PersonService  extends IService<Person> {
}
@Service
public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person> implements PersonService {
}

count

获取总数

 @Autowired
  private PersonService personService;
​
 @Test
   void testPersonService () {
        long count = personService.count();
        log.debug("{}",count);
    }

saveBatch

批量添加

 @Test
    void saveBatch () {
        //Service中批量添加操作
        //INSERT INTO person ( id, name, age ) VALUES ( ?, ?, ? )
        ArrayList<Person> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Person person = new Person();
            person.setName("zs" + i);
            person.setAge(i + 1);
            list.add(person);
        }
            personService.saveBatch(list);
    }
}

注解

TableName

解决表名和实体映射问题

@TableName("t_person")
public class Person {
    private Long id;
    private String name;
    private int age;
}

如果数据库中每张表都加前缀 t_

# mybatisPlus的全局配置  设置实体类和表的统一前缀
mybatis-plus.global-config.db-config.table-prefix=t_

TableId

表明类中的某个属性为主键字段对应的属性

在Mybatis中需要使用 useGeneratedKeys,keyProperty,keyColumn 设置自增主键值的回返,在实体类对象中获取即可。MybatisPlus中在进行数据新增时,在新增成功后,会自动的将自增的主键值返回到实体类对象中,前提是需要在实体类中使用@TableId表明主键字段,并且为自增类型。

  
 @TableId
   private Long id;

value

如果实体类名和列名不一致,可以使用value属性

 @TableId(value = "u_id")
 private Long uid;

type

雪花算法主键增长:type = IdType.ASSIGN_ID,雪花算法自动增长,与列是否是自动增长没关系

默认主键增长:type = IdType.AUTO,要把列设置为自动增长,否则无效

@TableId(value = "u_id", type = IdType.AUTO)
private Long uid;

如果所有表都需要默认主键自增,可以全局配置

# 默认主键自增
mybatis-plus.global-config.db-config.id-type=auto

TableField

解决数据库列名和实体类列名不一致问题

 @TableField("user_name")
 private String name;

注意:mybatisPlus中默认支持驼峰映射

OrderBy

内置 SQL 默认指定排序,优先级低于 wrapper 条件查询

@OrderBy(asc = true)
private int age;

TableLogic

描述:表字段逻辑处理注解(逻辑删除)

@TableLogic(value = "0",delval = "1")
private Integer isDelete;

全局配置如下(不建议)

mybatis-plus.global-config.db-config.logic-delete-field=isDelete
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

雪花算法

概念

雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,生成的ID称为Snowflake[ˈsnoʊfleɪk] IDs或snowflakes。这种算法由Twitter创建,并用于推文的ID

背景

需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量

数据库的扩展方式:业务分库、主从复制、数据库分表

主从复制:

  1. 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。在赋值过程中,一个服务器充当主服务器,而另外一台服务器充当从服务器。

  2. 优点:

    1. 做数据的热备:(主数据库宕机,从数据库可继续工作,避免数据的丢失),更好的实现了负载均衡。

    2. 降低磁盘I/O访问的频率:业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率。

    3. 读写分离,使数据库能支持更大的并发:

      1. 其中一个是 Master 主库,负责写入数据,称为:写库;其它都是 Slave 从库,负责读取数据,称为:读库

      2. 当主库进行更新时,会自动将数据复制到从库中,而在客户端读取数据时,会从从库中进行读取

      3. 减少锁表的影响,实现更高的并发访问

    4. 数据备份:将主库上的数据,复制到从库,热备份机制,即在主库正常运行的情况下进行备份,不会影响到服务

    5. 高可用:数据备份实际上是一种冗余的机制,通过这种冗余的方式可以换取数据库的高可用性,

      当服务器出现故障 / 宕机,可以切换到从服务器上,保证服务的正常运行

数据库分表

一张表中放所有数据肯定不现实,所以需要分多张表,

分表可以按照垂直分表和水平分表

image-20230107004342243

垂直分表

概念:

是指表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。

比如筛选人信息时候,比较重要的两列是sex和age,我们将不太重要的两列独立放到另一张表中,而且像nicename这种昵称的列和描述

列本身又很长,这样对于比较重要的age,sex列来说,查询时会带来一定性能的提升,

优点:

  • 充分提高了”热点“数据的操作效率

缺点:

  • 表的数量增多,对于表的维护复杂度也随之增加

image-20230107004342243

水平分表

概念:

水平分表就是指以行为单位对数据进行拆分,一般意义上的分表指的就是水平分表。

水平分表适合 表行数特别大的表,有些时候一般我们表行数超过比如3000万就必须分表,但是对于复杂的表可能1000万就需要分表了。

但是不管怎样,当表的数量达到千万级别时,身为架构师的我们就需要考虑架构的性能瓶颈或者隐患。

假设现在有30万行数据,需要对它们进行水平分表:那如何拆分呢?

解决方案

1.主键自增(范围法)

范围法很好理解,可以让第1-100000行数据存放在表1,第100001-200000行数据存放在表2,第200001-300000行数据存放在表3,

以此类推,就是分段,就完成了水平分表。

但是这样做有些复杂,分段范围太小,表会增多,维护比较麻烦,分段范围太大可能依然会导致单表存在性能问题。

分布也不均匀,也许会导致某个分段中只有一条数据,而另一个表中数据达到了100万条

2 取模(hash法)

选择一个合适的hash函数,让id值 和 10取余数,来判断这个到底存到哪张表,比如id是985 就放到5的子表中,id为10086 放到编号为6的子表中,

但是也有问题:复杂,表太多维护麻烦,表数量增多,导致单表性能也存在问题,

好处是:表分布会比较均匀,

问题

水平分表会比垂直分表 复杂很多,比如要求全局唯一的id值,该如何处理?

雪花算法

雪花算法是由Twitter公布的分布式主键生成算法,能保证不同表的主键不重复,

以及相同表的主键有序性(后添加的主键数据会比之前的数大)。

核心思想

长度是一个Long类型,8个字节,64位

  • 第一个bit位是标识部分,在java中由于long的最高位是符号位,正数是0,负数是1,一般生成的ID为正数,所以固定为0。

  • 时间戳部分占41bit,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),这样可以使产生的ID从更小值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年

  • 工作机器id占10bit,比较灵活,比如,可以使用前5位作为数据中心机房标识,后5位作为单机房机器标识,可以部署1024个节点。

  • 序列号部分占12bit,支持同一毫秒内同一个节点可以生成4095个ID

优点: 整体上按照时间自增排序,并且整个分布式系统不会产生ID重复,并且效率较高

缺点:

Wrapper介绍

条件构造器

image-20230107125206458

Wrapper : 条件构造抽象类,最顶端父类  
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    QueryWrapper : 查询条件封装
    UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda 语法
    LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
    LambdaUpdateWrapper : Lambda 更新封装Wrapper

QueryWrapper

组装查询条件

需求:查询用户名包含z的用户,并且年龄是在23-27之间的,并且名字不为null的

      
  //查询用户名包含z的用户,并且年龄是在23-27之间的,并且名字不为null的
        QueryWrapper<Person> wrapper = new QueryWrapper<>();
        wrapper.like("user_name", 'z').
                between("age", 24, 27).
                isNotNull("user_name");
        List<Person> list = personMapper.selectList(wrapper);
        System.out.println(list);
排序查询
     
   //按照年龄降序,如果年龄相同按照id升序排列
        QueryWrapper<Person> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("age").orderByAsc("id");
        List<Person> list = personMapper.selectList(wrapper);
        System.out.println(list);
​
删除
     
   //删除名字 为null这一列的数据
        QueryWrapper<Person> wrapper = new QueryWrapper<>();
        wrapper.isNull("user_name");
        int delete = personMapper.delete(wrapper);
        System.out.println(delete);
更新
       
 //更新年龄大于24岁的并且名字包含w的,或者id等于6的
        QueryWrapper<Person> wrapper = new QueryWrapper<>();
        wrapper.gt("age", 24).like("user_name", "w")
                .or().eq("u_id", 6);
        //把满足条件的数据 更新成person对象信息
        Person person = new Person();
        person.setAge(100);
        person.setUserName("码上未来");
        int update = personMapper.update(person, wrapper);
查询指定列
//查询指定列,user_name,age
QueryWrapper<Person> wrapper = new QueryWrapper<>();
wrapper.select("user_name", "age");
List<Map<String, Object>> list = personMapper.selectMaps(wrapper);
System.out.println(list);
子查询
//查询id小于等于5的 用户信息
//SELECT * FROM t_person WHERE u_id IN (SELECT u_id FROM t_person WHERE u_id < 5)
QueryWrapper<Person> wrapper = new QueryWrapper<>();
wrapper.inSql("u_id","SELECT u_id FROM t_person WHERE u_id < 5");
List<Person> list = personMapper.selectList(wrapper);
System.out.println(list);

UpdateWrapper

//更新年龄大于24岁的并且名字包含w的,或者id等于6的
UpdateWrapper<Person> wrapper = new UpdateWrapper<>();
wrapper.gt("age", 24).like("user_name", "w")
        .or().eq("u_id", 6);
wrapper.set("age", 101).set("user_name", "whitecamellia");
​
//不需要person对象了
int update = personMapper.update(null, wrapper);
System.out.println(update);

分页插件

1.基本使用

配置

@Configuration
@MapperScan(basePackages = "com.whitecamellia.mapper")
public class MyBatisPlusConfig {
​
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor pii = new PaginationInnerInterceptor(DbType.MYSQL);
        mybatisPlusInterceptor.addInnerInterceptor(pii);
        return mybatisPlusInterceptor;
    }
}

测试

@Test
public void test1() {
    //SELECT u_id,user_name,age FROM t_person LIMIT ?,?
    Page<Person> page = new Page<>(2, 3);//第二页三条数据 
    personMapper.selectPage(page, null);
    System.out.println(page);//page对象
    System.out.println(page.getRecords());//返回指定数据的集合
    System.out.println(page.getCurrent());//获取当前页码
    System.out.println(page.getSize());//每页显示数量
    System.out.println(page.getTotal());//总条数
    System.out.println(page.hasPrevious());//是否有上一页
    System.out.println(page.hasNext());//是否有下一页
}

2.自定义条件分页

根据年龄查询用户信息,并分页

Page<Person> selectPageAsPage(@Param("page") Page<Person> page, @Param("age") Integer age);
 <select id="selectPageAsPage" resultType="person">
        select *
        from t_person
        where age > #{age}
    </select>
# 自定义别名
mybatis-plus.type-aliases-package=com.whitecamellia.entity
 
   Page<Person> page = new Page<>(1, 2);
        personMapper.selectPageAsPage(page, 24);
        System.out.println(page.getRecords());

代码生成器

依赖

<!-- 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
</dependency>
​
<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
​
<!-- mybatis-plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>
​
<!-- 代码自动生成器依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.0.5</version>
</dependency>
<!-- 代码自动生成器模板依赖-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.2</version>
</dependency>

配置yml文件

# 端口号
server:
  port: 8088
#应用名称
spring:
  application:
    name: Spring_mybatis-plus
  # 配置数据源
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql:///db04
    driver-class-name: com.mysql.cj.jdbc.Driver
# 配置日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # 配置逻辑删除
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0

搭建Mybatis-plus代码生成器(一般放在启动类同级)

CodeGenerator

快速生成

package com.whitecamellia.demo_test;
​
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
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.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;
​
import java.util.ArrayList;
import java.util.Scanner;
​
/**
 * @author Petrel
 */
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("/Users/123456/IdeaProjects/project/quickStart/src/main/java1/src");//设置代码生成路径
        gc.setFileOverride(true);//是否覆盖以前文件
        gc.setOpen(false);//是否打开生成目录
        gc.setAuthor("Petrel");//设置项目作者名称
        gc.setIdType(IdType.AUTO);//设置主键策略
        gc.setBaseResultMap(true);//生成基本ResultMap
        gc.setBaseColumnList(true);//生成基本ColumnList
        gc.setServiceName("%sService");//去掉服务默认前缀
        gc.setDateType(DateType.ONLY_DATE);//设置时间类型
        mpg.setGlobalConfig(gc);
​
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/db04");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword(123456);
        mpg.setDataSource(dsc);
​
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.whitecamellia");
        pc.setMapper("mapper");
        pc.setXml("mapper.xml");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        pc.setController("controller");
        mpg.setPackageInfo(pc);
​
        // 策略配置
        StrategyConfig sc = new StrategyConfig();
        //数据库表映射到实体的命名策略:默命名:NamingStrategy.underline_to_camel认下划线转驼峰
        sc.setNaming(NamingStrategy.underline_to_camel);
        //数据库表字段映射到实体的命名策略:默认下划线转驼峰命名:NamingStrategy.underline_to_camel
        sc.setColumnNaming(NamingStrategy.underline_to_camel);
        sc.setEntityLombokModel(true);//自动lombok
        sc.setRestControllerStyle(true);
        sc.setControllerMappingHyphenStyle(true);
​
        sc.setLogicDeleteFieldName("deleted");//设置逻辑删除
​
        //设置自动填充配置
        TableFill gmt_create = new TableFill("create_time", FieldFill.INSERT);
        TableFill gmt_modified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills=new ArrayList<>();
        tableFills.add(gmt_create);
        tableFills.add(gmt_modified);
        sc.setTableFillList(tableFills);
​
        //乐观锁
        sc.setVersionFieldName("version");
        sc.setRestControllerStyle(true);//驼峰命名
​
        //  sc.setTablePrefix("tbl_"); 设置表名前缀
        sc.setInclude(scanner("表名,多个英文逗号分割").split(","));
        mpg.setStrategy(sc);
​
        // 生成代码
        mpg.execute();
    }
}
​
​
  • 41
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis-Plus提供了一个方便的代码生成插件,可以帮助开发者快速生成符合Mybatis-Plus风格的代码。这个插件无需添加依赖,也无需配置模板引擎依赖,只需要简单勾选需要的选项,即可生成包含Controller层、service层、serviceImpl层、dao层、xml文件和实体类的代码。\[2\] 使用这个插件可以极大地简化开发过程,提高效率。它具有以下特性: - 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。 - 强大的CRUD操作:内置通用Mapper和通用Service,通过少量配置即可实现单表大部分CRUD操作,还有强大的条件构造器,满足各类使用需求。 - 支持Lambda形式调用:通过Lambda表达式,方便编写各类查询条件,无需担心字段写错。 - 支持主键自动生成:支持多种主键策略,可自由配置,解决主键问题。 - 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。 - 支持自定义全局通用操作:支持全局通用方法注入,可以在任何地方使用。 - 内置代码生成器:可以快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,还有丰富的自定义配置选项。 - 内置分页插件:基于MyBatis的物理分页,无需关心具体操作,配置好插件后,写分页等同于普通List查询。 - 支持多种数据库:支持MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer等多种数据库。 - 内置性能分析插件:可以输出SQL语句以及执行时间,方便开发测试时进行性能分析。 - 内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可以自定义拦截规则,预防误操作。\[3\] 总之,MyBatis-Plus的代码生成插件是一个非常方便的工具,可以帮助开发者快速生成符合Mybatis-Plus风格的代码,简化开发过程,提高效率。 #### 引用[.reference_title] - *1* *2* *3* [MybatisPlus 超好用的idea代码生成插件,及使用详解](https://blog.csdn.net/beibei3321/article/details/124978498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

White-Camellia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值