MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例

目录

1. MyBatis-Plus简介

1.1 简介

1.2 特性

1.3 支持的数据库

 1.4 框架结构

1.5 代码及文档地址

2. 入门案例

2.1 开发环境

2.2 创建数据库及表

 1. 创建表

2. 添加数据

2.3 创建SpringBoot工程

1. 初始化工程

 2. 引入依赖

 3. IDEA中安装lombok插件

​编辑

2.4 编写代码 

1. 配置application.yml

2. 启动类

3. 添加实体

4. 添加mapper

5. 测试

6. 添加日志

2.5 MapperScan和repository的区别


1. MyBatis-Plus简介

1.1 简介

        MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生Mybatis-Plus提供了通用的Mapper和Service,可以在不编写任何SQL语句的前提下,快速的实现单表的增删改查(CURD),批量,逻辑删除,分页等操作。只要把MyBatis-Plus的特性到优秀插件,以及多数据源的配置进行详细讲解。

愿景

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

1.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 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.3 支持的数据库

任何能使用MyBatis进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下

 1.4 框架结构

1.5 代码及文档地址

官方地址: http://mp.baomidou.com

代码发布地址:

Github: GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development

Gitee: mybatis-plus: mybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com低代码组件库 http://aizuda.com

文档发布地址: https://baomidou.com/pages/24112f


2. 入门案例

2.1 开发环境

IDE idea 2017

JDKJDK1.8

构建工具:  maven 3.6.0

MySQL版本:  MySQL 5.6   (mysql常用版本:5.6  5.7  8.0)

Spring Boot2.7.4

MyBatis-Plus3.5.1

2.2 创建数据库及表

 1. 创建表

CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名 ',
`age` int(11) DEFAULT NULL COMMENT '年龄 ',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱 ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 添加数据

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


2.3 创建SpringBoot工程

1. 初始化工程

 使用 Spring Initializr 快速初始化一个 Spring Boot 工程

 

 2. 引入依赖

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

 3. IDEA中安装lombok插件

 


2.4 编写代码 

1. 配置application.yml

spring:# 配置数据源信息datasource:# 配置数据源类型type: com.zaxxer.hikari.HikariDataSource# 配置连接数据库信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=falseusername: rootpassword: 2020

 相关解释  :

        数据库连接池

        Spring Boot 1.x 版本默认的数据库连接池是 org.apache.tomcat.jdbc.pool.DataSource。在 Spring Boot 2.x 版本及以后,默认的数据库连接池是 com.zaxxer.hikari.HikariDataSource

        驱动类

        在 MySQL 5.x 版本中,推荐使用的 JDBC 驱动类是 com.mysql.jdbc.Driver。不过从 MySQL Connector/J 5.1.47 版本开始,官方更推荐使用 com.mysql.cj.jdbc.Driver 这个新的驱动类。

        而到了 MySQL 8.0 版本,com.mysql.jdbc.Driver 被标记为已过时,官方只支持使用 

com.mysql.cj.jdbc.Driver。

注意!!

1、驱动类driver-class-name

spring boot 2.0(内置jdbc5驱动),驱动类使用:      

driver-class-name: com.mysql.jdbc.Driver

spring boot 2.1及以上(内置jdbc8驱动),驱动类使用:

driver-class-name: com.mysql.cj.jdbc.Driver

   否则运行测试用例的时候会有 WARN 信息

 2、连接地址url 

MySQL5.7版本的url

jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false

MySQL8.0版本的url

jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false

否则运行测试用例报告如下错误:

java.sql.SQLException: The server time zone value'Öйú±ê׼ʱ¼ä' is unrecognized or represents more

2. 启动类

  在Spring Boot启动类中添加@MapperScan注解,扫描mapper包。

        用途是扫描指定包路径下的 Mapper 接口,并且将这些接口自动注册为 Spring Bean。如此一来,你就能在服务层里直接注入这些 Mapper 接口,进而使用它们来操作数据库。

        接口的代理实现类是由框架来提供的,所以我们需要配置一个单独扫描mapper的扫描器。

@SpringBootApplication
@MapperScan("com.qcby.mybatisplus.mapper")
public class MybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusApplication.class, args);}}

3. 添加实体

@Data  //lombok注解
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class User {private Long id;private String name;private Integer age;private String email;
}

快捷键: ctrl+F12 查看类结构。

只有@Data注解时,没有含参的构造器。

 

@AllArgsConstructor 注解可以自动为类生成一个包含所有成员变量的构造函数。

        但是如果只加 @AllArgsConstructor 就没有无参的构造器了,需要再加一个@NoArgsConstructor,构造无参构造器。

@Getter注解,显然是构造访问器。

@Setter注解,构造更改器。

4. 添加mapper

        BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的 实体类型

public interface UserMapper extends BaseMapper<User> {
}
package com.baomidou.mybatisplus.core.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.COLLECTION) Collection<? extends Serializable> 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.COLLECTION) 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> ts = this.selectList(queryWrapper);if (CollectionUtils.isNotEmpty(ts)) {if (ts.size() != 1) {throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");}return ts.get(0);}return null;}/*** 根据 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);
}

5. 测试

@SpringBootTest
class MybatisPlusApplicationTests {@Autowiredprivate UserMapper userMapper;@Testpublic void testSelectList(){//selectList()根据MP内置的条件构造器查询一个list集合,null表示没有条件,即查询所有userMapper.selectList(null).forEach(System.out::println);}

jdk1.8的输出格式 

userMapper.selectList(null).forEach(System.out::println);

可以直接注入接口的原因是:

        在测试类里注入 Mapper 接口时,实际上注入的是 MyBatis-Plus 为该接口生成的代理对象。MyBatis-Plus 会为扫描到的 Mapper 接口创建代理对象。这些代理对象实现了 Mapper 接口的方法,并且在方法调用时会和数据库进行交互。 

结果

 注意:

        IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确 的执行。

为了避免报错,可以在mapper接口上添加 @Repository 注解


@Repository
public interface UserMapper extends BaseMapper<User> {
}

 原因:

        在 Spring 框架里,@Repository 是一个重要的注解,它主要用于将一个类标记为数据访问层(DAO,Data Access Object)的组件。

        @Repository 注解用于告诉 Spring 容器,被注解的类是一个数据访问对象,负责与数据库、文件系统等数据源进行交互。Spring 会自动将这个类注册为一个 Bean,这样你就可以在其他组件中通过依赖注入的方式使用它。

6. 添加日志

application.yml中配置日志输出

# 配置MyBatis日志
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

可以看到执行的sql语句。

2.5 MapperScan和repository的区别

  接口的代理实现类是由框架来提供的,所以我们需要配置一个单独扫描mapper的扫描器。

@MapperScan是 MyBatis-Spring 框架里的注解。MyBatis 是一个优秀的持久层框架,而 MyBatis-Spring 则让 MyBatis 能更好地集成到 Spring 框架中。

        作用:它的作用是扫描指定包下的所有接口,并把这些接口自动注册为 MyBatis 的 Mapper Bean。这样一来,我们就无需在每个 Mapper 接口上单独添加@Mapper注解了。

@Repository是 Spring 框架自带的注解。

        将类(这个接口的代理类)交给Spring去管理,而这个代理类是由mybatisPlus(MyBatis的增强,还是MyBatis)实现的。管理着它的实现类,要是没有这个注解,就需要userMapperImpl,但是mybatisPlus框架都给提供了。

        如果不加,他会报波浪线,但是不出错。

        如果这个接口有很多实现类,加了@Repository注解,就明确告诉它,用的是框架提供的实现类。

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

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

相关文章

k8s高可用集群安装

一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …

【PPO】小白的强化学习算法笔记

参考视频 零基础学习强化学习算法&#xff1a;ppo 基础概念 environment环境agent&#xff1a;智能体&#xff0c;玩游戏的你state&#xff1a;当前状态&#xff0c;observation看到的部分&#xff0c;有的游戏只能看见state的一部分action&#xff1a;agent做出的动作reward…

Flink介绍与安装

Apache Flink是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行&#xff0c;以任意规模和内存级速度执行计算。 一、主要特点和功能 1. 实时流处理: 低延迟: Flink 能够以亚秒级的延迟处理数据流&#xff0c;非常…

深入解析 JVM 内存区域及核心概念

深入解析 JVM 内存区域及核心概念 Java 虚拟机&#xff08;JVM&#xff09;内部划分了多个内存区域&#xff0c;每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容&#xff1a; 程序计数器&#xff1a;记录当前线程正在执行的字节码指令及其“行号”信息&a…

Java操作RabbitMQ

文章目录 Spring集成RabbitMQ1. AMQP&SpringAMQP2. SpringBoot集成RabbitMQ3. 模型work模型 4.交换机Fanout交换机Direct交换机Topic交换机 5.声明式队列和交换机基于API声明基于注解声明 6.消息转换器 Spring集成RabbitMQ 1. AMQP&SpringAMQP AMQP&#xff08;高级消…

Kotlin泛型: 协变|逆变|不变

引言 无论java 通配符上限还是下限&#xff0c;都多少存在缺陷&#xff0c;要么存不安全&#xff0c;要么取不安全。而kotlin就解决这个问题。让out 纯输出&#xff0c; 让in纯输入。 java这块知识&#xff1a; java泛型的协变、逆变和不变-CSDN博客 协变 生产者out T 协变…

【Excel使用技巧】某列保留固定字段或内容

目录 ✅ 方法一&#xff1a;使用 Excel 公式提取 body 部分 &#x1f50d; 解释&#xff1a; ✅ 方法二&#xff1a;批量处理整列数据 &#x1f6a8; 注意事项 &#x1f6a8; 处理效果 我想保留Excel某一列的固定内容&#xff0c;比如原内容是&#xff1a; thread entry i…

C# System.Text.Encoding 使用详解

总目录 前言 在C#编程中&#xff0c;处理字符串和字节数组之间的转换是一个常见的任务。System.Text.Encoding类及其派生类提供了丰富的功能&#xff0c;帮助开发者实现不同字符编码之间的转换。本文将详细讲解System.Text.Encoding类的使用方法&#xff0c;包括常用编码的介绍…

Pre-flash和Main flash

在相机拍照过程中&#xff0c;Pre-flash&#xff08;预闪光&#xff09; 和 Main flash&#xff08;主闪光&#xff09; 是常见的两种闪光灯使用模式&#xff0c;通常用于提高低光环境下的拍摄质量&#xff0c;尤其在自动曝光&#xff08;AE&#xff09;和自动对焦&#xff08;…

Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API

KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑&#xff0c;标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下&#xff0c;Kafka 简化了部署和管理&#xff0c;消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…

SFT实验报告

大模型微调实验报告* 实验目标 梳理大模型微调方法&#xff0c;评估各种基座和微调方法的实验效果。 基础模型 \1.Llama \2.Qwen \3.Chatglm4 \4. 微调策略 LoRA系列 低秩适配&#xff08;LoRA&#xff09;的核心思想是冻结原始参数&#xff0c;通过低秩分解引入可训…

LLM - R1 强化学习 DRPO 策略优化 DAPO 与 Dr. GRPO 算法 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/146533892 在强化学习算法中&#xff0c;DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization)&#xff0c;通过解耦裁剪和动态采样策…

美摄科技智能汽车视频延迟摄影解决方案,开启智能出行新视界

在智能汽车时代&#xff0c;车载影像技术正以前所未有的速度发展&#xff0c;成为提升驾乘体验和满足用户多样化需求的关键因素。美摄科技凭借其卓越的技术实力和创新精神&#xff0c;推出了智能汽车视频延迟摄影解决方案&#xff0c;为智能汽车行业带来了一场视觉盛宴。 一、…

[250325] Claude AI 现已支持网络搜索功能!| ReactOS 0.4.15 发布!

目录 Claude AI 现已支持网络搜索功能&#xff01;ReactOS 0.4.15 发布&#xff01; Claude AI 现已支持网络搜索功能&#xff01; 近日&#xff0c;Anthropic 公司宣布&#xff0c;其 AI 助手 Claude 现在可以进行网络搜索&#xff0c;为用户提供更及时、更相关的回复。这项新…

代码规范之Variable Names变量名

代码规范之Variable Names变量名 golang中 官方文档&#xff1a;https://go.dev/wiki/CodeReviewComments#variable-names Variable names in Go should be short rather than long. This is especially true for local variables with limited scope. Prefer c to lineCoun…

Mybatis_plus

前言 Mybatis_plus 是在 mybatis 的基础上进行了增强&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。本文章只做简单的使用介绍&#xff0c;更加详细的内容大家可以参考官网。 下面是mybatis_plus 官网地址&#xff1a; mybatis_plu…

深圳问顶安全科技有限公司asktopsec是做什么的?

深圳问顶安全科技有限公司&#xff0c;是一家专业的AI与应用安全公司。 全球领先的AI、Android、IOS应用安全解决方案提供商&#xff0c;官网&#xff1a;https://asktopsec.com 问顶安全主要为企业提供AI和应用安全服务 移动应用安全检测、移动应用安全加固、AI智能体安全、AI…

鸿蒙OS 5 架构设计探秘:从分层设计到多端部署

文章目录 鸿蒙OS架构设计探秘&#xff1a;从分层设计到多端部署一、鸿蒙的分层架构设计二、模块化设计的精髓三、智慧分发设计&#xff1a;资源的动态调度四、一次开发&#xff0c;多端部署的实践总结与思考 鸿蒙OS架构设计探秘&#xff1a;从分层设计到多端部署 最近两年来&a…

idea 没有 add framework support(添加框架支持)选项

在 IntelliJ IDEA 2023 中&#xff0c;若需通过设置手动添加 “添加框架支持” 菜单项&#xff0c;可按照以下步骤操作&#xff1a; 手动添加 “添加框架支持” 菜单项 打开设置 点击顶部菜单栏的 File&#xff08;文件&#xff09; -> Settings&#xff08;设置&#xff09…

计算机网络--传输层(2)

传输层核心机制深度解析 一、可靠传输实现机制 1. 校验和机制 技术原理&#xff1a; 使用16位二进制反码求和算法&#xff0c;计算范围包括TCP伪首部&#xff08;12字节&#xff09;、TCP首部&#xff08;20字节&#xff09;和数据部分接收端重新计算校验和&#xff0c;若与…