MyBatis Plus

目录

1.MyBatis Plus概述

1.1 简介

1.2 特点

2. 入门案例

2.1 搭建环境

3.基本操作 

3.1 常见API

3.2 查询

3.3 添加

4. Wrapper查询

4.1 Wrapper介绍

4.2 条件查询

4.3 条件更新

4.4 分页

4.4.1 内置插件

4.4.2 配置类

4.4.3 分页

5. 通用Service

5.1分析

5.2基本使用

5.3  常见方法


1.MyBatis Plus概述

1.1 简介

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

官网:MyBatis-Plus

1.2 特点

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

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

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

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

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

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

  • 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动

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

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

  • 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词

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

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

  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

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

  • 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击

2. 入门案例

2.1 搭建环境

创建项目 修改pom.xml,添加依赖

  <!--确定spring boot的版本-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
    </parent>  

<dependencies>
        <!-- web 开发 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--MySQL数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--支持lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.0</version>
        </dependency>
    </dependencies>

创建yml文件,配置数据库相关

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username:数据库用户名
    password:数据库密码
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #输出日志

3.基本操作 

3.1 常见API

BaseMapper 封装CRUD操作,泛型 T 为任意实体对象

  • 增删改

方法名描述
int insert(T entity)插入一条记录,entity 为 实体对象
int delete(Wrapper<T> wrapper)根据 entity 条件,删除记录,wrapper 可以为 null
int deleteBatchIds(Collection idList)根据ID 批量删除
int deleteById(Serializable id)根据 ID 删除
int deleteByMap(Map<String, Object> map)根据 columnMap 条件,删除记录
int update(T entity, Wrapper<T> updateWrapper)根据 whereEntity 条件,更新记录
int updateById(T entity);根据 ID 修改
  • 查询

方法名描述
T selectById(Serializable id)根据 ID 查询
T selectOne(Wrapper<T> queryWrapper)根据 entity 条件,查询一条记录
List<T> selectBatchIds(Collection idList)根据ID 批量查询
List<T> selectList(Wrapper<T> queryWrapper)根据 entity 条件,查询全部记录
List<T> selectByMap(Map<String, Object> columnMap)根据 columnMap 条件
List<Map<String, Object>> selectMaps(Wrapper<T> queryWrapper)根据 Wrapper 条件,查询全部记录
List<Object> selectObjs( Wrapper<T> queryWrapper)根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)根据 entity 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, Wrapper<T> queryWrapper)根据 Wrapper 条件,查询全部记录(并翻页)
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper)根据 Wrapper 条件,查询总记录数

3.2 查询

步骤1:配置JavaBean

@TableName 表名注解,value属性设置表名

步骤2:编写dao

步骤3:编写启动类

步骤4:编写测试类

3.3 添加

获得自动增长列信息 

4. Wrapper查询

4.1 Wrapper介绍

  • Wrapper : 条件构造抽象类,最顶端父类

    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

      • QueryWrapper : Entity 对象封装操作类,不是用lambda语法

      • UpdateWrapper : Update 条件封装,用于Entity对象更新操作

      • AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。

        • LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper

        • LambdaUpdateWrapper : Lambda 更新封装Wrapper

  • 如果想进行复杂条件查询,那么需要使用条件构造器 Wapper,涉及到如下方法

方法名描述
selectOne根据条件查询一个,结果:0或1,如果查询多个异常
selectCount查询总条数
selectList查询所有
selectMaps将一条记录封装到Map中,最后返回List<Map<Sting,Object>>
selectObjs将一条记录封装到Object中,最后返回List<Object>
update更新指定条件
delete删除指定条件
  • 拼凑条件相关关键字

查询方式说明
setSqlSelect设置 SELECT 查询字段
whereWHERE 语句,拼接 + WHERE 条件
andAND 语句,拼接 + AND 字段=值
andNewAND 语句,拼接 + AND (字段=值)
orOR 语句,拼接 + OR 字段=值
orNewOR 语句,拼接 + OR (字段=值)
eq等于=
allEq基于 map 内容等于=
ne不等于<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL
groupBy分组 GROUP BY
havingHAVING 关键词
orderBy排序 ORDER BY
orderAscASC 排序 ORDER BY
orderDescDESC 排序 ORDER BY
existsEXISTS 条件语句
notExistsNOT EXISTS 条件语句
betweenBETWEEN 条件语句
notBetweenNOT BETWEEN 条件语句
addFilter自由拼接 SQL
last拼接在最后,例如:last(“LIMIT 1”)

4.2 条件查询

基本多条件查询

    @Test
    public void testWrapper() {
        QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
        // 模糊查询
        queryWrapper.like("cname","o");
        // 批量查询
        queryWrapper.in("cid",3);
        // 等值查询
        queryWrapper.eq("cname","jack");
        // 范围
        queryWrapper.ge("create_time", "2023-12-08");
        queryWrapper.le("create_time", "2023-12-08");

        List<Customer> customerList = customerMapper.selectList(queryWrapper);
        customerList.forEach(System.out::println);
    }

条件判断

 @Test
    public void findCondition() {
        Customer customer = new Customer();
        customer.setPassword("777");
        customer.setCname("888");
        customer.setIdList(Arrays.asList(2,3,4));
        customer.setCid(3);
        //条件查询
        QueryWrapper<Customer> queryWrapper = new QueryWrapper<>();
        // 1) 等值查询
        queryWrapper.eq( customer.getPassword()!=null ,"password", customer.getPassword());
        // 2) 模糊查询
        queryWrapper.like(customer.getCname() != null , "cname",customer.getCname());
        // 3) in语句
        queryWrapper.in(customer.getIdList() != null , "cid",customer.getIdList());
        // 4) 大于等于
        queryWrapper.ge(customer.getCid() != null , "cid" , customer.getCid());


        //查询
        List<Customer> list = customerMapper.selectList(queryWrapper);
        //list.forEach(customer-> System.out.println(customer));
        list.forEach(System.out::println);

    }

4.3 条件更新

	@Test
    public void testWrapperUpdate(){
        //1 更新数据
        Customer customer = new Customer();
        customer.setVersion(1);

        //2 更新条件
        UpdateWrapper<Customer> updateWrapper = new UpdateWrapper<>();
        updateWrapper.in("cid", 1,2,3);

        //3 更新
        int update = customerMapper.update(customer, updateWrapper);
        System.out.println(update);
    }

4.4 分页

4.4.1 内置插件

  • 主体插件: MybatisPlusInterceptor,该插件内部插件集:

    • 分页插件: PaginationInnerInterceptor

    • 多租户插件: TenantLineInnerInterceptor

    • 动态表名插件: DynamicTableNameInnerInterceptor

    • 乐观锁插件: OptimisticLockerInnerInterceptor

    • sql性能规范插件: IllegalSQLInnerInterceptor

    • 防止全表更新与删除插件: BlockAttackInnerInterceptor

4.4.2 配置类

package com.czxy.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
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;

/**
 * @author 桐叔
 * @email liangtong@itcast.cn
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * 配置插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 分页插件
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return mybatisPlusInterceptor;
    }

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     * @return
     */
    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }
}

4.4.3 分页

@Test
    public void testPage(){
        // 分页数据
        int pageNum = 1;
        int pageSize = 3;
        Page<Customer> page = new Page<>(pageNum , pageSize);
        page.setSearchCount(true);

        // 查询
        customerMapper.selectPage(page, null);

        // 分页数据
        System.err.println("当前页码:" + page.getCurrent());
        System.err.println("每页显示记录数:" + page.getSize());
        System.err.println("总页数:" + page.getPages());
        System.err.println("总记录数:" + page.getTotal());
        System.err.println("是否有下一页:" + page.hasNext());
        System.err.println("是否有上一页:" + page.hasPrevious());
        // 分页数据列表
        page.getRecords().forEach(System.err::println);
    }

5. 通用Service

5.1分析

  • 通用service封装了service层常见的CURD方法

  • 通用Service分析

5.2基本使用

标准service:接口 + 实现

service接口

  import com.baomidou.mybatisplus.extension.service.IService;
  import com.czxy.domain.Customer;

  public interface CustomerService extends IService<Customer> {
  }

service实现类

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.domain.Customer;
import com.czxy.mapper.CustomerMapper;
import com.czxy.service.CustomerService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
@Transactional
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper,Customer> implements CustomerService {

}

5.3  常见方法

import com.czxy.mp.Day62MybatisPlusApplication;
import com.czxy.mp.domain.Customer;
import com.czxy.mp.service.CustomerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;


@RunWith(SpringRunner.class)
@SpringBootTest(classes = MybatisPlusApplication.class)
public class TestCustomerService {

    @Resource
    private CustomerService customerService;

    // 查询所有
    @Test
    public void testSelectList() {
        List<Customer> list = customerService.list();
        list.forEach(System.out::println);
    }

    // 添加
    @Test
    public void testInsert() {
        Customer customer = new Customer();
        customer.setCname("张三");
        customer.setPassword("9999");
        // 添加
        customerService.save(customer);
    }

    // 修改
    @Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(4);
        customer.setCname("777");
        customer.setPassword("777");

        customerService.updateById(customer);
    }

    // 保存或更新
    @Test
    public void testSaveOrUpdate() {
        Customer customer = new Customer();
        customer.setCid(4);
        customer.setCname("999");
        customer.setPassword("99");

        customerService.saveOrUpdate(customer);
    }

    // 删除
    @Test
    public void testDelete() {
        customerService.removeById(3);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值