首页 > 其他分享 >MyBatis-plus

MyBatis-plus

时间:2025-01-11 16:59:29浏览次数:3  
标签:queryWrapper List Wrapper 查询 boolean plus MyBatis page

MyBatis-Plus(上篇)


简介:

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

特性:

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

  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速入门:

===============================数据库表准备========================================
DROP TABLE IF EXISTS user;
​
CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);
​
​
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
​
===============================改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 http://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>
        <version>3.0.5</version>
    </parent>
    <groupId>com.atguigu</groupId>
    <artifactId>springboot-starter-mybatis-plus-06</artifactId>
    <version>1.0-SNAPSHOT</version>
​
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
​
​
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        
        <!-- 测试环境 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        
        <!-- mybatis-plus  -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
​
        <!-- 数据库相关配置启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
​
        <!-- druid启动器的依赖  -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-3-starter</artifactId>
            <version>1.2.18</version>
        </dependency>
​
        <!-- 驱动类-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
​
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>
​
    </dependencies>
​
​
    <!--    SpringBoot应用打包插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

================================写yml文件,配置相关信息==============================
# 连接池配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql:///day01
      username: root
      password: hh123
      driver-class-name: com.mysql.cj.jdbc.Driver
=============================编写数据库表所对应的实体类===============================
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
==========================在Mapper包下创建mapper接口================================
public interface UserMapper extends BaseMapper<User> {
​
}
​
​
//继承mybatis-plus提供的基础Mapper接口,自带crud方法,其基本语法如下:
@Mapper
public interface 你的Mapper接口 extends BaseMapper<你的实体类> {
    // 这里可以定义其他自定义的查询方法
}
==========================测试框架效果如何==========================================
@SpringBootTest //springboot下测试环境注解
public class SampleTest {
​
    @Autowired
    private UserMapper userMapper;
​
    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }
}
​

核心功能

基于Mapper接口CRUD

1.mybatis:①.mapper接口 crud方法②.mapperxml crud sql语句

2mybatis_plus:①mapper接口 继承baseMapper②crud方法 crud的sql

insert方法
// 插入一条记录
// T 就是要插入的实体对象
// 默认主键生成策略为雪花算法(后面讲解)
int insert(T entity);
类型参数名描述
Tentity实体对象
Delete方法
// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
 
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
 
// 根据 ID 删除
int deleteById(Serializable id);
 
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
类型参数名描述
Wrapper<T>wrapper实体对象封装操作类(可以为 null)
Collection<? extends Serializable>idList主键 ID 列表(不能为 null 以及 empty)
Serializableid主键 ID
Map<String, Object>columnMap表字段 map 对象
Update方法
// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity,
            @Param(Constants.WRAPPER) Wrapper<T> whereWrapper);
 
// 根据 ID 修改  主键属性必须值
int updateById(@Param(Constants.ENTITY) T entity);
类型参数名描述
Tentity实体对象(set条件值,可以为null)
Wrapper<T>updatateWrapper实体对象封装操作类(可以为null,里面的entity用于生成where语句)
select方法
// 根据 ID 查询
T selectById(Serializable id);
 
// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
 
// 根据 entity 条件,查询全部记录
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
 
// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 entity 条件,查询全部记录(并翻页)
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
 
// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
类型参数名描述
Serializableid主键 ID
Wrapper<T>queryWrapper实体对象封装操作类(可以为 null)
Collection<? extends Serializable>idList主键 ID 列表(不能为 null 以及 empty)
Map<String, Object>columnMap表字段 map 对象
IPage<T>page分页查询条件(可以为 RowBounds.DEFAULT)

MyBatis-plus也可以进行自定义方法对数据库中的表进行操作,以及自定义多表映射关系

基于Service接口CRUD

Service接口的CRUD相比较于Mapper接口的CRUD有两点区别:

  • service添加了批处理方法

  • service层的方法自动添加了事务

1.接口继承IService接口

2.类继承ServiceImpl实现类

public interface UserService extends IService<User> {
}
=================================================================================
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{
​
}
===============================CRUD方法介绍========================================
保存:
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection<T> entityList);
// 插入(批量)
boolean saveBatch(Collection<T> entityList, int batchSize);
 
修改或者保存:
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);
 
移除:
// 根据 queryWrapper 设置的条件,删除记录
boolean remove(Wrapper<T> queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);
// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);
 
更新:
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper<T> updateWrapper);
// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper<T> whereWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection<T> entityList, int batchSize);
 
数量: 
// 查询总记录数
int count();
// 根据 Wrapper 条件,查询总记录数
int count(Wrapper<T> queryWrapper);
 
查询:
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last("LIMIT 1")
T getOne(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper<T> queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper<T> queryWrapper);
// 根据 Wrapper,查询一条记录
<V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);
 
集合:
// 查询所有
List<T> list();
// 查询列表
List<T> list(Wrapper<T> queryWrapper);
// 查询(根据ID 批量查询)
Collection<T> listByIds(Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection<T> listByMap(Map<String, Object> columnMap);
// 查询所有列表
List<Map<String, Object>> listMaps();
// 查询列表
List<Map<String, Object>> listMaps(Wrapper<T> queryWrapper);
// 查询全部记录
List<Object> listObjs();
// 查询全部记录
<V> List<V> listObjs(Function<? super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List<Object> listObjs(Wrapper<T> queryWrapper);
// 根据 Wrapper 条件,查询全部记录
<V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

分页查询

简介:MyBatis-Plus 实现分页查询主要依赖于其内置的分页插件(PaginationInterceptor。本质为后置拦截器,统一后置处理添加limit关键字

导入分页插件:在启动类中(启动类也属于配置类),将mybatis-plus拦截器插件加入ioc容器,在加入mybatis-plus的@Bean的类中调用addInnerInterceptor方法,指定数据库类型,并将分页插件加入到mybatis-plus插件中。

//导入分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}

说明:

  • MybatisPlusInterceptor:这是 MyBatis-Plus 中用于配置拦截器的类。

  • PaginationInnerInterceptor:这是用于分页功能的内部拦截器。

  • DbType:这是一个枚举类,用于指定数据库类型,以便分页插件能够正确地生成分页 SQL。

@Test
public void testPageQuery(){
    //设置分页参数
    Page<User> page = new Page<>(1, 5);
    //根据分页信息查询数据
    userMapper.selectPage(page, null);
    //获取分页数据
    List<User> list = page.getRecords();
    list.forEach(System.out::println);
    System.out.println("当前页:"+page.getCurrent());
    System.out.println("每页显示的条数:"+page.getSize());
    System.out.println("总记录数:"+page.getTotal());
    System.out.println("总页数:"+page.getPages());
    System.out.println("是否有上一页:"+page.hasPrevious());
    System.out.println("是否有下一页:"+page.hasNext());
}
自定义mapper方法使用分页
=======================自定义mapper方法,可以进行分页查询=============================
//传入参数携带Ipage接口
//返回结果为IPage
IPage<User> selectPageVo(IPage<?> page, Integer id);

=========================接口sql语句实现===========================================
<select id="selectPageVo" resultType="xxx.xxx.xxx.User">
    SELECT * FROM user WHERE id > #{id}
</select>

=========================测试方法,看分页效果是否演示成功==============================
@Test
public void testQuick(){
​
    IPage page = new Page(1,2);
​
    userMapper.selectPageVo(page,2);
​
    long current = page.getCurrent();
    System.out.println("current = " + current);
    long pages = page.getPages();
    System.out.println("pages = " + pages);
    long total = page.getTotal();
    System.out.println("total = " + total);
    List records = page.getRecords();
    System.out.println("records = " + records);
​
} 

说明:

  • 方法的返回类型是 IPage<User>,表示该方法返回一个包含 User 类型数据的分页结果集。

  • IPage<?> page:第一个参数是一个泛型为 ?IPage 接口实例。这里的 ? 是一个通配符,表示 IPage 可以持有任何类型的对象,但在实际调用时,这个类型应该与 IPage 泛型实际使用的类型相匹配。在这个上下文中,由于返回类型是 IPage<User>,因此预期 page 对象实际上是一个 IPage<User> 或兼容类型的实例。

  • Integer id:第二个参数是一个 Integer 类型的 id,用于在查询中作为过滤条件。

标签:queryWrapper,List,Wrapper,查询,boolean,plus,MyBatis,page
From: https://blog.csdn.net/2402_88002981/article/details/145079304

相关文章

  • 2024.12.26(MyBatis知识点)
    <!--mybatis坐标--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><!--mysql驱动坐标--><......
  • 2024.12.24(MyBatis知识点)
    SSM=springmvc+spring+mybatis组合框架的一员,是一种持久层框架持久层主要是完成与数据库的相关操作,数据库访问对象(DataAccessObject),所以也称为DAO层框架是一个半成品的软件,需要我们遵守对应的规范去完成开发工作框架类型 框架作用 典型代表持久性框架 专注于解决数......
  • 2024.12.28(MyBatis知识点)
    基础的增\删\改\查应用使用sqlSession会话对象去调selectList|insert|update|detele查询的参数为(namespace.id),其他均为(namespace.id,param)对于修改数据库的操作均需要调用sqlSession.commit()核心配置文件概述Mybatis核心文件是有强制的层次关系(属性,常用于配置数据......
  • 2024.12.27(MyBatis知识点)
    编写实体类编写对象配置文件xxxMapper.xml1234567编写SqlMapConfig.xml核心配置文件<!--加载properties文件--><propertiesresource="jdbc.properties"></properties><settings><settingname="lazyLoadTriggerMethods"value......
  • 2025.1.10(MyBatis知识点)
    多条件查询方式一:使用#{arg0}-#{argn}或者#{param1}-#{paramn}获取接口请求参数方式二:使用注解,接口中引入@Param(“name”)注解,再在配置文件中#{name}获取参数方式三:使用pojo对象传递参数,配置文件中按照实体类的属性获取参数模糊查询select*fromuserwhe......
  • DuoPlus云手机新增云盘批量删除功能,还能自行调整云机分辨率!
    前言:在这个日新月异的时代,每一个微小的变化都可能引领行业新潮流,DuoPlus云手机基于不断创新的原则,把用户的需求放在第一位,不断对产品进行调整优化,致力于给用户最全面的产品体验。我们通过收集用户反馈,从用户角度出发优化云手机性能体验,DuoPlus本次更新了2个功能,包括:内容更新......
  • MyBatis中的 10 个宝藏技巧!
    前言说到MyBatis,很多小伙伴都会用,但未必用得“惊艳”。实际上,这个轻量级的持久层框架还有很多隐藏的“宝藏技巧”。如果你能掌握这些技巧,不但能让开发更高效,还能避免掉入一些常见的“坑”。今天就从浅入深,分享10个让人眼前一亮的MyBatis开发技巧,每一个都配上具体的场景和......
  • MyBatis 动态 SQL、多表查询与注解开发详解
    MyBatis动态SQL、多表查询与注解开发详解1.MyBatis动态SQLMyBatis提供了强大的动态SQL功能,允许我们根据不同的条件拼接SQL语句,避免了手动拼接SQL的繁琐和错误。常见的动态SQL标签包括:if:用于条件判断,根据条件是否成立来决定是否拼接SQL片段。choose(when,ot......
  • 【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
    本文内容来自YashanDB官网,原文内容请见https://www.yashandb.com/newsinfo/7863046.html?templateId=1718516现象mybatis或mybaits-plus的mapper文件sql结尾加分号";"执行时报错:”YAS-04209unexpectedword;“解决办法将sql结尾分号“;”去掉。使用注解方式写的sql语句也......
  • 【行空板K10】MQTT Plus用户库:对Mind+的MQTT功能进行增强
    目录引言Mind+MQTT功能实现的分析功能增强对Clientid的支持对保留消息的支持用户库的编写基本结构config.jsonmain.tslibraries示例程序巴法云华为云结语本文首发于DFRobot论坛:MQTTPlus用户库:对Mind+的MQTT功能进行增强DF创客社区。引言前面的博文介绍......