MyBatisPlus

162 阅读3分钟

一、什么是MyBatisPlus及和MyBatisPlus的关系

MyBatis Plus是一个开源的Java持久层框架,它是在MyBatis基础上进行扩展和增强的。

MyBatis Plus提供了更简单、更便捷的API,使得使用MyBatis更加方便和高效。它可以减少开发人员的编码量,提高开发效率。因此,可以说MyBatis Plus是MyBatis的增强版或扩展版。

二、 MyBatisPlus特性

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

三、MyBatisPlus的CRUD操作

image.png

具体代码实现功能如下:

导入所需依赖

    <!-- springboot父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
    </parent>

    <properties>
        <!-- jdk版本 -->
        <java.version>11</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.11</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
        </dependency>

        <!-- 当前WEB项目需要的依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 集成Junit依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

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

首先创建数据库(User表)

create database if not exists mybatisplus_db character set utf8;
use mybatisplus_db;
CREATE TABLE user (
            id bigint(20) primary key auto_increment,
            name varchar(32) not null,
            password  varchar(32) not null,
            age int(3) not null ,
            tel varchar(32) not null
);
insert into user values(null,'tom','123456',12,'12345678910');
insert into user values(null,'jack','123456',8,'12345678910');
insert into user values(null,'jerry','123456',15,'12345678910');
insert into user values(null,'tom','123456',9,'12345678910');
insert into user values(null,'snake','123456',28,'12345678910');
insert into user values(null,'张益达','123456',22,'12345678910');
insert into user values(null,'张大炮','123456',16,'12345678910');

yml配置文件(包含连接数据库、日志控制台输出、关闭mybatisplus启动图标)

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mpdb?serverTimezone=UTC
    username: root
    password: root
    
    # mybatis-plus日志控制台输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: off # 关闭mybatisplus启动图标
    db-config:   #全局配置
     table-prefix: tb_
     id-type: assign_id
#### 根据数据库创建的实体类(该实现类以User表为例)

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

import javax.management.relation.Role; import java.util.List;

@Data @AllArgsConstructor @NoArgsConstructor @Builder public class User { //AUTO:根据数据库主键生成策略 @TableId(type = IdType.AUTO)//数据库ID自增 该类型请确保数据库设置了 ID自增 否则无效 private Long id; @TableId private String name; @TableField(select = false) private String password; private Integer age; @TableField(value = "telephone") private String tel; @TableField(exist = false) private List roles; }

### Mapper层(主要就是要继承BaseMapper<T>接口)
    

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

@Mapper public interface UserMapper extends BaseMapper {}

### UserMapperTest测试类(增删改查都有不同的使用方法)
    
    

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.itheima.Mp.Mapper.UserMapper;

import com.itheima.Mp.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;

import java.util.Arrays; import java.util.List;

@SpringBootTest public class UserMapperTest {

@Autowired
private UserMapper userMapper;

/**
 * 增加
 */
@Test
public void insertTest() {
    //插入一条数据

// User user = User.builder() // .name("张da") // .age(12) // .password("123") // .build(); //插入多条数据 for (int i = 0; i < 20; i++) { User user = User.builder() .name("张da" + i) .age(12) .password("123") .build();

        int row = userMapper.insert(user);
        System.out.println(row);
        System.out.println(user.getId());
    }
}
/**
 * 删除
 */
@Test
public void deleteTest(){
    int row = userMapper.deleteById(12);//根据ID删除
    System.out.println(row);

     row = userMapper.deleteBatchIds(Arrays.asList(13, 14, 15));//批量删除
    System.out.println(row);

    QueryWrapper<User> wrapper = new QueryWrapper<>();//用户实体对应数据库表user Entity 对象封装操作类
    wrapper.like("name","Test"); //where name like '%Test%'
    row = userMapper.delete(wrapper);//根据entity 条件,删除记录
    System.out.println(row);
}

/**
 * 更新
 */
@Test
public void update(){
    User user = User.builder()
           // .id(8L)
           // .name("UPDATE")
            .build();
    //int row = userMapper.updateById(user);
    UpdateWrapper<User> wrapper = new UpdateWrapper<>(); //Update 条件封装
    wrapper.set("tel","123412341234"); // set tel = 123412341234
    wrapper.eq("name","UPDATE"); //where name='UPDATE'
    int row = userMapper.update(user, wrapper); //根据whereEntity 条件,更新数据
    System.out.println(row);
}
```

/**

  • 查询 */ @Test public void SelectTesst(){ User user = userMapper.selectById(1); //用户实体,对应数据库表 user 根据ID查询 System.out.println(user); List userList = userMapper.selectBatchIds(Arrays.asList(1, 5, 10)); userList.forEach(System.out::println);

    LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();//用户实体,对应数据库表 user 根据ID查询 lambdaQueryWrapper.eq(User::getName,"jack"); //where name ='tom' user= userMapper.selectOne(lambdaQueryWrapper); //根据entity条件,查询一条记录 System.out.println(user); Integer count = userMapper.selectCount(lambdaQueryWrapper); //根据 Wrapper 条件,查询总记录数 System.out.println(count); List users = userMapper.selectList(lambdaQueryWrapper);// 用户实体,对应数据库表user System.out.println(users); }

#### 分页查询需加拦截器

/**

  • 分页查询 */ @Test public void pageTest(){ IPage ipage = new Page<>(1, 3); userMapper.selectPage(ipage,null); System.out.println(ipage); }
##### MybatisPlusConfig  拦截器类
    

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;

@Configuration public class MybatisPlusConfig {

@Bean
public MybatisPlusInterceptor interceptor(){
    //mybatisplus的拦截器
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    //增加分页拦截器
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
    return interceptor;
}

}

## LambdaQueryWrapper(AND OR 写法)

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.itheima.Mp.Mapper.UserMapper; import com.itheima.Mp.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest public class DQLTest {

@Autowired
private UserMapper userMapper;

/**
 * OR
 */
@Test
public void orTest(){
    LambdaQueryWrapper<User> lamvdaQueryWrapper = new LambdaQueryWrapper<>();
    String name ="Test";
    Integer age = 20;
    lamvdaQueryWrapper
            .between(age!=null,User::getAge,10,100) //BETWEEN1 AND2
            .like(name!=null,User::getName,name) //LIKE '%值%'
            .or()
            .like(User::getPassword,"123");
    //select 全字段 from user where age beween 10 and 20 and name like '%Test%' or password like '%123%'
    List<User> userList = userMapper.selectList(lamvdaQueryWrapper);
    for (User user : userList) {
        System.out.println(user);
    }
}

/**
 * AND
 */
@Test
public void  andTest() {
    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<User>();
    lambdaQueryWrapper.ge(User::getName,10); //where age >=10
    lambdaQueryWrapper.lt(User::getTel,100); //age<100
    //链接编程
    lambdaQueryWrapper.like(User::getName,"Test") //name like '%Test%'
            .likeRight(User::getTel,"13"); //tel like '13%'

    List<User> userList = userMapper.selectList(lambdaQueryWrapper);
    for (User user : userList) { //用户实体,对应数据库表user
        System.out.println(user);
    }
}

}

### 分组&排序

       /**
     * 排序
     */
    @Test
    public void groupByAndSortTest(){
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.select(User::getPassword);
//        lambdaQueryWrapper.groupBy(User::getPassword);
//        List<User> userList = userMapper.selectList(lambdaQueryWrapper);
        //String name = null; 
        String name = "Test";
        lambdaQueryWrapper.orderBy(name!=null,true,User::getAge);
        lambdaQueryWrapper.orderByDesc(User::getAge,User::getName); //order by age asc
        List<User> userList = userMapper.selectList(lambdaQueryWrapper);
        for (User user : userList) {
            System.out.println(user);
        }

常用注解

image.png