【MyBatis-Plus】一、快速入门

这里写自定义目录标题

  • MyBatis-Plus 概述
  • 快速入门
    • 入门案例
    • 常用注解
    • 常见配置

MyBatis-Plus 概述

MyBatis-Plus 简介

MyBatis-Plus 是在 MyBatis 基础上开发的一个 增强工具包,它简化了 MyBatis 的开发,减少了大量重复代码。它保持了 MyBatis 原有的特性(如灵活的 SQL),同时提供了很多开箱即用的功能。

官网定位是:
👉 只做增强,不做改变

MyBatis-Plus 的优势:

  1. 无侵入:只需少量配置,几乎不改变原有项目结构。
  2. CRUD 自动化:内置了大量单表操作方法,几乎不用写 Mapper XML。
  3. 条件构造器:通过链式调用快速构造 SQL 条件。
  4. 分页插件:提供强大的分页功能。
  5. 代码生成器:自动生成 Entity、Mapper、Service、Controller 等代码。
  6. 多种内置功能:逻辑删除、自动填充、乐观锁、防全表更新与删除等。

核心功能:

  1. 通用 CRUD

    只要继承 BaseMapper<T>,就能使用大量内置方法:

    // 插入
    int insert(T entity);
    // 根据 ID 删除
    int deleteById(Serializable id);
    // 更新
    int updateById(T entity);
    // 查询
    T selectById(Serializable id);
    List<T> selectList(Wrapper<T> queryWrapper);
    

    例如:

    @Autowired
    private UserMapper userMapper;@Test
    public void testInsert() {User user = new User();user.setName("Tom");user.setAge(20);userMapper.insert(user); // 自动生成 SQL
    }
    
  2. 条件构造器

    MyBatis-Plus 提供了 QueryWrapperLambdaQueryWrapper 等,简化条件拼接。

    // 传统写法
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("age", 20).like("name", "Tom");
    List<User> list = userMapper.selectList(wrapper);// Lambda 写法(更安全,避免硬编码字段名)
    LambdaQueryWrapper<User> lambda = new LambdaQueryWrapper<>();
    lambda.eq(User::getAge, 20).like(User::getName, "Tom");
    List<User> list2 = userMapper.selectList(lambda);
    
  3. 分页插件

    MyBatis-Plus 内置分页插件,只需简单配置:

    IPage<User> page = new Page<>(1, 10); // 第1页,每页10条
    IPage<User> result = userMapper.selectPage(page, null);
    
  4. 代码生成器

    自动生成 实体类、Mapper、Service、Controller,极大提高开发效率。

  5. 常用扩展

    • 逻辑删除:配置逻辑删除字段,删除操作会变成 UPDATE

    • 自动填充:创建时间、更新时间自动填充。

    • 乐观锁:防止并发修改数据冲突。

    • 防全表更新删除:避免误操作导致数据丢失。


典型使用场景

  • 快速开发业务系统(如管理后台、信息系统),减少重复写 SQL。
  • 单表操作频繁的场景(批量增删改查)。
  • 结合 Spring Boot 使用,可以做到极简配置。

和 MyBatis 的区别

特性MyBatisMyBatis-Plus
SQL需要手写提供大量内置方法,少写 SQL
插件需要额外集成内置分页、逻辑删除、乐观锁
代码生成提供代码生成器
学习成本灵活但需要大量 SQL兼容 MyBatis,学习成本低

快速入门

入门案例

首先引入 MyBatis-Plus 依赖:

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

数据库表结构:

CREATE TABLE `emp` (`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`username` varchar(20) NOT NULL COMMENT '用户名',`password` varchar(32) DEFAULT '123456' COMMENT '密码',`name` varchar(10) NOT NULL COMMENT '姓名',`gender` tinyint unsigned NOT NULL COMMENT '性别, 说明: 1 男, 2 女',`job` tinyint unsigned DEFAULT NULL COMMENT '职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师',`entrydate` date DEFAULT NULL COMMENT '入职时间',`dept_id` int unsigned DEFAULT NULL COMMENT '部门ID',`create_time` datetime NOT NULL COMMENT '创建时间',`update_time` datetime NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1983983618 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工表'

实体类 Emp:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDate;
import java.time.LocalDateTime;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {private Integer id;private String username;private String password;private String name;private Short gender;private Short job;private LocalDate entrydate;private Integer deptId;private LocalDateTime createTime;private LocalDateTime updateTime;
}

EmpController:

import com.scarletkite.demo2.pojo.Emp;
import com.scarletkite.demo2.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class EmpController {@Autowiredprivate EmpService empService;@PostMapping("/emp")public void addEmp(@RequestBody Emp emp) {empService.addEmp(emp);}
}

EmpService 接口和 EmpServiceImpl 实现类:

// EmpService 接口
import com.scarletkite.demo2.pojo.Emp;public interface EmpService {void addEmp(Emp emp);
}// EmpServiceImpl 实现类
import com.scarletkite.demo2.mapper.EmpMapper;
import com.scarletkite.demo2.pojo.Emp;
import com.scarletkite.demo2.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.time.LocalDateTime;@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic void addEmp(Emp emp) {emp.setEntrydate(LocalDate.now());emp.setUpdateTime(LocalDateTime.now());emp.setCreateTime(LocalDateTime.now());empMapper.insert(emp);}
}

EmpMapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.scarletkite.demo2.pojo.Emp;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface EmpMapper extends BaseMapper<Emp> {}

让自己的 mapper 接口继承 MyBatis-Plus 提供的 BaseMapper,并指定泛型为对应实体类类型,BaseMapper 中已定义大量增删改查方法。

这样就能实现增删改查的操作,并且原来的 MyBatis 方法仍然生效。

常用注解

MyBatis-Plus 获取数据库信息的原理:MyBatis-Plus 通过扫描实体类,基于反射获取实体类信息作为数据库表信息,遵循 “约定大于配置” 原则。

MyBatis-Plus 的约定规则:

  • 类名驼峰转下划线作为表名;
  • 名为 id 的字段作为主键;
  • 变量名驼峰转下划线作为表的字段名。

MyBatis-Plus 常用注解包括:

  • @TableName(指定表名称)
  • @TableId(指定表的主键)
  • @TableField(标记表的普通字段信息)

@TableName 注解的使用:当实体类名与表名不一致时,需用 @TableName 的 value 属性指定真实表名,例如实体类为 Emp,表名为 tb_emp 时,需添加 @TableName (“tb_emp”)

@TableName ("tb_emp")
public class Emp {// ...
}

@TableId 注解的使用及主键策略:当主键名与 id 不一致或主键不叫 id 时,需用 @TableId 的 value 属性指定主键字段名;主键策略 IdType 有 AUTO(数据库自增长)、INPUT(程序员自己输入)、ASSIGN_ID(MyBatis-Plus 基于雪花算法生成,为 long 型整数,长度 20 位),通过 type 属性设置(若没有设置,默认 ASSIGN_ID)

@TableName ("tb_emp")
public class Emp {@TableId(value="id",type=IdType.AUTO)private Integer EmpId;
}

@TableField 注解的使用场景:成员变量名与数据库字段名不一致时,用 value 属性声明真实字段名

@TableName ("tb_emp")
public class Emp {@TableId(value="id",type=IdType.AUTO)private Integer EmpId;@TableField("username")private String name;
}

@TableField 的特殊场景:

  • 以 is 开头的布尔类型字段,需指定真实字段名;
  • 变量名与数据库关键字冲突时,需加转义字符;
  • 成员变量不是数据库字段时,用 exist=false 标记。

常见配置

MyBatis-Plus 支持多种配置,包括继承自 MyBatis 的原生配置和自身特有的配置:

mybatis-plus:type-aliases-package: com.itheima.mp.domain.pojo # 别名扫描包mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址, 默认值configuration:map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射cache-enabled: false # 是否开启二级缓存global-config: # 全局配置db-config:id-type: assign_id # id为雪花算法生成update-strategy: not_null # 更新策略: 只更新非空字段
  • 类型别名扫描包配置(typeAliasesPackage):需指定 pojo 实体类的包,作用是在定义 mapper XML 语句时,定义实体类类型可直接用类的简化名,无需全路径名
  • mapper XML 文件地址配置(mapperLocation):用于指定 mapper XML 文件的地址,使其中的 SQL 语句生效。MyBatis-Plus 擅长单表增删改查,复杂或多表查询仍需手写 SQL,因此需指定该地址
  • 下划线转驼峰映射配置(mapUnderscoreToCamelCase):开启后可实现成员变量驼峰形式与数据库下划线形式的自动转换,通常需开启
  • 二级缓存配置(cacheEnabled):用于设置是否开启二级缓存,一般不开启,默认值为 false。
  • MyBatis 原生配置与 MyBatis-Plus 的关系:上述配置是 MyBatis 的原生配置,MyBatis-Plus 继承了这些配置,使用时配置前缀改为 mybatis-plus,降低学习成本。
  • MP 特有的全局配置(globalConfig):包括数据库配置(dbConfig)等,其中 id type 用于设置 id 的类型,如雪花算法(ASSIGN_ID),全局配置优先级低于注解配置。
  • 更新策略配置(updateStrategy):默认值为 not null,即只更新非空字段,较为智能。

注意:全局配置的优先级没有注解优先级高

配置的默认值与查询方式:大部分配置有默认值,除类型别名扫描包需自行指定外,其他配置除非有自定义需求,否则无需修改。可通过查阅官网或利用 IDEA 自动提示来了解和配置。

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

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

相关文章

PostgreSQL导入mimic4

一、PostgreSQL连接验证 正确连接命令 使用psql工具连接目标数据库&#xff0c;格式为&#xff1a;psql -h 127.0.0.1 -U 用户名 -d 数据库名 --password 示例&#xff08;用户名Shinelon&#xff0c;数据库mimic&#xff09;&#xff1a;psql -h 127.0.0.1 -U Shinelon -d mi…

css中 hsl() 的用法

好的 &#x1f44d; 我来详细介绍一下 CSS hsl() 的用法。1. 基本语法 color: hsl(hue, saturation, lightness);hue&#xff08;色相&#xff09; 取值范围&#xff1a;0 ~ 360&#xff08;角度值&#xff0c;代表色环的角度&#xff09;0 或 360 → 红色120 → 绿色240 → 蓝…

企业级Spring事务管理:从单体应用到微服务分布式事务完整方案

企业级Spring事务管理&#xff1a;从单体应用到微服务分布式事务完整方案 &#x1f31f; 你好&#xff0c;我是 励志成为糕手 &#xff01; &#x1f30c; 在代码的宇宙中&#xff0c;我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光&#xff0c;在逻辑的土…

继续记录面试题

坐在工位&#xff0c;没事干心慌的不行&#xff0c;可能也是房贷压的。一闲下来就开始胡思乱想&#xff0c;无法沉下心去背那些八股文。这才刚刚接到离职通知第三天啊。而且、我还在坐班呢&#xff01;&#xff01;&#xff01; 哎、怪不得有句老话说的&#xff0c;人穷志短&a…

从零开始学习:深度学习(基础入门版)(第2天)

&#xff08;一&#xff09;在pycharm软件中&#xff0c;用python语言&#xff0c;opencv库实现以下功能(1.1)图片的边界填充核心流程&#xff1a;读取原始图像使用 cv2.imread() 加载名为 yueshan.png 的图像文件统一边界参数设定四周留白尺寸均为 50px&#xff08;上下左右各…

HTTP协议-3-HTTP/2是如何维持长连接的?

先说结论&#xff1a;HTTP/2的“长连接” 一个TCP连接 多路复用 二进制帧 流控制 持久会话管理 它不只是“连接不断”&#xff0c;更关键的是&#xff1a;在这个长连接上&#xff0c;可以同时并发传输成百上千个请求和响应&#xff0c;互不阻塞&#xff01; 1、HTTP/2的“…

图解希尔排序C语言实现

1 希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是D.L.Shell于1959年提出来的一种排序算法&#xff0c;在这之前排序算法的时间复杂度基本都是O(n)&#xff0c;希尔排序算法是突破这个时间复杂度的第一批算法之一。 1.1 基本概念与原理 希尔排序通过将原始列表分割成若…

网络协议——HTTPS协议

目录 一、HTTPS是什么 加密是什么 二、HTTPS的工作过程 &#xff08;一&#xff09;对称加密 &#xff08;二&#xff09;非对称加密 &#xff08;三&#xff09;在非对称加密的基础上&#xff0c;引入证书校验 证书是什么 证书的内容 用证书解决中间人攻击 三、总结 …

React 基础实战:从组件到案例全解析

React 基础实战专栏:从组件到案例全解析 本专栏围绕 React 核心概念(组件、Props、State、生命周期)展开,通过 6个实战案例+核心知识点拆解,帮你掌握 React 基础开发逻辑,每篇聚焦1个实战场景,搭配完整代码与原理讲解,适合 React 入门者巩固基础。 专栏目录 【组件传…

ARM芯片架构之CoreSight Channel Interface 介绍

CoreSight Channel Interface&#xff08;通道接口&#xff09;详解1. 概述 Channel Interface 是 ARM CoreSight 架构中用于在不同组件之间传递触发事件的专用接口。它是 Event Interface 的增强版本&#xff0c;支持多通道、双向通信&#xff0c;以及同步与异步两种时钟域连接…

Blender模拟结构光3D Scanner(二)投影仪内参数匹配

关于投影仪外参的设置可参见前一篇文章 Blender模拟结构光3D Scanner&#xff08;一&#xff09;外参数匹配-CSDN博客 使用Projectors插件模拟投影仪 Step 1 在Github下载插件&#xff08;https://github.com/Ocupe/Projectors&#xff09;。下载zip压缩包即可&#xff0c;无…

synchronized的作用

目录 一、核心作用 二、实现原理&#xff1a;基于"对象锁" 三、使用方式 四、锁的优化 五、优缺点 六、总结 synchronized 是 Java 中用于解决多线程并发安全问题的核心关键字&#xff0c;它的主要作用是实现线程间的同步&#xff0c;确保多个线程在访问共享资…

机试备考笔记 14/31

2025年8月14日 小结&#xff1a;&#xff08;17号整理14号的笔记&#xff0c;这辈子真是有了w(&#xff9f;Д&#xff9f;)w&#xff09;昨天摔了跤大的&#xff0c;今天好妈妈在家&#xff0c;松弛。省流&#xff1a;6道中等&#xff0c;明天只学了10分钟嘻嘻 目录LeetCode22…

dolphinscheduler中任务输出变量的问题出现ArrayIndexOutOfBoundsException

一段脚本任务如下&#xff1a;ret/data/dolphinscheduler/loadOraTable.sh "yonbip/yonbip10.16.10.69:1521/orcl" "select t.bondcontractno,t.olcunissuemny from yonbip.bond_contract t " "/dmp/biz" "bip" "2025-08-13"…

OpenCv(二)——边界填充、阈值处理

目录 一、边界填充&#xff08;Border Padding&#xff09; 1. 常见填充类型及效果 2.代码示例 &#xff08;1&#xff09;constant边界填充&#xff0c;填充指定宽度的像素 &#xff08;2&#xff09;REFLECT镜像边界填充 &#xff08;3&#xff09;REFLECT_101镜像边界…

Leetcode 15 java

今天复习一下翻转二叉树 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2…

嵌入式学习的第四十九天-时钟+EPIT+GPT定时器

一、时钟1.时钟系统基本概念&#xff08;1&#xff09;PLL (锁相环, Phase-Locked Loop)作用&#xff1a;PLL是一种反馈控制电路&#xff0c;用于生成稳定的高频时钟信号。它通过将输出时钟与参考时钟进行比较和调整&#xff0c;可以产生比输入参考时钟频率高得多的输出时钟。倍…

Python Sqlalchemy数据库连接

Python Sqlalchemy数据库连接一、连接数据二、模型三、ORM操作一、连接数据 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker# 1. 连接数据库 dbHost postgres://用户名:密码主机:端口/数据库名 engine create_engine(dbHost) # create_engi…

【Node.js】ECMAScript标准 以及 npm安装

目录 一、 ECMAScript标准 - 默认导出和导入 二、ECMAScript标准 - 命名导出和导入 三、包的概念 五、 npm - 安装所有依赖 六、 npm - 全局软件包 Node.js总结 总结不易~ 本章节对我有很大的收获&#xff0c; 希望对你也是&#xff01;&#xff01;&#xff01; 本节素材…

NPM 、 NPX

NPM vs. NPX 简单来说&#xff0c;npm 是一个 node 包管理器&#xff0c;npx 是一个 Node 包执行器。 NPX 是一个 Node 包执行器&#xff0c;该 Node 包可以是本地也可以是远程的。允许开发者在无需安装的情况下执行任意 Node 包。npm 在安装nodejs 就自动带了 npm install -g …