Mybatis-plus集合

news2024/9/22 1:09:29

目录

  • mybatis-plus集合
      • 1、简介
      • 2、特性
      • 3、开始使用
      • 4、QueryWrapper的使用
      • 5、补充

mybatis-plus集合

1、简介

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

mybatis-plus只是增强了mybatis的功能,只是增加了JDBC基础CURD的功能的baseMapper类,封装了一些基础的CURD的mapper接口和实现方法,减少了一些基础的代码编译

2、特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

3、开始使用

  • 创建springBoot

  • 写好实体类,引入lombok

    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Component
    public class User implements Serializable{
    	@TableId(type = IdType.AUTO)
    	private Long id;
    	private String username;
    	@TableField(exist = false)
    	private String password1;
    	private String password;
    	private Long phonenumber;
    	private String email;
    }
    

    @TableId注解识别主键和主键类型

    @TableField注解识别字段和字段类型

    @TableField(exist = false)标识不是表中元素

    主键用Long类型,mybatis-plus主键用的是雪花算法(通过时间戳来生成唯一主键)

    int类型没用这么多位数,所以别用

    @TableId(type = IdType.AUTO)注释来解释主键自增,可以不用雪花算法

  • 写好mapper接口和mapper映射实现xml文件,引入mybatis-plus

    <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
    		<dependency>
    		    <groupId>com.baomidou</groupId>
    		    <artifactId>mybatis-plus-boot-starter</artifactId>
    		    <version>3.5.3.1</version>
    		</dependency>
    
  • application启动类增加@MapperScan("com.hai.boot.mapper")注释,也可以在mapper接口类中增加@Mapper注释,让springboot来管理mapper

  • 写mapper接口类

    package com.hai.boot.mapper;
    
    import org.apache.ibatis.annotations.Options;
    import org.apache.ibatis.annotations.Select;
    import org.springframework.stereotype.Repository;
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.hai.boot.pojo.User;
    @Repository
    public interface UserMapper extends BaseMapper<User>{
    //	@Select("select * from user where username = #{username}")
    //	User getByUserName(String username);
    
    }
    

    继承 extends BaseMapper<T>,T为实体类,BaseMapper类里写好了一些基础的CURD接口,就不需要我们写mapper实体xml文件方法和mapper接口了

    public interface BaseMapper<T> extends Mapper<T> {
    
        /**
         * 插入一条记录
         *
         * @param entity 实体对象
         */
        int insert(T entity);
    
        /**
         * 根据 ID 删除
         *
         * @param id 主键ID
         */
        int deleteById(Serializable id);
    
        /**
         * 根据实体(ID)删除
         *
         * @param entity 实体对象
         * @since 3.4.4
         */
        int deleteById(T entity);
    
        /**
         * 根据 columnMap 条件,删除记录
         *
         * @param columnMap 表字段 map 对象
         */
        int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
        /**
         * 根据 entity 条件,删除记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
         */
        int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 删除(根据ID或实体 批量删除)
         *
         * @param idList 主键ID列表或实体列表(不能为 null 以及 empty)
         */
        int deleteBatchIds(@Param(Constants.COLL) Collection<?> idList);
    
        /**
         * 根据 ID 修改
         *
         * @param entity 实体对象
         */
        int updateById(@Param(Constants.ENTITY) T entity);
    
        /**
         * 根据 whereEntity 条件,更新记录
         *
         * @param entity        实体对象 (set 条件值,可以为 null)
         * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
         */
        int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
    
        /**
         * 根据 ID 查询
         *
         * @param id 主键ID
         */
        T selectById(Serializable id);
    
        /**
         * 查询(根据ID 批量查询)
         *
         * @param idList 主键ID列表(不能为 null 以及 empty)
         */
        List<T> selectBatchIds(@Param(Constants.COLL) Collection<? extends Serializable> idList);
    
        /**
         * 查询(根据 columnMap 条件)
         *
         * @param columnMap 表字段 map 对象
         */
        List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
        /**
         * 根据 entity 条件,查询一条记录
         * <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录, 注意:多条数据会报异常</p>
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) {
            List<T> list = this.selectList(queryWrapper);
            // 抄自 DefaultSqlSession#selectOne
            if (list.size() == 1) {
                return list.get(0);
            } else if (list.size() > 1) {
                throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
            } else {
                return null;
            }
        }
    
        /**
         * 根据 Wrapper 条件,判断是否存在记录
         *
         * @param queryWrapper 实体对象封装操作类
         * @return 是否存在记录
         */
        default boolean exists(Wrapper<T> queryWrapper) {
            Long count = this.selectCount(queryWrapper);
            return null != count && count > 0;
        }
    
        /**
         * 根据 Wrapper 条件,查询总记录数
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 entity 条件,查询全部记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录
         * <p>注意: 只返回第一个字段的值</p>
         *
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 entity 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
         * @param queryWrapper 实体对象封装操作类(可以为 null)
         */
        <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
        /**
         * 根据 Wrapper 条件,查询全部记录(并翻页)
         *
         * @param page         分页查询条件
         * @param queryWrapper 实体对象封装操作类
         */
        <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    }
    
  • 写service服务层的接口类,IService<T>同上mapper层,这样就可以直接在controller层上用接口就行了

    public interface UserService extends IService<User>{
    //	User getByUserName(String username);
    }
    
  • 写service服务层的实体类

    @Service
    public class UserSerrviceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    //	@Autowired
    //	private UserMapper userMapper;
    //	@Override
    //	public User getByUserName(String username) {
    //		User user = userMapper.getByUserName(username);
    //		return user;
    	}
    }
    

注意:

BaseMapper类和IService类不影响基本的mybatis功能,可以自定义mapper和以前一样

4、QueryWrapper的使用

mybatis-plus为了实现有条件性实现CURD功能,如:模糊查询功能。增加了Wrapper类来实现。

mybatis以前是通过example实体类的createCriteria()方法来添加条件,plus中就减少了example实体类的创建

实现模糊查询:直接在控制层写

QueryWrapper<Blog> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(seacrch),"tittle", seacrch);
List<Blog> list = blogService.list(queryWrapper);

5、补充

更多细节查看官网:https://baomidou.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/815313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

八股文的天花板,没到 35k 的 Java 开发都值得好好读一读

确实&#xff0c;在当下行情之下&#xff0c;还能保持“有恃无恐”的人&#xff0c;那他自身肯定得有两把刷子。 谁不想当一个“技术大牛”&#xff1f; 谁不想年纪轻轻就“年薪百万”&#xff1f; 但“梦想美好&#xff0c;现实残酷”&#xff0c;不少人实际工作中做的事&a…

C#中 使用yield return 优化大数组或集合的访问

概要 我们在开发过程中&#xff0c;经常需要在一个很大的数组或集合中搜索元素&#xff0c;以满足业务需求。 本文主要介绍通过使用yield return的方式&#xff0c;避免将大量数据全部加载进入内存&#xff0c;再进行处理。从而提高程序的性能。 设计和实现 基本业务场景&a…

如何压缩MP4视频?学会这样压缩很简单

怎么压缩MP4视频大小呢&#xff1f;如果需要将视频存储在手机或平板电脑等设备上&#xff0c;通常也需要将视频大小压缩到适当的大小&#xff0c;以节省存储空间。此时&#xff0c;可以根据设备的存储容量和需要存储的其他文件来选择视频压缩的大小。很多小伙伴不知道怎么压缩视…

24考研数据结构-第三章:栈和队列

目录 第三章 栈和队列3.1栈&#xff08;stack&#xff09;3.1.1栈的基本概念栈的基本概念知识回顾 3.1.2 栈的顺序存储上溢与下溢栈的顺序存储知识回顾 3.1.3栈的链式存储链栈的基本操作 3.2队列&#xff08;Queue&#xff09;3.2.1队列的基本概念3.2.2队列的顺序存储结构3.2.2…

Python基础教程:Socket网络编程

网络编程是指编写程序使其能够通过网络连接与其他计算机进行通信。Python 作为一种强大的脚本语言&#xff0c;也提供了丰富的库来支持网络编程&#xff0c;如 socket、asyncio、http.client 等。在这篇教程中&#xff0c;我们将介绍如何使用 socket 库实现简单的网络编程。 1…

基于react18+hooks通用全局手机端弹框组件

RcPop 基于react18.x hooks自定义msg/alert/dialog/model/toast弹框组件 基于react18 hook开发全局通用mobile弹层组件。整合了msg/alert/dialog/toast及android/ios等弹窗效果。支持**20**参数、组件式函数式两种调用方式。 引入弹窗组件 在需要使用到弹窗的页面引入组件。 …

Linux - 添加普通用户为信任用户

1.添加用户 在Linux系统中&#xff0c;可以使用以下步骤添加用户&#xff1a; 打开终端并以root用户身份登录 输入以下命令以创建新用户&#xff08;请将username替换为您想要创建的用户名&#xff09;&#xff1a; adduser username 设置该用户的密码&#xff0c;使用以下命…

MySQL报错:Row size too large。

项目场景&#xff1a; mysql添加varchar字段 问题描述 mysql表添加一个varchar类型的字段&#xff0c;执行保存时报错&#xff1a;Row size too large. The maximum row size for the used table type, not counting BLOBs, is 6553 巴拉巴拉 原因分析&#xff1a; 行数据大…

「2024」预备研究生mem- 0730 逻辑模考

逻辑题记录&#xff1a; 前真后假&#xff0c;前假后真 削弱&#xff0c;前者更强 前假后假 是支持

迅为iTOP-LS3A5000开发板+银河麒麟操作系统

硬件准备 1.M.2.ssd硬盘&#xff08;最好大于等于128G&#xff09;&#xff1b; 2.迅为LS3A5000开发板&#xff1b; 3.U盘&#xff08;需大于8g&#xff09;&#xff0c;制作启动盘使用&#xff1b; 4.hdmi显示器&#xff1b; 5.搭载linux环境的计算机。 安装步骤 1 制作…

聚焦甲烷循环,宏基因组分析项目再创新!

甲烷&#xff0c;化学式CH4&#xff0c;在自然界分布很广&#xff0c;是最简单的有机物&#xff0c;也是最简单的烃。但同时也是一种重要的温室气体&#xff0c;是一种仅次于二氧化碳的强大温室气体&#xff0c;对环境和全球变化具有重大影响&#xff0c;其导致全球变暖潜力是C…

运动带哪种耳机比较好、最好用的运动耳机排名

作为一位热爱运动的达人&#xff0c;每天固定时间出门跑步已经成为我的必修课程。关于坚持锻炼的好处&#xff0c;我想不用多说&#xff0c;懂得人自然懂。然而&#xff0c;无论多么享受独自奔跑的感觉&#xff0c;总会有一种孤单寂寞的情绪袭上心头。相信经常跑步的朋友们都深…

如何部署Redis哨兵与集群

目录 一、Redis数据库 二、Redis哨兵模式 三、部署Redis哨兵 第一步 关闭防火墙和安全机制 第二步 修改Redis配置文件 第三步 开启Master主节点 第四步 查看哨兵信息 四、如何部署Redis集群 第一步 创建不同端口节点的目录 第二步 创建脚本文件 第三步 赋权并执行脚…

vscode设置远程登录和免密登录

首先&#xff0c;我们去官网下载VScode 安装过程比较简单&#xff0c;大家自行安装即可&#xff0c;注意建议安装在除C盘外的其他盘中。 安装完成后&#xff0c;打开我们下载好的VScode&#xff0c;点击左侧的Extensions选项&#xff0c;搜索Remote&#xff0c;Install第一项R…

【设计模式——学习笔记】23种设计模式——代理模式Proxy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 基础介绍 代理模式为一个对象提供一个代理对象&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象&#xff0c;这样做的好处是&#xff1a;可以在不修改目标对象代码的基础上&#xff0c;增强额外的功能操作&#xff0c;即扩展目标对象的功能被代理的对象…

Day06-作业(MySQL)

备注&#xff1a;本次作业最终需要提交的是对应的SQL语句。 软件安装&#xff1a;安装数据库可视化工具Navicat Navicat下载&#xff0c;提取码&#xff1a;5555https://pan.baidu.com/s/1GtKdXu9Tx0G3ejgSwKVWZg 作业1&#xff1a;参照资料中提供的页面原型及需求描述&#x…

项目中使用过的线程池ThreadPoolTaskExecutor

创建线程池的实例应用 package com.youming.shuiku.datacenter.provider.utils;import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;Slf4j public class AsyncMana…

UnixBench 5.1.3 银河麒麟桌面操作系统V10 (SP1) ARM64 aarch64 图形性能测试 2d 3d, glmark2 3d测试

编译 安装libgl sudo apt install libgl-dev yeqiangyeqiang-greatwall:~/Downloads/UnixBench$ sudo apt install libgl-dev [sudo] yeqiang 的密码&#xff1a; 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列软件包…

安卓耗电量分析

这里写自定义目录标题 耗电原因分析分析类型 生成分析数据batterystats操作步骤:生成report报告 battery-historian手动编译安装容器安装内容解析 耗电原因分析 下文有阐述&#xff0c;很详细 https://www.cnblogs.com/SA226343/p/6047543.html https://www.cnblogs.com/mytec…

美颜SDK开发指南:优化直播人像表现

在当今社交媒体和直播平台的流行趋势下&#xff0c;越来越多的用户渴望在直播中展现更加自信和美丽的一面。本文将探讨美颜SDK的开发指南&#xff0c;介绍其优化直播人像表现的重要性以及关键的技术要点。 一、用户为什么离不开美颜&#xff1f; 美颜SDK作为一种集成在直播应用…