mybatisplus(代码片段)

sp_wxf sp_wxf     2023-04-05     489

关键词:

这里写目录标题

1.MyBatisPlus概述

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

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

二、MyBatisPlus特性

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

2.MyBatisPlus的开发步骤

前提:当前项目使用了mybatis作为持久层框架

步骤一:引入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

步骤二:继承BaseMapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> 
  


2.1 MyBatisPlus的CRUD操作

/**
* 新增
 * insert(T t);
 */
@Test
void save() 
    User user = new User();
    user.setName("黑马程序员");
    user.setPassword("itheima");
    user.setAge(12);
    user.setTel("4006184000");
    userDao.insert(user);


/**
 * 根据主键删除
 * deleteById(Serializable id);
 */
@Test
void deleteById() 
    userDao.deleteById(1625801212297658370L);


/**
 * 根据条件删除
 * delete(@Param("ew") Wrapper<T> queryWrapper);
 */
@Test
void deleteByCondition() 
    QueryWrapper<User> query = new QueryWrapper<>();
    query.eq("age", 12);
    userDao.delete(query);


/**
 * 根据主键修改
 * updateById(@Param("et") T entity);
 */
@Test
void updateById() 
    User user = new User();
    user.setId(2L);
    // 仅对设置的字段进行修改
    user.setName("王晓峰");
    userDao.updateById(user);


/**
 * 根据条件修改
 * update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
 */
@Test
void updateByCondition() 
    // 修改内容:将name改为Mr.Wang
    User user = new User();
    user.setName("Mr.Wang");

    // 修改条件:年龄为12岁
    UpdateWrapper<User> update = new UpdateWrapper<>();
    update.eq("age", 12);

    userDao.update(user, update);


/**
 * 查询所有
 * selectList(@Param("ew") Wrapper<T> queryWrapper);
 */
@Test
void selectList() 
    // 方式一
    List<User> users = userDao.selectList(null);
    System.out.println(users);

    // 方式二
    List<User> users_2 = userDao.selectList(new QueryWrapper<>());
    System.out.println(users_2);


/**
 * 根据条件查询
 * selectList(@Param("ew") Wrapper<T> queryWrapper);
 */
@Test
void selectListByCondition() 
    QueryWrapper<User> query = new QueryWrapper<>();
    query.eq("age", 12);
    List<User> users_2 = userDao.selectList(query);
    System.out.println(users_2);


/**
 * 根据条件分页查询
 * 前提:需要设置分页拦截器
 * selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
 */
@Test
void selectPageByCondition() 
    QueryWrapper<User> query = new QueryWrapper<>();
    query.eq("age", 12);

    Page<User> userPage = userDao.selectPage(new Page<>(1, 2), query);
    System.out.println(userPage);


2.2 MyBatisPlus的分页查询

一、设置分页拦截器(交给Spring管理)

package com.itheima.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;

@Configuration
public class MybatisPlusConfig 
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor()
        //1 创建MybatisPlusInterceptor拦截器对象
        MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
        //2 添加分页拦截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mpInterceptor;
    

二、执行分页查询

//分页查询
@Test
void testSelectPage()
    //1 创建IPage分页对象,设置分页参数
    IPage<User> page=new Page<>(1,3);
    
    //2 执行分页查询
    userDao.selectPage(page,null);
    
    //3 获取分页结果
    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());

三、开启MyBatisPlus日志

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatisplus_db?serverTimezone=UTC
    username: root
    password: root
# 开启mp的日志(输出到控制台)
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

四、解决日志打印过多问题

  • 取消初始化spring日志打印
    做法:在resources下新建一个logback.xml文件,名称固定,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>

</configuration>
  • 取消SpringBoot启动banner图标
spring:
  main:
    banner-mode: off # 关闭SpringBoot启动图标(banner)

  • 取消MybatisPlus启动banner图标
# mybatis-plus日志控制台输出
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    banner: off # 关闭mybatisplus启动图标


3.MyBatisPlus的DQL编程控制(select操作)

3.1 条件查询方式

MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

3.1.1 条件查询

一、按条件查询

//方式一:按条件查询
QueryWrapper<User> qw=new QueryWrapper<>();
qw.lt("age", 18);
List<User> userList = userDao.selectList(qw);
System.out.println(userList);

二、lambda格式按条件查询

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

三、lambda格式按条件查询(推荐)

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

3.1.2 组合条件

一、并且关系(and)

//并且关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//并且关系:10到30岁之间
lqw.lt(User::getAge, 30).gt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

二、或者关系(or)

//或者关系
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//或者关系:小于10岁或者大于30岁
lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

3.1.3 Null值处理

一、if语句控制条件追加

Integer minAge=10;  //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null;  //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
if(minAge!=null)
    lqw.gt(User::getAge, minAge);

if(maxAge!=null)
    lqw.lt(User::getAge, maxAge);

List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);

二、条件参数控制

Integer minAge=10;  //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null;  //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge);
lqw.lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);

三、条件参数控制(链式编程)

Integer minAge=10;  //将来有用户传递进来,此处简化成直接定义变量了
Integer maxAge=null;  //将来有用户传递进来,此处简化成直接定义变量了
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
//参数1:如果表达式为true,那么查询才使用该条件
lqw.gt(minAge!=null,User::getAge, minAge)
   .lt(maxAge!=null,User::getAge, maxAge);
List<User> userList = userDao.selectList(lqw);
userList.forEach(System.out::println);

3.2 查询投影-设置【查询字段、分组、分页】

3.2.1 查询结果包含模型类中部分属性

/*LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.select(User::getId, User::getName, User::getAge);*/
//或者
QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("id", "name", "age", "tel");
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);

3.2.2 查询结果包含模型类中未定义的属性

QueryWrapper<User> lqw = new QueryWrapper<User>();
lqw.select("count(*) as count, tel");
lqw.groupBy("tel");
List<Map<String, Object>> userList = userDao.selectMaps(lqw);
System.out.println(userList);

3.4 字段映射与表名映射

一、表的字段和实体类的属性名不对应
    在模型类属性上方,使用@TableField属性注解,通过value属性,设置当前属性对应的数据库表中的字段关系。

二、对象中添加了数据库中未定义的属性
    在模型类属性上方,使用@TableField注解,通过exist属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value合并使用

三、采用默认查询开放了更多的字段查看权限
    在模型类属性上方,使用@TableField注解,通过select属性:设置该属性是否参与查询。此属性与select()映射配置不冲突。

四、表名与编码开发设计不同步

@Data
@TableName("tbl_user")
public class User 
    /*
        id为Long类型,因为数据库中id为bigint类型,
        并且mybatis有自己的一套id生成方案,生成出来的id必须是Long类型
     */
    private Long id;
    private String name;
    @TableField(value = "pwd",select = false)
    private String password;
    private Integer age;
    private String tel;
    @TableField(exist = false) //表示online字段不参与CRUD操作
    private Boolean online;


4.DML编程控制(增、删、改操作)

4.1 id生成策略控制(Insert)

主键生成的策略有哪几种方式?

不同的表应用不同的id生成策略

  • 日志:自增(1,2,3,4,……)
  • 购物订单:特殊规则(FQ23948AK3843)
  • 外卖单:关联地区日期等信息(10 04 20200314 34 91)
  • 关系表:可省略id

4.1.1 id生成策略控制(@TableId注解)

4.1.2 全局策略配置

mybatis-plus:
  global-config:
    db-config:
      # 使用雪花算法生成id
      id-type: assign_id
      # 表名前置全局配置
      table-prefix: tbl_

相当于


4.2 多记录操作(批量Delete/Select)

一、按主键删除多条记录

//删除指定多条数据
List<Long> list = new ArrayList<>();
list.add(1402551342481838081L);
list.add(1402553134049501186L);
list.add(1402553619611430913L)查看详情  

spring-boot-mybatisplus(代码片段)

文章目录Springboot整合MybatisPlus上一节springbootJPA源码MybatisPlusspringboot整合MybatisPlussql打印mybatisPlus通用mapperMybatisPlus通用ServiceMybatisPlus分页MybatisPlus条件查询QueryWrapperUpdateWrapperLambdaQueryWrapperLambda 查看详情

springboot整合mybatisplus(代码片段)

...工具:IDEA基础环境:Maven+JDK8所用技术:SpringBoot、lombok、MybatisPlusSpringBoot版本:2.1.41.3涉及知识点MybatisPlus简介、特性、架构MybatisPlus快速入门MybatisPlus的基本CRUDMybatisPlus的高级查询:like 查看详情

mybatisplus代码生成器原理分析(代码片段)

MyBatisPlus前面我们讲解了🍎基于MyBatisPlus完成标准Dao的增删改查功能🍌掌握MyBatisPlus中的分页及条件查询构建|黑马程序员🍬MyBatisPlus:DQL编程控制(条件查询方式、查询投影、查询条件设定、字段映射与表名... 查看详情

狂神说mybatisplus(代码片段)

狂神说MyBatisPlus1.mybatisplus概述需要的基础mybatisspringspringmvc为什么学习?mybatisplus可以节省大量的时间,所有的CRUD代码都可以自动化完成!JPAtk-mappermybatisplus1.1简介为简化开发而生,简化mybatis官网:mybatis-plus特性无侵入:只做增... 查看详情

mybatisplus新版本springboot集成mybatisplus主键生成策略(代码片段)

设置在pojo类的id上添加注解@TableId(type=IdType.x)源码TableId.classpackagecom.baomidou.mybatisplus.annotation;importjava.lang.annotation.Documented;importjava.lang.annotation.ElementType;importjava.lang.an 查看详情

mabatisplus自动生成代码(代码片段)

...om.ybzn;/***代码生成器**@authorHugo*@time2020/4/6*/importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.annotation.FieldFill;importcom.baomidou.mybatisplus.annotation.IdType;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.core.toolk... 查看详情

mybatisplus(代码片段)

...据BaseMapper接口简介BaseMapper接口的全限定名称为com.baomidou.mybatisplus.core.mapper.BaseMapper<T>,该接口提供了插入、修改、删除和查 查看详情

mybatisplus删除逻辑(代码片段)

/***批量/单个删除数据**@paramid主键结合*@return删除结果*/@ApiOperation("删除企业部门")@DeleteMappingpublicRdelete(@RequestParam("id")Serializableid)//判断intcount=companyRosterService 查看详情

mybatisplus(代码片段)

文章目录ServiceCRUDService保存数据(save)Service保存或更新(saveOrUpdate)Service移除数据(remove)Service更新数据(update)ServiceCRUDMyBatisPlus提供了通用的Mapper接口(即Bas 查看详情

mybatisplus(代码片段)

文章目录ServiceCRUDService保存数据(save)Service保存或更新(saveOrUpdate)Service移除数据(remove)Service更新数据(update)ServiceCRUDMyBatisPlus提供了通用的Mapper接口(即Bas 查看详情

spring-boot-mybatisplus(代码片段)

文章目录Springboot整合MybatisPlus上一节springbootJPA源码MybatisPlusspringboot整合MybatisPlussql打印mybatisPlus通用mapperMybatisPlus通用ServiceMybatisPlus分页MybatisPlus条件查询QueryWrapperUpdateWrapperLambdaQueryWrapperLambdaUpdateWrapperMybatisPlusAR主键生成策略逻辑... 查看详情

mybatisplus批量处理数据(代码片段)

@ApiOperation("修改员工报名")@PutMappingpublicRupdate(@RequestParam("ids")Stringids,@RequestParam("staus")Integerstaus)if(StringUtils.isBlank(ids))returnR.failed(&# 查看详情

用mybatisplus来整crud(代码片段)

MyBatisPlus1、MyBatisPlus的特点2、CRUD操作2.1、搭建环境2.2、创建数据库和表2.3、查询所有2.4、添加2.5、更新2.6、删除2.7、多条件查询2.7.1、Map条件2.7.2、QueryWrapper2.8、分页2.8.1、内置插件2.8.2配置类2.8.3分页1、MyBatisPlus的特点这个特点... 查看详情

用mybatisplus来整crud(代码片段)

MyBatisPlus1、MyBatisPlus的特点2、CRUD操作2.1、搭建环境2.2、创建数据库和表2.3、查询所有2.4、添加2.5、更新2.6、删除2.7、多条件查询2.7.1、Map条件2.7.2、QueryWrapper2.8、分页2.8.1、内置插件2.8.2配置类2.8.3分页1、MyBatisPlus的特点这个特点... 查看详情

mybatisplus条件拼接(代码片段)

mybatisplus条件拼接条件构造器案例tableAbstractWrapperallEq:全部eq(或个别isNull)eq:等于=ne:不等于<>gt:大于>ge:大于等于>=lt:小于<le:小于等于<=between:BETWEEN值1AND值2notBetween:NOTBETWEEN值1AND值2like:LIKE‘%值%‘notLike:NOT 查看详情

mybatisplus学习笔记(代码片段)

文章目录MyBatisPlus学习笔记简介特性框架结构快速使用引入mybatis-plus相关maven依赖引入mybatis-plus在springboot中的场景启动器项目中其他需要导入依赖创建表SQL语句项目结构一览项目配置配置MapperScan注解application.properties配置创建Entit... 查看详情

mybatisplus学习总结(下)(代码片段)

MybatisPlus学习总结(下)一、条件构造器1.1allEq1.2基本比较操作1.3模糊查询1.4排序1.5逻辑查询1.6select二、ActiveRecord三、插件3.1mybatis的插件机制3.2常用插件配置四、MybatisPlus扩展4.1Sql注入器4.2自动填充功能4.3逻辑删除4.4通用... 查看详情