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

系列博客目录


文章目录

  • 系列博客目录
  • 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 userWHERE 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 {@Autowiredprivate UserMapper userMapper;@Testvoid 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.mzph.cn/web/61936.shtml

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

相关文章

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质&#xff08;Materials&#xff09; 定义了场景中对象的表面属性&#xff0c;包括颜色、金属度、粗糙度、透明度等等&#xff1b;可以在材质编辑器中可视化地创建和编辑材质&#xff1b;虚幻引擎的渲染管线的着色器是用高级着色语言&#xff08;…

爬虫专栏第一篇:深入探索爬虫世界:基础原理、类型特点与规范要点全解析

本专栏会对爬虫进行从0开始的讲解&#xff0c;每一步都十分的细致&#xff0c;如果你感兴趣希望多多点赞收藏关注支持 简介&#xff1a;文章对爬虫展开多方面剖析。起始于爬虫的基本概念&#xff0c;即依特定规则在网络抓取信息的程序或脚本&#xff0c;在搜索引擎信息提取上作…

Y20030028 JAVA+SSM+MYSQL+LW+基于JAVA的考研监督互助系统的设计与实现 源代码 配置 文档

基于JAVA的考研监督互助系统 1.项目描述2. 课题开发背景及意义3.项目功能4.界面展示5.源码获取 1.项目描述 随着高等教育的普及和就业竞争的加剧&#xff0c;越来越多的学生选择继续深造&#xff0c;参加研究生入学考试。考研人数的不断增加&#xff0c;使得考研过程中的学习监…

【AI系统】推理流程全景

推理流程全景 本文介绍神经网络模型在部署态中的两种方式&#xff1a;云侧部署和边缘侧部署。其中&#xff0c;云侧部署适用于云服务器等具备强大计算能力和存储空间的环境&#xff0c;可以实现高吞吐量和集中的数据管理&#xff0c;但可能面临高成本、网络延迟和数据隐私等挑…

9.13[debug]

这个错误表明 Git 尝试通过 HTTPS 协议连接到 Gitee 上的仓库时&#xff0c;实际上却尝试连接到了本地的 127.0.0.1&#xff08;即 localhost&#xff09;的 7890 端口&#xff0c;这通常是因为 HTTP 代理配置错误或全局 Git 配置中的代理设置不正确 如果这些命令返回了代理设…

Linux-GPIO应用编程

本章介绍应用层如何控制 GPIO&#xff0c;譬如控制 GPIO 输出高电平、或输出低电平。 只要是用到GPIO的外设&#xff0c;都有可能用得到这些操作方法。 照理说&#xff0c;GPIO的操作应该是由驱动层去做的&#xff0c;使用寄存器操作或者GPIO子系统之类的框架。 但是&#xff0…

Altium Designer学习笔记 28 扇孔处理

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

XiYan-SQL:⼀种多⽣成器集成的Text-to-SQL框架

发布于:2024 年 12 月 03 日 星期二 北京 #NL2SQL #阿里巴巴 #Text-to-SQL 文提出了一种用于自然语言到 SQL 转换的多生成器集成框架 ——XiYan-SQL,旨在应对大型语言模型在 NL2SQL 任务中的挑战。该框架融合提示工程与监督微调(SFT)方法,利用 SFT 的可控性与上下文学习(…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前&#xff0c;作者用 Qt 仿照前端 UI 设计了一个 ministack&#xff08;https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h&#xff09; 控件&#xff0c;这个控件可以折叠。部分用户体验后&#…

嵌入式C编程:宏定义与typedef的深入对比与应用

目录 一、宏定义&#xff08;Macro Definition&#xff09; 1.1. 特点与应用 1.1.1 定义常量 1.1.2 定义函数式宏 1.1.3 条件编译 1.2. 作用范围和生命周期方面 1.3. 应用注意事项 二、typedef 2.1. 特点与应用 2.1.1 简化类型声明 2.1.2 提高代码可读性 2.1.3 实现…

如何高效写论文-学习笔记【AI算法研究猿James】

视频链接&#xff1a;如何高效写论文_哔哩哔哩_bilibili 视频里面广告内容较多&#xff0c;为便于复习回顾&#xff0c;现对学习内容进行记录。 目录 1、写论文总体认知 1.1、写论文到底有多重要? 1.2、写论文难在哪儿? 2、从审稿人角度看论文写作 2.1、审稿人在意的是…

电脑插入耳机和音响,只显示一个播放设备

1. 控制面板-硬件和声音-Realtek高清音频-扬声器-设备高级设置-播放设备里选择使用前部和后部输出设备同时播放两种不同的音频流 在声音设置中就可以看到耳机播放选项

代码随想录算法训练营day49|动态规划part11

最长公共子序列 这个与上篇笔记最大的不同就是子序列里的数可以不相邻,那么只需加入一个dp[i][j]的上和左的更新方向即可 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<…

JavaEE-经典多线程样例

文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合削峰填…

qt QCryptographicHash详解

1、概述 QCryptographicHash是Qt框架中提供的一个类&#xff0c;用于实现加密散列函数&#xff0c;即哈希函数。哈希函数能够将任意长度的数据转换为固定长度的哈希值&#xff0c;也称为散列值或数据指纹。这个哈希值通常用于数据的完整性校验、密码存储等场景。QCryptographi…

【数据结构】动态规划-基础篇

针对动态规划问题&#xff0c;我总结了以下5步&#xff1a; 确定dp数组以及下标的含义&#xff1b; 递推公式&#xff1b; dp数组如何初始化&#xff1b; 遍历顺序&#xff1b; 打印dp数组&#xff08;用来debug&#xff09;&#xff1b; 以上5步适用于任何动态规划问题&#x…

字符串函数和内存函数

字符串函数 1、strlcpy 【字符串拷贝】 &#xff08;将原字符串中的字符拷贝到目标字符数组中&#xff0c;包括终止符号\0&#xff0c;并在这里停止&#xff1b;为了避免越界&#xff0c;目标字符串数组应该足够大去接收&#xff09;&#x1f446; &#xff08;返回值是 dest…

Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录

前言 我这边一直用的electron-vue框架是基于electron 21版本的&#xff0c;electron 29版本追加了很多新功能&#xff0c;但是这些新功能对开发者不友好&#xff0c;对electron构建出来的软件&#xff0c;使用者更安全&#xff0c;所以&#xff0c;我暂时不想研究electron 29版…

ML 系列:第 39 节 - 估计方法:最大似然估计 (MLE)

目录 一、说明 二、什么是最大似然估计 (MLE)&#xff1f; 2.1 理解公式 2.2 MLE 的定义 2.3 我们何时使用 MLE&#xff1f; 三、结论 一、说明 在统计学领域&#xff0c;我们经常需要根据观察到的数据估计统计模型的参数。为此目的广泛使用的两种关键方法是最大似然估计 ( MLE…

文本生成类(机器翻译)系统评估

在机器翻译任务中常用评价指标&#xff1a;BLEU、ROGUE、METEOR、PPL。 这些指标的缺点&#xff1a;只能反应模型输出是否类似于测试文本。 BLUE&#xff08;Bilingual Evaluation Understudy&#xff09;&#xff1a;是用于评估模型生成的句子(candidate)和实际句子(referen…