java高级篇 Mybatis-Plus

news2024/10/6 12:19:45

目录

        一、Mybatis-Plus概述

        二、特性  

        三、快速搭建Mybatis-Plus框架

        3.1 创建数据库以及表结构和数据

        3.2 创建一个springboot工程并引入相关的依赖

        3.3 修改配置文件

        3.4  创建实体类

        3.5 创建dao接口

        3.6 为dao接口生成带来实现类

        3.7 测试

        四、使用mp完成crud操作

        4.1 添加操作

        4.2 删除操作

        4.3 修改操作

        4.4 查询操作

        4.5 分页查询

        五、零散的说明


        一、Mybatis-Plus概述

Mybatis-Plus的简介icon-default.png?t=M85Bhttps://baomidou.com/pages/24112f/                

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

        mp是对mybatis的增加 【对于单表的操作】,都可以不用自己写Sql语句了

        愿景

        我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

        二、特性  

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

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

        三、快速搭建Mybatis-Plus框架

        3.1 创建数据库以及表结构和数据

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)
);

DELETE FROM user;

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');

        3.2 创建一个springboot工程并引入相关的依赖

<dependencies>

        <!--mp依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

        3.3 修改配置文件

#数据源
spring.datasource.password=root
spring.datasource.username=wjk351066
spring.datasource.driver-classname=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai

#显示sql语句
mybatis-plus.configuration.logimpl=org.apache.ibatis.logging.stdout.StdOutImpl

        3.4  创建实体类

/**
 * Created by Intellij IDEA
 *
 * @author 王俊凯
 * @Date: 2022/11/19 11:57
 * @Version 1.0
 */
package com.wjk.entity;

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

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String email;

}

        3.5 创建dao接口

public interface UserDao extends BaseMapper<User> {

}

        3.6 为dao接口生成带来实现类

        3.7 测试

@SpringBootTest
class SpringbootMybatisplusApplicationTests {


    @Resource
    private UserDao userDao;
    /**
     * 根据id查询信息
     */
    @Test
    void testById() {
        User user = userDao.selectById(1);
        System.out.println(user);
    }

        四、使用mp完成crud操作

        4.1 添加操作

    /**
     * 添加操作
     */
    @Test
    public void testInsert(){
        User user=new User();
        user.setName("姚远");
        user.setAge(24);
        user.setEmail("850551147.@qqcom");
        userDao.insert(user);
    }

        观察: id不是地址  mp帮你生成了ip的值,并封装到实体类中   发生sql语句并为sql中的占位符赋值 

        mp存在主键的生成策略

                 AUTO(0),递增策略---按照数据库表的递增完成的。要求数据库该主键必须设置递增。
                 NONE(1),
                 INPUT(2), 人为输入主键值
                 ASSIGN_ID(3), 使用雪花算法帮你生成一个唯一的id。长整型, 默认为该策略
                 ASSIGN_UUID(4); 使用UUID帮你生成一个唯一的id, 字符串类型。

        4.2 删除操作

/**
     * 删除操作
     */
    @Test
    public void testDelete(){
        //根据主键删除
        int delete = userDao.deleteById(1593824504754245634L);
        System.out.println("删除影响的行数:"+delete);

        //根据主键批量删除
        List<Long> ids= Arrays.asList(1593817503689134083l,5l);
        int row = userDao.deleteBatchIds(ids);
        System.out.println("影响的行数:"+row);

        /**
         * 上面的操作都是根据id删除
         */
        //该方法需要一个Wrapper抽象对象 mp把所有的条件封装到该抽象类中了
        //子类有updateWrapper--->针对修改封装的子类
        //子类有queryWrapper-->针对查询封装的子类
        //子类有LambdaQueryWrapper和LambdaUpdateWrapper
        /**
         * UpdateWrapper<User> wrapper=new UpdateWrapper<>();
         * wrapper.eq("name","姚远");
         * wrapper.or();  //添加wrapper.or就是或  不添加就是且
         * wrapper.ge("age",30);
         * userDao.delete(wrapper);
         */
        /**
         * LambdaUpdateWrapper的操作  必须得用类名
         */
        LambdaUpdateWrapper<User> lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper.like(User::getName,"姚栎晗");
        userDao.delete(lambdaUpdateWrapper);
    }

        4.3 修改操作

    /**
     * 修改操作
     */
    @Test
    public void testUpdate(){
        //根据主键修改

          User user=new User();
                  user.setId(5l);
                  user.setName("卜佩园");
                  user.setAge(18);
                  user.setEmail("13213213210");
                  userDao.updateById(user);

        /**
         * 根据条件修改
         */
        User user=new User();
        user.setName("王俊凯");

        LambdaUpdateWrapper<User> lambdaUpdateWrapper=new LambdaUpdateWrapper();
        //根据年龄大于23的修改
        lambdaUpdateWrapper.ge(User::getAge,23);
        userDao.update(user,lambdaUpdateWrapper);
    }

        4.4 查询操作

    /**
     * 查询操作
     */
    @Test
    public void testFind(){
        /**
         * 查询多条记录  如果没有条件可以直接传入一个null 就是查询所有
         */
        List<User> users = userDao.selectList(null);
        System.out.println(users);

        /**
         * 条件查询
         */
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.like("name", "卜佩园");
        List<User> list = userDao.selectList(wrapper);
        System.out.println(list);

        /**
         * 根据条件查询一条记录
         */
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.like("name", "卜佩园");
        wrapper.eq("age",18);
        User user = userDao.selectOne(wrapper);
        System.out.println(user);

    }

        4.5 分页查询

   /**
     * 分页查询
     * 这里的分页需要配置分页拦截器
     */
    @Test
    public void testFindPage(){
        //需要两个参数Page接口对象  第二个条件对象
        Page<User> page=new Page<>(1,3);
        //把查询的结果封装到page类中
        Page<User> selectPage = userDao.selectPage(page, null);

        System.out.println("总条数:"+selectPage.getTotal());
        System.out.println("总页数:"+selectPage.getPages());
        System.out.println("当前页的记录:"+selectPage.getRecords());
    }

        注意:一定要添加分页拦截器

/**
 * Created by Intellij IDEA
 *
 * @author 王俊凯
 * @Date: 2022/11/19 13:34
 * @Version 1.0
 */
package com.wjk.config;

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

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

        五、零散的说明

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "user") //标记表名和实体明的对应关系
public class User {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    @TableField(value = "name")
    private String name;
    private Integer age;
    private String email;

    @TableField(exist = false) //表示该属性不在数据库
    private Integer status;



    public User(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
}

 

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

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

相关文章

Linux 基础IO

目录 一、复习C文件IO相关操作 示例代码 fopen的打开模式 C标准库默认打开的三个输入输出流 理解当前路径 二、认识文件相关系统调用接口 示例代码 open函数简介 三、文件描述符 初步认识... 文件描述符的本质&#xff1a; 三个默认打开的文件 文件描述符的分配规则…

SSH客户端工具MobaXterm

前言 SSH客户端远程连接服务器的有xshell(xmanager套件下)&#xff0c;需要收费&#xff0c;也可以通过一些和谐的方式使用。 但是有时候&#xff0c;我们需要使用光明正大的软件SSH到远程服务器&#xff0c;MobaXterm家庭版可以正常的使用。 其他产品&#xff1a; SecureCRT&…

任意代码执行漏洞复现

漏洞简介 在 PostgreSQL 数据库的 jdbc 驱动程序中发现一个安全漏洞。当攻击者控制 jdbc url 或者属性时&#xff0c;使用 PostgreSQL 数据库的系统将受到攻击。 pgjdbc 根据通过 authenticationPluginClassName、sslhostnameverifier、socketFactory 、sslfactory、sslpasswo…

021_SSSS_Diffusion Models Already Have a Semantic Latent Space

Diffusion Models Already Have a Semantic Latent Space 1. Introduction 本文指出&#xff0c;现有的Diffusion模型可以在不同的领域有出色的表现&#xff0c;但是缺少可以控制其生成过程的语义隐空间&#xff08;Semantic Latent Sapce&#xff09;。本文提出了非对称的反…

C++模拟OpenGL库——图片处理及纹理系统(三):图片缩放操作:简单插值二次线性插值

目录 简单插值 二次线性插值 简单插值 如图&#xff0c;我们想把一张小图缩放成一张大图&#xff0c;自然的想法就是按照它们的长宽比例进行缩放&#xff08;zoomX&#xff09;。 但是问题也显而易见&#xff0c;在缩放的过程中&#xff0c;小图的像素并不能一一映射到大图的…

蜂巢能源冲刺科创板上市:拟募资150亿元,上半年收入37亿元

11月18日&#xff0c;蜂巢能源科技股份有限公司&#xff08;下称“蜂巢能源”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺科创板上市&#xff0c;蜂巢能源计划募资150亿元&#xff0c;主要用于动力锂离子电池项目、研发中心建设项目等。 据…

Unity游戏Mod/插件制作教程02 - 开发环境准备

前言 虽然本教程的目标读者是有C#基础的玩家&#xff0c;但是作为流程&#xff0c;基础的开发软件部分我还是要记录一下。 安装VisualStudio VisualStudio是我们开发插件最重要的工具&#xff0c;也许你习惯其他开发.net的工具&#xff0c;但是免费的VisualStudio已经足够好用…

王道OS 1.1_1 操作系统的概念、功能和目标

王道OS 1.1_1 操作系统的概念、功能和目标 chap1 计算机系统概述 参考资料 B站王道考研操作系统概念 第9版 &#xff08;原书、译本&#xff09; 好久没有写博客总结整理和输出了&#xff0c;学习的惰性在一次次的考试周从零开始的经历中达到了巅峰&#xff0c;现在想重振旗鼓…

换工作有感

最近很长一段时间没有更新博客&#xff0c;更新关于vim相关的操作&#xff0c;主要是最近在忙于换工作的事情。其实本来我也没打算换工作的&#xff0c;主要是最近公司的一些骚操作让我觉得心里很不爽&#xff0c;所以一怒之下提出离职。 背景 先来说说这个事情的背景吧&#…

2022年 SecXOps 安全智能分析技术白皮书 附下载地址

近年来&#xff0c;互联网、大数据和人工智能 等技术都得到了飞速的发展&#xff0c;网络攻击的方法也越来越复杂&#xff0c;过去广泛、漫无目的的攻击威胁&#xff0c;在数年内迅速地转化为有目标、有组织、长期 潜伏的多阶段组合式高级可持续威胁&#xff08;Advanced Persi…

计算机网络——第五章网络层笔记(5)

网络地址翻译&#xff08;NAT&#xff09; Private IP address:不可路由的地址、也可用于广域网链路上 NAT&#xff1a;net address translate 私有IP地址和公有IP地址之间的转换。 PAT&#xff1a;port address translate 将多个私有IP地址影射到同一个公有IP地址的不同…

跑步时戴什么耳机好、分享五款最适合跑步的运动耳机排名清单

在进行户外跑步、骑行等运动&#xff0c;往往会感到枯燥乏味&#xff0c;很难坚持下去&#xff0c;就像我经常跑一圈就觉得没了动力&#xff0c;但是当我戴上耳机听音乐跑步时&#xff0c;不知不觉就结束了&#xff0c;就感觉时间过得很快。不过话有说回来&#xff0c;适合跑步…

【JVM】jvm的体系结构

JVM体系结构如下图所示&#xff1a; JVM大致可以分为五大模块&#xff1a; 类加载子系统&#xff08;Class Loader SubSystem&#xff09;运行时数据区&#xff08;Runtime Data Area&#xff09;执行引擎&#xff08;Execution Engine&#xff09;Java本地接口&#xff08;Ja…

Java native关键字 实现

需要用到gcc mingw64: 下载安装MinGW-w64详细步骤&#xff08;c/c的编译器gcc的windows版&#xff0c;win10真实可用&#xff09;_jjxcsdn的博客-CSDN博客_mingw-w64 我也是根据上面地址安装的 在d盘创建一个.java文件 编写内容 testInt方法用 native关键字修饰 静态块里需要…

Tauri 打包

1、第一次打包运行命令 npm run tauri build 2、可能会出现下面问题 我们需要在tauri.conf.json里面查找identifier这个名称 原来是com.tauri.dev 随便改下名字&#xff0c;我这里改成build了 3、修改配置后&#xff0c;继续打包又出现问题&#xff0c;如下图 我们就单独去下…

Google Earth Engine(GEE)——join连接在GEE中的应用(同一sentinel-2影像集合)含滑动窗口平滑影像过程

JOIN联接允许您根据一个或多个条件组合不同的集合。 ImageCollection 到 ImageCollection 在数据融合中很有用(从不同的数据集中找到匹配的图像) FeatureCollection 到 ImageCollection 用于数据提取(在多个位置提取图像) FeatureCollection 到 FeatureCollection 在地理处…

公式编辑器Axmath+公式识别器SimpleTex+Markdown编辑器Typora

Ⅰ.公式编辑器Axmath 下载方式&#xff1a; ①百度网盘&#xff1a;https://pan.baidu.com/share/init?surlUWHIHWJHm-mC5q5LUCyEuA 提取码&#xff1a;1r2a ②城通网盘&#xff1a;https://url86.ctfile.com/f/32005086-727935308-6024d8?p5422 访问码&#xff1a;5422 软件…

Cellular/Wifi/Bluetooth频率

Cellular NR频率 3GPP R17定义的NR FR1频段如下表&#xff1a; 图片来自于38.101国内常用FDD频段&#xff1a; n1: 2100MHz~2170MHz&#xff0c;共79MHz带宽 n3: 1805MHz~1880MHz&#xff0c;共75MHz带宽 n5: 869MHz~894MHz&#xff0c;共25MHz带宽 n8: 925MHz~960MHz&…

【Redis-03】Redis数据库的实现原理

在之前的文章我们介绍过&#xff0c;Redis服务器在启动之初&#xff0c;会初始化RedisServer的实例&#xff0c;在这个实例中存在很多重要的属性结构&#xff0c;同理本篇博客中介绍的数据库实现原理也会和其中的某些属性相关&#xff0c;我们继续看一下吧。 1.服务器和客户端…

基于改进萤火虫算法的图像分割的应用(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…