Spring Boot整合MyBatis-Plus的详细讲解

news2024/11/8 6:47:57

MyBatis Plus(简称MP)是一个在MyBatis基础上进行增强的工具,它保留了MyBatis的所有特性,并通过提供额外的功能和简化操作来提高开发效率。以下是对MyBatis Plus的详细介绍:

一、基本概述

  • 定义:MyBatis Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,旨在简化开发、提高效率。
  • 官网:https://mybatis.plus/ 或 Redirect

二、主要特性

  1. 简化CRUD操作
    • MyBatis Plus提供了通用的Mapper接口和Service接口,简化了常见的CRUD(增删改查)操作。
    • 无需编写XML文件和手动编写SQL语句,只需继承通用Mapper接口或Service接口,即可使用常见的CRUD方法。
  2. 代码自动生成
    • MyBatis Plus内置了代码生成器,可以根据数据库表自动生成实体类、Mapper接口和XML文件,大大减少了手动编写代码的工作量。
  3. 分页查询
    • 提供了分页插件,可以在查询数据时直接指定分页参数,方便进行分页查询。
  4. 条件构造器
    • 提供了条件构造器,可以通过链式调用的方式生成查询条件,使得查询条件更加清晰易读。
  5. 乐观锁支持
    • 提供了乐观锁的支持,可以在更新数据时进行版本校验,避免数据冲突问题。
  6. 自动填充
    • 提供了自动填充功能,可以在插入或更新数据时自动填充某些字段,如创建时间和更新时间等。
  7. 多租户支持
    • 提供了多租户的支持,可以在查询数据时自动根据租户ID添加过滤条件,实现多租户数据隔离。
  8. 其他特性
    • 支持Lambda形式调用,通过Lambda表达式方便地编写各类查询条件。
    • 支持主键自动生成,提供了多达4种主键策略(内含分布式唯一ID生成器)。
    • 支持ActiveRecord模式,实体类只需继承Model类即可进行强大的CRUD操作。
    • 提供了性能分析插件,可输出SQL语句及其执行时间,帮助开发者优化查询。

三、架构与原理

  • 核心组件:MyBatis Plus的核心组件包括mybatis-plus-boot-starter(Spring Boot场景启动器)、注解(用于更高效地完成持久层开发)、extension(提供分页、逻辑删除、自动填充等扩展功能)、generator(代码生成器)以及core(核心功能)。
  • 运行原理:MyBatis Plus通过自动扫描实体,将数据库表中的列名和表名通过反射机制自动生成对应的代码,包括持久层的CRUD操作。

四、与MyBatis的区别

  • 语法简化:MyBatis Plus通过使用注解和API简化了MyBatis的配置和操作,减少了开发者的编码量。
  • 自动代码生成:MyBatis Plus提供了代码生成器,而MyBatis需要手动编写所有代码。
  • 分页插件:MyBatis Plus内置了分页插件,而MyBatis需要手动实现分页逻辑。
  • 条件查询:MyBatis Plus提供了强大的条件查询功能,而MyBatis则需要编写复杂的SQL语句来实现。

五、核心注解

1. @TableName

用途:用于指定实体类对应的数据库表名。

作用:告诉MyBatis Plus在进行SQL操作时应该使用哪个表。

详细说明:当实体类名与数据库表名不一致时,可以使用@TableName注解来指定实体类对应的数据库表名。这样,MyBatis Plus在执行SQL操作时就会使用指定的表名。

例如

package com.cjq.orders.domain;

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

import java.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString

@TableName("t_orders")
public class Orders {
    /**
     * 主键ID
      */
    @TableId(type = IdType.AUTO)
    private Integer ordersId;
    /**
     * 订单名字
      */
    private String ordersName;
    /**
     * 订单数量
      */
    private Integer ordersNum;
    /**
     * 订单价格
      */
    private BigDecimal ordersPrice;
    /**
     * 订单状态 1已支付 2未支付
      */
    private Integer ordersStatus;

}

在这个示例中,Orders类将映射到数据库中的t_orders表。

2. @TableId

用途:用于标识主键字段,并指定主键生成策略。

详细说明:@TableId注解不仅可以指定实体类中的哪个字段是主键,还可以指定主键的生成策略。MyBatis Plus提供了多种主键生成策略,如自增(IdType.AUTO)、手动输入(IdType.INPUT)、分布式全局唯一ID(IdType.ASSIGN_ID)等。

常用属性

  • value:指定主键字段名(默认值就是属性名)。
  • type:指定主键生成策略,如IdType.AUTO(自动增长)、IdType.INPUT(手动输入)、IdType.ASSIGN_ID(分配ID,默认使用雪花算法)等。

在这个示例中,id字段被标识为主键,并且采用自动增长的方式生成主键值。

3. @TableField

用途:用于标识实体类中的字段与数据库表中的字段的映射关系。

详细说明:@TableField注解可以指定字段名、是否为数据库字段、自定义字段填充策略等。当实体类中的字段名与数据库表中的字段名不一致时,可以使用@TableField注解的value属性来指定数据库表中的字段名。此外,@TableField还可以用于指定字段的填充策略,如插入时填充、更新时填充等。

常用属性

  • value:指定数据库表中的字段名(默认值就是属性名)。
  • exist:用于指明该字段是否是数据库表中的字段,默认为true
  • fill:用于指定字段填充策略,如FieldFill.INSERT(插入时填充)、FieldFill.UPDATE(更新时填充)等。
    @TableField(value = "user_name", exist = true, fill = FieldFill.INSERT)  
    private String userName;

    在这个示例中,userName字段映射到数据库表中的user_name字段,且在插入数据时由自定义的填充策略进行填充。

六、控制层(Controller)

package com.cjq.orders.controller;

import com.cjq.orders.domain.Orders;
import com.cjq.orders.service.OrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class OrdersController {
    @Autowired
    private OrdersService ordersService;

    @GetMapping("/ordersList")
    public List<Orders> ordersList(){
        List<Orders> ordersList = ordersService.list();
        return ordersList;
    }
}

七、业务层(Service)

1. IService<T>和ServiceIMpl<M extends BaseMapper<T>,T> 是对BaseMapper的进一步封装,一般很少用,但是很方便。

package com.cjq.orders.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.cjq.orders.domain.Orders;

public interface OrdersService extends IService<Orders> {
    
}
package com.cjq.orders.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cjq.orders.domain.Orders;
import com.cjq.orders.mapper.OrdersMapper;
import com.cjq.orders.service.OrdersService;

import org.springframework.stereotype.Service;

@Service
public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements OrdersService {

}

八、持久层(Mapper)

1. BaseMapper<T>是mybatis-plus设计的一个接口,里面包含了单表的CRUD,用起来非常方便。

<T>表示实体类

package com.cjq.orders.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cjq.orders.domain.Orders;
import org.springframework.stereotype.Repository;

@Repository
public interface OrdersMapper extends BaseMapper<Orders> {

}

九、启动类

package com.cjq.orders;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
@MapperScan(basePackages = "com.cjq.orders.mapper")
public class OrdersApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrdersApplication.class,args);
    }
}

十、application.yml配置文件

注意:直接顶头粘贴

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  #日志
    map-underscore-to-camel-case: true  #开启驼峰命名

十一、结果详情

十二、单表CRUD

package com.cjq.orders.controller;

import com.cjq.orders.domain.Orders;
import com.cjq.orders.service.OrdersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class OrdersController {
    @Autowired
    private OrdersService ordersService;

    /**
     * 根据ID查询
     * @param ordersId
     * @return
     */
    @GetMapping("/findById")
    public Orders findById(Integer ordersId){
        Orders orders = ordersService.getById(ordersId);
        return orders;
    }

    /**
     * 列表
     * @return
     */
    @GetMapping("/ordersList")
    public List<Orders> ordersList(){
        List<Orders> ordersList = ordersService.list();
        return ordersList;
    }

    /**
     * 添加
     * @param orders
     */
    @PostMapping("/insert")
    public void insert(@RequestBody Orders orders){
        ordersService.save(orders);
    }

    /**
     * 修改
     * @param orders
     */
    @PutMapping("/update")
    public void update(@RequestBody Orders orders){
        ordersService.updateById(orders);
    }

    /**
     * 删除
     * @param ordersId
     */
    @DeleteMapping("/delete/{ordersId}")
    public void delete(@PathVariable Integer ordersId){
        ordersService.removeById(ordersId);
    }
}

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

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

相关文章

【MATLAB学习笔记】绘图——设置次刻度线的数量、设置刻度线的宽度(粗细)和长度

目录 前言设置次刻度线数量函数示例基本绘图设置次刻度线数量函数的使用 设置刻度线的长度设置刻度线和轴线的宽度总代码总结 前言 在MATLAB中&#xff0c;将XMinorTicktrue或者YMinorTicktrue设置为true可以很方便地设置X轴或者Y轴次刻度线&#xff0c;但是次刻度线的数量是MA…

代码随想录DAY25 - 回溯算法 - 08/24

目录 非递减子序列 题干 思路和代码 递归法 递归优化 全排列 题干 思路和代码 递归法 全排列Ⅱ 题干 思路和代码 方法一&#xff1a;用集合 set 去重 方法二&#xff1a;先排序&#xff0c;再用数组去重 非递减子序列 题干 题目&#xff1a;给你一个整数数组 nu…

python动画:manim中的目标位置移动,线条末端和两条线相切的位置处理

一&#xff0c;Manim中目标的位置移动 在 Manim 中&#xff0c;shift 函数用于在三维空间或二维平面上对对象进行平移。通过 shift 方法&#xff0c;用户可以快速移动场景中的物体&#xff0c;指定移动的方向和距离。方向通常由预定义的常量&#xff08;如 UP, DOWN, LEFT, RI…

opencv-python图像增强十五:高级滤镜实现

文章目录 前言二、鲜食滤镜三、巧克力滤镜三&#xff0c;冷艳滤镜&#xff1a; 前言 在之前两个滤镜文章中介绍了六种简单的滤镜实现&#xff0c;它们大多都是由一个单独函数实现的接下来介绍五种结合了之前图像增强文章提的的算法的复合滤镜。本案例中的算法来自于文章一&…

【数学建模】TOPSIS法(优劣解距离法)

TOPSIS法&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff0c;优劣解距离法&#xff09;是一种多准则决策分析方法&#xff0c;它基于这样一个概念&#xff1a;最理想的方案应该是距离理想解最近而距离负理想解最远的方案。以下是使用TOPS…

【React原理 - 任务调度和时间分片详解】

概述 在React15的时候&#xff0c;React使用的是从根节点往下递归的方式同步创建虚拟Dom&#xff0c;由于递归具有同步不可中断的特性&#xff0c;所以当执行长任务时(通常以60帧为标准&#xff0c;即16.6ms)就会长时间占用主线程长时间无响应&#xff0c;导致页面卡顿&#x…

如何使用Gitee管理自己的项目

如何使用Gitee管理自己的项目 前言 本地创建的工程项目不利于管理&#xff0c;电脑设备丢失损坏&#xff0c;代码就找不回来了。 并且多人同时使用一个项目工程也不方便。 国内的代码托管平台&#xff0c;Gitee为我实现了远程代码管理。 并且该平台可以设置为开源和私有两种…

公司邮箱如何建立

而建立一套完善的公司邮箱系统&#xff0c;则是实现这一目标的重要一环。本文将深入探讨公司邮箱的建立过程&#xff0c;以及其在业务中的重要性。 1. 确定邮箱域名 公司邮箱的建立首先要确定一个专属的邮箱域名。域名是公司在网络上的身份标识&#xff0c;例如&#xff0c;公…

程序猿成长之路之数据挖掘篇——Kmeans聚类算法

Kmeans 是一种可以将一个数据集按照距离&#xff08;相似度&#xff09;划分成不同类别的算法&#xff0c;它无需借助外部标记&#xff0c;因此也是一种无监督学习算法。 什么是聚类 用官方的话说聚类就是将物理或抽象对象的集合分成由类似的对象组成的多个类的过程。用自己的…

VSCode插件 live Server

普通打开 安装live Server 包含端口 说明内置了服务器

改造小蚁摄像头支持免费无限容量云储存(Samba挂载篇)

为什么要改造&#xff1f; 插卡摄像头最大的一个问题就是频繁的读写会导致内存卡寿命急速下降&#xff0c;哪怕是市面上支持NAS转存的摄像头也是先录制到SD卡里&#xff0c;然后把SD卡上的视频再转存到NAS。同样对内存卡和NAS硬盘寿命都是损耗巨大。而这类监控视频绝大多数情况…

重磅!小米将对外公开超 1000 万行的 Xiaomi Vela 开源代码

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 如果说接下来的澎湃OS系统会带来很强的吸引力&#xff0c;那么第二个惊喜也是随之而来&#xff0c;那就是小米Vela开源大动作。 早在2017年起&#xff0c;小米就活跃于 NuttX 社区&#xff0c…

Reinforcement-Learning 2.State Value and Bellman Equation

目录 0.Outline 1.Motivating examples Motivating example 1: Why return is important? Motivating example 2: How to calculate return? 2.State value 3.Bellman equation: Derivation Deriving the Bellman equation An illustrative example Exercise 4.Be…

FreeSWITCH 1.10.10 简单图形化界面28 - 麒麟V10 SP3服务器系统X86和ARM版本安装FreeSWITCH

FreeSWITCH 1.10.10 简单图形化界面28 - 麒麟V10 SP3 服务器系统X86和ARM版本安装FreeSWITCH 界面预览00、先看使用手册01、 麒麟服务器v10 sp3 x86版本1、安装操作系统2、下载安装脚本3、安装 02、麒麟服务器v10 sp3 arm版本1、安装操作系统2、下载安装脚本3、安装 03、登录网…

搭建一个私有的知识库mm-wiki

文章目录 前言一、mm-wiki二、安装步骤下载安装 总结 前言 一般公司内部想要记录一些东西,都需要一个共享文档,当然可以选择类似比较简单易用的,有道云笔记,腾讯文档,语雀等,但是肯定有些公司是保密的,所以不希望这些数据被泄露,当然选择本地存储是最安全的~ 一、mm-wiki 对于…

vue3+vite配置环境变量实现开发、测试、生产的区分

文章目录 一、为什么需要区分 (dev)、测试 (test) 和生产 (prod) 环境二、vue3的项目如何通过配置方式区分不同的环境1、创建不同环境的.env文件2、在不同的.env文件中配置相应的环境变量1&#xff09;.env.develoment2&#xff09;.env.test3&#xff09;.env.production 3、在…

查找2

树表的查找 1&#xff09;二叉排序树 I)二叉排序树的插入 II)二叉排序树的生成 III)二叉排序树的删除 2&#xff09;平衡二叉树 I&#xff09;平衡二叉树调整 、

MMOE+ESSM

MMOE 动机 多个任务之间的相关性并不是很强&#xff0c;这个时候如果再用过去那种共享底座embedding的结构&#xff0c;往往会导致『跷跷板』现象。 当前学术界已经有很多工作意识到1中描述的问题并且尝试去解决&#xff0c;但大多数工作的套路都是『大力出奇迹』的路子&…

zigbee笔记、十五、组播通信原理

一、zigbee四种通讯 1、单播&#xff08;略&#xff09; 2、广播&#xff08;略&#xff09; 3、组播&#xff1a;在zigbee网络中&#xff0c;模块可以用分组来标记&#xff0c;发送的模块如果发送的组号和网络里面标记接收模块的组号相对应&#xff0c;那么这些模块就可以拿到…

深度剖析渗透测试:流程、规范与实战全指南

一、引言 在当今数字化时代&#xff0c;网络安全问题日益凸显。渗透测试作为一种主动的安全评估方法&#xff0c;能够帮助企业和组织发现潜在的安全漏洞&#xff0c;提高系统的安全性。本文将详细介绍渗透测试的实施流程、规范、不同类型的测试方法以及相关的 checklist 和报告…