黑马微服务开发与实战学习笔记_MybatisPlus_P1介绍与快速入门

news2025/1/23 10:32:21

系列博客目录


文章目录

  • 系列博客目录
  • MybatisPlus介绍
  • 快速入门
    • Part1:入门案例
      • Part1.1:MyBatis项目
      • Part1.2:实现MP
    • Part2:常见注解
      • Part2.1:约定
      • Part2.2:常见注解
    • Part3:常见配置
    • MyBatisPlus使用的基本流程是什么?


MybatisPlus介绍

在Mybatis上加了Plus,表示对Mybatis的加强和升级,但他不是来替代Mybatis的。MyBatisPlus想成为Mybtis最佳的合作伙伴。下面蓝色是Plus。
在这里插入图片描述
官网链接
在这里插入图片描述
为了简化开发而生。

  1. 润物无声,只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。表明引入MyBatisPlus,对现有工程产生影响,之前针对Mybatis的代码可以照常运行,在开发新功能时候可以使用MyBatisPlus,或者对之前功能进行改造,都可以。
  2. 效率至上,只需简单配置,即可快速进行单表 CRUD 操作,从而节省大量时间。因为我们大多数业务都是单表CRUD。直接调用MyBatisPlus的方法,就可以了,少写了很多代码,效率提高。其实不止有单表。还有很多丰富的功能。
  3. 丰富功能,代码生成、自动分页、逻辑删除、自动填充、拦截器等功能一应俱全。

点击快速开始后可以查看MyBatisPlus的功能。后面分为四部分进行学习。(现在的官网分类有所改变,但内容总量没变)

  • 快速入门
  • 核心功能
  • 扩展功能
  • 插件功能

快速入门

Part1:入门案例

学会MP的基本用法、体会MP的无侵入和方便快捷的特点

需求:基于课前资料提供的项目,实现下列功能:

  • 新增用户功能
  • 根据id查询用户
  • 根据id批量查询用户
  • 根据id更新用户
  • 根据id删除用户

Part1.1:MyBatis项目

只需要学习对原有代码(未使用MP的代码)的改造,所以先打开提供的项目代码,并执行sql语句。
项目中resources是一些配置,主要的Java代码主要有User实体类,启动类通过注释@MapperScan("com.itheima.mp.mapper"),定义了mapper扫描包,扫描到Mapper接口才会生效。之后增删改查需要定义到mapper接口中。
在这里插入图片描述
之前的没有MP时,我们需要在UserMapper写好接口,然后在UserMapper.xml中写好MyBatis语句,相当麻烦。

package com.itheima.mp.mapper;
import com.itheima.mp.domain.po.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper{
    void saveUser(User user);
    void deleteUser(Long id);
    void updateUser(User user);
    User queryUserById(@Param("id") Long id);
    List<User> queryUserByIds(@Param("ids") List<Long> ids);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mp.mapper.UserMapper">
    <insert id="saveUser" parameterType="com.itheima.mp.domain.po.User">
        INSERT INTO `user` (`id`, `username`, `password`, `phone`, `info`, `balance`)
        VALUES
        (#{id}, #{username}, #{password}, #{phone}, #{info}, #{balance});
    </insert>
    <update id="updateUser" parameterType="com.itheima.mp.domain.po.User">
        UPDATE `user`
        <set>
            <if test="username != null">
                `username`=#{username}
            </if>
            <if test="password != null">
                `password`=#{password}
            </if>
            <if test="phone != null">
                `phone`=#{phone}
            </if>
            <if test="info != null">
                `info`=#{info}
            </if>
            <if test="status != null">
                `status`=#{status}
            </if>
            <if test="balance != null">
                `balance`=#{balance}
            </if>
        </set>
        WHERE `id`=#{id};
    </update>
    <delete id="deleteUser" parameterType="com.itheima.mp.domain.po.User">
        DELETE FROM user WHERE id = #{id}
    </delete>

    <select id="queryUserById" resultType="com.itheima.mp.domain.po.User">
        SELECT *
        FROM user
        WHERE id = #{id}
    </select>

    <select id="queryUserByIds" resultType="com.itheima.mp.domain.po.User">
        SELECT *
        FROM user
        <if test="ids != null">
            WHERE id IN
            <foreach collection="ids" open="(" close=")" item="id" separator=",">
                #{id}
            </foreach>
        </if>
        LIMIT 10
    </select>
</mapper>

Part1.2:实现MP

  1. 引入MybatisPlus的起步依赖
    MyBatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。
    因此我们可以用MybatisPlus的starter代替Mybatis的starter:
<!--MybatisPlus-->
<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>mybatis-plus-boot-starter</artifactId>
	<version>3.5.3.1</version>
</dependency>

实操如下图所示:
在这里插入图片描述

  1. 定义Mapper
    自定义的Mapper继承MybatisPlus提供的BaseMapper接口,接口中有许多定义好的接口,如下图所示。我们不想自己写代码,就通过继承。认个爹。
public interface UserMapper extends BaseMapper<User>//注意泛型 需要是定义好的实体类 才知道增删改查操作哪个实体

在这里插入图片描述
实操结果如下:在这里插入图片描述
但这里需要注意,你这里的这个接口中有自己定义的queryUserById,我们进行测试的时候还是会用自己写的代码,因为MP是无侵入的。

@SpringBootTest
class UserMapperTest {
	@Autowired
	private UserMapper userMapper;

	@Test
	void testSelectById() {
   	 	User user = userMapper.queryUserById(5L);
    	System.out.println("user = " + user);
	}
}

完全可以删除自己写的这部分代码,之后通过在定义了一个 UserMapper 类型的成员变量后面加.实现代码自动补全(Code Completion)来调用MP给我们定义的函数。(query变为了select)
在这里插入图片描述
这个时候我们针对数据库增删改查的一行代码都没写,只写了测试代码和实体类就可以实现增删改查。实现了润物无声和效率之上。那MP怎么知道我要访问哪张表,修改表中哪些字段呢?

Part2:常见注解

MP怎么知道我要访问哪张表?表中有哪些信息?修改表中哪些字段呢?
一句话概括:MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息

public interface UserMapper extends BaseMapper<User>{
}

Part2.1:约定

实体类中有很多信息,哪些作为表的信息呢?这里有很多约定。约定大于配置

  1. 名驼峰转下划线作为
  2. 名为id的字段作为主键
  3. 变量名驼峰转下划线作为表的字段

如果实体类不符合约定怎么办呢,必须自己定义表名,主键,字段名,怎样定义呢?注解

Part2.2:常见注解

官网相关内容链接

MybatisPlus中比较常用的几个注解如下

  • @TableName:用来指定表名。举例:比如表名叫tb_user,类名叫User,那我们在定义的类上面加注解@TableName("tb_user")

  • @Tableld:用来指定表中的主键字段信息。类似上面,在类的想要指定为主键的属性上加上@TableId("id" ) 主键是有特殊地方的。数据库中主键是有自己的生成方式的。比如一般会是自增长:AUTO_INCREMENT。这时候我们需要@TableId(value="id",type= 选择一种IdType) IdType枚举:AUTO:数据库自增长。INPUT:通过set方法由程序员来自行输。ASSIGN_ID:分配lD,接口ldentifierGenerator的方法nextld来生成id,其默认实现类为DefaultldentifierGenerator雪花算法。 上面都可以不加id,那就默认为指定数据库中id为主键,比如直接@TableId或者@TableId(type= 选择一种IdType)。如果不加id类型默认为ASSIGN_ID

  • @TableField:用来指定表中的普通字段信息。举例如下:

使用@TableField的常见场景

  • 成员变量名与数据库字段名不一致
  • 成员变量名以is开头,且是布尔值
  • 成员变量名与数据库关键字冲突
  • 成员变量不是数据库字段
    在这里插入图片描述

Part3:常见配置

官网配置相关链接、每一项的默认值等都写得很清楚

MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。例如
常见配置配置在application.yaml中。

mybatis-plus:
	type-aliases-package:com.itheima.mp.domain.po # 别名扫描包 生成的别名通常是类名的小写形式 
	# 在 XML 映射文件中使用时,你可以直接使用类的简短名称,而不必写全类名。
	mapper-locations:"classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值 
	# 为何我用了MP了还需要指定sql所在的xml文件呢,是因为MP一般只针对单表,多表还是要我们自己写sql语句。
	configuration:
		map-underscore-to-camel-case:true #是否开启下划线和驼峰的跌射
		cacheenabled:false#是否开启级缓存
	global-config: # 全局配置 优先级不如注解 如果注解没配置 就会走全局
		db-config: # 针对数据库方面的配置 全局还可以配置一些数据库无关的配置项。这些配置项主要涉及 MyBatis-Plus 的行为、插件、性能分析等
			id-type:assign_id # id为雪花算法生成
			update-strategy:not_null #更新策略:只更新非空字段 在update时候很有用,对于没有赋新值的属性,我们不进行更新。

MyBatisPlus使用的基本流程是什么?

  1. 引入起步依赖
  2. 自定义Mapper基础BaseMapper
  3. 在实体类上添加注解声明 表信息
  4. 在application.yml中根据需要添加配置

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

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

相关文章

多模态大语言模型的对比

简介 文章主要对比了包括 VideoLLaMA 2 、CogVLM2-video 、MiniCPM-V等模型 目前主流的多模态视觉问答大模型&#xff0c;大部分采用视觉编码器、大语言模型、图像到文本特征的投影模块 目录 简介1. VideoLLaMA 21.1 网络结构1.2 STC connector具体的架构 2. MiniCPM-V 2.62.…

Docker Compose 和 Kubernetes 之间的区别?

一、简介&#x1f380; 1.1 Docker Compose Docker Compose 是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的快速编排&#xff0c;可以管理多个 Docker 容器组成一个应用。你只需定义一个 YAML 格式的配置文件 docker-compose.yml &#xff0c;即可创建并…

小迪安全笔记 第四十四天 sql盲注 实战利用sql盲注 进行漏洞的利用

sql盲注的分类 什么是盲注 就是我们什么也不知道的情况下进行的注入 前边的注入 都是简单的注入 我们猜测 数据类型 之后 可以直接 union 去查 这种情况多用于 数据库增删查改中的 查 bool盲注也用于查 这个的情况的就是我们前边都试了 没有用 就需要…

FFmpeg:强大的音视频处理工具指南

FFmpeg&#xff1a;强大的音视频处理工具指南 1. FFmpeg简介2. 核心特性2.1 基础功能2.2 支持的格式和编解码器 3. 主要组件3.1 命令行工具3.2 开发库 4. 最新发展5. 安装指南5.1 Windows系统安装5.1.1 直接下载可执行文件5.1.2 使用包管理器安装 5.2 Linux系统安装5.2.1 Ubunt…

Cursor+Devbox AI开发快速入门

1. 前言 今天无意间了解到 Cursor 和 Devbox 两大开发神器,初步尝试以后发现确实能够大幅度提升开发效率,特此想要整理成博客以供大家快速入门. 简单理解 Cursor 就是一款结合AI大模型的代码编辑器,你可以将自己的思路告诉AI,剩下的目录结构的搭建以及项目代码的实现均由AI帮…

MySQL——操作

一.库的操作 1.基本操作 创建数据库 create database 数据库名称; 查看数据库 show databases; 删除数据库 drop database 数据库名称; 执行删除之后的结果: 数据库内部看不到对应的数据库 对应的数据库文件夹被删除&#xff0c;级联删除&#xff0c;里面的数据表全部被删…

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MacOS安装sshfs挂载远程电脑硬盘到本地

文章目录 sshfs简介sshfs安装下载安装macFUSE安装sshfs sshfs使用注意事项 sshfs简介 SSHFS&#xff08;SSH Filesystem&#xff09;是一种基于FUSE&#xff08;用户空间文件系统&#xff09;的文件系统&#xff0c;它允许你通过SSH协议挂载远程文件系统。使用SSHFS&#xff0…

数据结构---链表(2)---双向链表

链表(1)中讲过了在OJ题中出现很多并且能作为一些复杂数据结构子结构的不带头单向不循环链表&#xff0c;下面讲解应用很广很实用的带头双向循环链表。 三、双向链表---DoublyLinkedList 演示带头双向循环链表(实用)。 带头--->不需要对空链表继续单独判断&#xff1b;循环…

Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 项目介绍 1.1 项目功能 2.0 用户登录功能 3.0 首页界面 4.0 车辆信息管理功能 5.0 停车位管理功能 6.0 入场登记管理功能 7.0 预约管理功能 8.0 收费规则功能 9.0…

【text2sql】低资源场景下Text2SQL方法

SFT使模型能够遵循输入指令并根据预定义模板进行思考和响应。如上图&#xff0c;、 和 是用于通知模型在推理过程中响应角色的角色标签。 后面的内容表示模型需要遵循的指令&#xff0c;而 后面的内容传达了当前用户对模型的需求。 后面的内容代表模型的预期输出&#xff0c;也…

MongoDB安装|注意事项

《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书&#xff0c;作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书&#xff0c;它是真正讲解Spring Boot的图书。Spring Boot的核心…

基于 LLamafactory 的异步API高效调用实现与速度对比

文章目录 背景摘要简介代码实现运行结果速度对比异步调用速度同步调用速度 背景 原先经常调用各家的闭源大模型的API&#xff0c;如果使用同步的方式调用&#xff0c;速度会很慢。为了加快 API 的调用速度&#xff0c;决定使用异步调用 API 的方式。 摘要 通过异步方式调用大…

Linux的用户和权限【Linux操作系统】

文章目录 Linux的用户切换用户普通用户暂时以root用户的权限执行指令如何把一个普通用户加入白名单? 新建用户 Linux权限权限的组成更改权限文件/目录权限的表示方法&#xff1a; umask粘滞位添加粘滞位的方法 Linux的用户 Linux下有两种⽤⼾&#xff1a;超级用户&#xff08…

如何使用apache部署若依前后端分离项目

本章教程介绍,如何在apache上部署若依前后端分离项目 一、教程说明 本章教程,不介绍如何启动后端以及安装数据库等步骤,着重介绍apache的反向代理如何配置。 参考此教程,默认你已经完成了若依后端服务的启动步骤。 前端打包命令使用以下命令进行打包之后会生成一个dist目录…

优先算法 —— 滑动窗口系列 - 无重复字符的最长子串

目录 前言 1. 无重复字符的最长子串 2. 题目解析 3. 算法原理 解法1&#xff1a;暴力枚举 哈希表&#xff08;判断字符是否有重复出现&#xff09; 解法2&#xff1a;滑动窗口 4. 代码 前言 当我们发现暴力解法两个指针都不回退&#xff0c;都是向同一个方向移动的时候我…

2024年认证杯SPSSPRO杯数学建模B题(第一阶段)神经外科手术的定位与导航解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现&#xff1a; 人的大脑结构非常复杂&#xff0c;内部交织密布着神经和血管&#xff0c;所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术&#xff0c;通常需要…

Jest timers

引入 我们自己先写一个定时器,在这里,这个测试是一定会通过的,因为他一旦传入callback,就算是完成了,而不是在意你的运行结果了,而且你的定时器还有几秒呢 export const timer (fn) > {setTimeout(() > {fn()}, 3000) }//test import {timer} from "./timer"…

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习&#xff0c;我们学了了PPP协议帧的格式以及组成&#xff0c;那么对于使用PPP协议的链路是怎么初始化的呢&#xff1f; 当用户拨号上网接入到ISP后&#xff0c;就建立起了一条个人用户到ISP的物理链路。这时&#xff0c;用户向ISP发送一…

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称&#xff1a;UPIrregularWidgets 插件包含以下功能 你可以点击任何图片&#xff0c;而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能&#xff0c;复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…