Spring Boot使用mybatis-plus
ztj100 2025-05-11 19:44 68 浏览 0 评论
前言:
MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上进行了扩展,旨在简化MyBatis的操作并提高开发效率。适用于各种需要进行数据库操作的场景,特别是需要频繁进行CRUD操作的场景。它简化了MyBatis的使用,使得开发者可以更加专注于业务逻辑的实现,而不是过多关注底层的数据库操作。
一、主要特性
- 无侵入性:MyBatis-Plus只做增强不做改变,引入它不会对现有工程产生影响。
- 损耗小:启动即会自动注入基本CURD(Create、Read、Update、Delete),性能基本无损耗,直接面向对象操作。
- 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
- 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件,无需再担心字段写错。
- 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-Sequence),可自由配置,完美解决主键问题。
- 支持ActiveRecord模式:实体类只需继承Model类即可进行强大的CRUD操作。
- 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
- 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,还有超多自定义配置。
- 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询,支持多种数据库。
- 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
- 内置全局拦截插件:提供全表delete、update操作智能分析阻断,也可自定义拦截规则,预防误操作。
二、框架结构
MyBatis-Plus的框架结构主要包括以下几个部分:
- 核心模块:包括BaseMapper接口、BaseService接口等,提供了基础的CRUD操作。
- 条件构造器:用于构建复杂的查询条件,包括SelectOne、SelectList、SelectPage、Update、Delete等方法。
- 代码生成器:可以自动生成Mapper、Model、Service、Controller等层的代码,提高开发效率。
- 插件体系:包括分页插件、性能分析插件、全局拦截插件等,提供了丰富的扩展功能。
三:使用示例
创建springboot项目,引入mvn依赖,配置....
项目结构:
- 1.引入依赖
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- 2.配置yml文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
username: root
password: 123456
#mybatis-plus配置
mybatis-plus:
# 不支持多包, 如有需要可在注解配置 或 提升扫包等级
# 例如 com.**.**.mapper
mapperPackage: com.study.mapper
# 对应的 XML 文件位置
mapperLocations: classpath*:mapper/*Mapper.xml
# 实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.study.domain
global-config:
dbConfig:
# 主键类型
# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
# 如需改为自增 需要将数据库表全部设置为自增
idType: ASSIGN_ID
configuration:
#sql执行日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 3.创建实体
@Data
@TableName("t_user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
}
- 4.创建mapper接口,继承mybatis-plus提供BaseMapper接口
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
- 5.创建service接口,继承mybatis-plus提供IService接口
public interface IUserService extends IService<User> {
}
- 6.创建service实现类,继承mybatis-plus提供ServiceImpl类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
}
- 7.初体验
a.controller:
@RestController
@RequiredArgsConstructor
public class UserController {
private final IUserService userService;
@GetMapping("/query/{id}")
public User queryById(@PathVariable Integer id) {
return userService.getById(id);
}
}
b.数据库:
c.结果:
四:其他用法
- 1.lambda用法
a.代码示例:根据名称模糊搜索
@RestController
@RequiredArgsConstructor
public class UserController {
private final IUserService userService;
@GetMapping("/queryName")
public List<User> queryName(String name) {
LambdaQueryWrapper<User> lqw = Wrappers.lambdaQuery();
lqw.like(!StringUtils.isBlank(name), User::getName, name);
return userService.list(lqw);
}
}
b.结果
- 2.分页
a.创建配置类
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
b.代码示例
@RestController
@RequiredArgsConstructor
public class UserController {
private final IUserService userService;
@GetMapping("/queryPage")
public IPage<User> queryPage(String name) {
LambdaQueryWrapper<User> lqw = Wrappers.lambdaQuery();
lqw.like(!StringUtils.isBlank(name), User::getName, name);
IPage<User> page = new Page<>();
page.setCurrent(1);
page.setSize(10);
IPage<User> result = userService.page(page, lqw);
return result;
}
}
c.结果
还有非常多的用法 ,自行试试
- 上一篇:最新Spring面试高频考点解析
- 下一篇:这可能是最全面的Spring面试八股文了
相关推荐
- sharding-jdbc实现`分库分表`与`读写分离`
-
一、前言本文将基于以下环境整合...
- 三分钟了解mysql中主键、外键、非空、唯一、默认约束是什么
-
在数据库中,数据表是数据库中最重要、最基本的操作对象,是数据存储的基本单位。数据表被定义为列的集合,数据在表中是按照行和列的格式来存储的。每一行代表一条唯一的记录,每一列代表记录中的一个域。...
- MySQL8行级锁_mysql如何加行级锁
-
MySQL8行级锁版本:8.0.34基本概念...
- mysql使用小技巧_mysql使用入门
-
1、MySQL中有许多很实用的函数,好好利用它们可以省去很多时间:group_concat()将取到的值用逗号连接,可以这么用:selectgroup_concat(distinctid)fr...
- MySQL/MariaDB中如何支持全部的Unicode?
-
永远不要在MySQL中使用utf8,并且始终使用utf8mb4。utf8mb4介绍MySQL/MariaDB中,utf8字符集并不是对Unicode的真正实现,即不是真正的UTF-8编码,因...
- 聊聊 MySQL Server 可执行注释,你懂了吗?
-
前言MySQLServer当前支持如下3种注释风格:...
- MySQL系列-源码编译安装(v5.7.34)
-
一、系统环境要求...
- MySQL的锁就锁住我啦!与腾讯大佬的技术交谈,是我小看它了
-
对酒当歌,人生几何!朝朝暮暮,唯有己脱。苦苦寻觅找工作之间,殊不知今日之事乃我心之痛,难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日,可惜在下京东上的小金库都要见低啦。每每想到不由心中一...
- MySQL字符问题_mysql中字符串的位置
-
中文写入乱码问题:我输入的中文编码是urf8的,建的库是urf8的,但是插入mysql总是乱码,一堆"???????????????????????"我用的是ibatis,终于找到原因了,我是这么解决...
- 深圳尚学堂:mysql基本sql语句大全(三)
-
数据开发-经典1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as//从少...
- MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?
-
大家好,是不是很多人都对MySQL加行级锁的规则搞的迷迷糊糊,一会是next-key锁,一会是间隙锁,一会又是记录锁。坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如何用命令分析加...
- 一文讲清怎么利用Python Django实现Excel数据表的导入导出功能
-
摘要:Python作为一门简单易学且功能强大的编程语言,广受程序员、数据分析师和AI工程师的青睐。本文系统讲解了如何使用Python的Django框架结合openpyxl库实现Excel...
- 用DataX实现两个MySQL实例间的数据同步
-
DataXDataX使用Java实现。如果可以实现数据库实例之间准实时的...
- MySQL数据库知识_mysql数据库基础知识
-
MySQL是一种关系型数据库管理系统;那废话不多说,直接上自己以前学习整理文档:查看数据库命令:(1).查看存储过程状态:showprocedurestatus;(2).显示系统变量:show...
- 如何为MySQL中的JSON字段设置索引
-
背景MySQL在2015年中发布的5.7.8版本中首次引入了JSON数据类型。自此,它成了一种逃离严格列定义的方式,可以存储各种形状和大小的JSON文档,例如审计日志、配置信息、第三方数据包、用户自定...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
【VueTorrent】一款吊炸天的qBittorrent主题,人人都可用
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)