秋招Java后端开发冲刺——MyBatisPlus总结

一、 基本知识

1. 介绍
yBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上增加了大量功能和简化操作,以提高开发效率。
2. 特点

  • 无侵入:只做增强不做改变,引入它不会对现有项目产生影响。
  • 依赖少:仅仅依赖 MyBatis 和 MyBatis-Spring。
  • 扩展性强:提供了丰富的插件机制,可以根据需求进行扩展。
  • 多种插件支持:分页插件、性能分析插件、数据权限插件等。
  • 全方位覆盖 CRUD 操作:提供了丰富的 CRUD 接口,简化了单表操作的代码编写。
  • 代码生成器:支持根据数据库表结构生成对应的实体类、Mapper 接口、Service 层代码。

3. MyBatis与MyBatisPlus

特性MyBatisMyBatis-Plus
入侵性低(对现有项目无影响,只做增强)
依赖性需要 MyBatis依赖 MyBatis 和 MyBatis-Spring
简化 CRUD 操作不提供,需要手动编写提供丰富的 CRUD 接口,自动生成单表 CRUD 代码
分页支持需要自行实现提供分页插件,开箱即用
动态 SQL需要手动编写动态 SQL提供更加简化的动态 SQL 支持
代码生成器不提供提供代码生成器,可根据数据库表生成实体类、Mapper、Service
逻辑删除不提供提供逻辑删除注解
自动填充不提供提供字段自动填充注解
拓展性通过插件实现提供丰富的内置插件,并支持自定义插件
性能分析不提供提供性能分析插件
字段验证需要手动实现提供校验插件
多租户支持需要手动实现提供多租户插件
热加载需要手动实现支持热加载,方便开发调试
SQL 执行效率分析不提供提供 SQL 执行效率分析插件
复杂 SQL 支持强,但通过条件构造器简化复杂 SQL
主键生成策略需要手动设置提供多种主键生成策略
性能

二、基本使用

1. 配置

  • 引入依赖:在 Maven 项目中,引入 MyBatis-Plus 依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
  • 配置文件:在 application.yml 或 application.properties 中配置数据源和 MyBatis-Plus
spring:datasource:url: jdbc:mysql://localhost:3306/mydatabaseusername: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath:/mapper/*.xmltype-aliases-package: com.example.entity

**2.注解 **
MyBatis-Plus通过反射获取实体类信息作为表数据信息。
(1)当实体类命名与数据库表一一对应时:

  • 类名转驼峰命名,作为表名
  • 名为id的变量作为表的主键
  • 成员变量转驼峰命名作为表的字段名
    (2)当实体类命名与数据库表不对应时使用注解
  • @TableName:用于指定表名
  • @TableId:指定主键字字段信息,可以指定IdType(auto、assigned_id、input)
  • @TableField:指定普通字段名及相关配置(如是否存在、类型handler等)

3. 基本使用CRUD
(1)创建与数据库表对应的实体类

package com.example.entity;import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;@Data
@TableName("users")
public class User {@TableId(value = "id", type = IdType.AUTO)private Long id;private String name;private String email;private Integer age;private String address;
}

(2)创建 Mapper 接口并继承 MyBatis-Plus 提供的 BaseMapper

package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {
}

(3) 创建 Service 接口和实现类

package com.example.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;public interface UserService extends IService<User> {
}
package com.example.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

(4)创建 Controller 类来处理请求,基础的增删改查直接调用basemapper里面的函数接口

package com.example.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.list();}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getById(id);}@PostMappingpublic void createUser(@RequestBody User user) {userService.save(user);}@PutMappingpublic void updateUser(@RequestBody User user) {userService.updateById(user);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable Long id) {userService.removeById(id);}
}

三、高级功能

(一). 条件构造器(Wrapper)
1. 介绍
条件构造器(Wrapper)是 MyBatis-Plus 提供的一个强大的工具,用于简化复杂查询的构造。它通过链式调用的方式生成 SQL 语句,支持多种条件组合。
2.常见方法

  • eq(String column, Object val):等于条件
  • ne(String column, Object val):不等于条件
  • gt(String column, Object val):大于条件
  • ge(String column, Object val):大于等于条件
  • lt(String column, Object val):小于条件
  • le(String column, Object val):小于等于条件
  • like(String column, Object val):模糊匹配
  • between(String column, Object val1, Object val2):范围匹配
  • in(String column, Collection<?> value):IN 查询
  • isNull(String column):字段为 NULL

3. 示例

// 查询名字为"John"且年龄大于等于18的用户
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John").ge("age", 18);
List<User> users = userMapper.selectList(queryWrapper);

4. Lamba表达式
尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码。

(二)自定义sql
1.介绍
MyBatis-Plus 支持在 Mapper 接口中自定义 SQL 语句,主要是处理那些条件构造器无法涵盖的复杂查询、批量操作等场景。

2. 实现方式
(1)XML 文件定义自定义 SQL

  • 定义
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper"><!-- 根据邮箱查询用户 --><select id="selectByEmail" resultType="com.example.entity.User">SELECT * FROM users WHERE email = #{email}</select><!-- 根据年龄范围查询用户 --><select id="selectByAgeRange" resultType="com.example.entity.User">SELECT * FROM users WHERE age BETWEEN #{minAge} AND #{maxAge}</select><!-- 批量插入用户 --><insert id="batchInsert">INSERT INTO users (name, email, age) VALUES<foreach collection="list" item="item" separator=",">(#{item.name}, #{item.email}, #{item.age})</foreach></insert>
</mapper>
  • 使用
// UserMapper.java
package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface UserMapper extends BaseMapper<User> {User selectByEmail(@Param("email") String email);List<User> selectByAgeRange(@Param("minAge") int minAge, @Param("maxAge") int maxAge);int batchInsert(@Param("list") List<User> users);
}

:@Param不要忘记

(2)使用注解定义自定义 SQL

// UserMapper.java
package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;public interface UserMapper extends BaseMapper<User> {@Select("SELECT * FROM users WHERE email = #{email}")User selectByEmail(@Param("email") String email);@Select("SELECT * FROM users WHERE age BETWEEN #{minAge} AND #{maxAge}")List<User> selectByAgeRange(@Param("minAge") int minAge, @Param("maxAge") int maxAge);@Insert({"<script>","INSERT INTO users (name, email, age) VALUES ","<foreach collection='list' item='item' separator=','>","(#{item.name}, #{item.email}, #{item.age})","</foreach>","</script>"})int batchInsert(@Param("list") List<User> users);
}

(3)结合条件构造器与自定义 SQL(将指定id的用户的余额减少200)

  • service实现类:基于Wrapper构建where条件
List<Long> ids = List.of( 1L,2L,4L);int amount = 200;
//1.构建条件
LambdaQuerywrapper<User> wrapper = new LambdaQuerywrapper<User>( ) .in(User::getId,ids); / 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount) ;
  • mapper接口:在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
void updateBalanceByIds (@Param("ew") LambdaQueryWwrapperUser> wrapper,@eParam(" amount") int amount);
  • xml映射文件:自定义SQL,并使用Wrapper条件
<update id="updateBalanceByIds">
UPDATE tb_user SET balance - balance - #{amount]${ew.customSqlSegment}</ update>

(三)service接口
1. 介绍

  • MyBatis-Plus 提供了 IService 接口和 ServiceImpl 基类,极大地简化了 Service 层的开发。
  • 使用时只需要定义一个service接口继承 IService 接口,相应的实现类继承 ServiceImpl 基类
    在这里插入图片描述
    2. 核心功能
  • 创建 Service 接口和实现类
    接口:
package com.example.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;public interface UserService extends IService<User> {
}

实现类:

package com.example.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
  • 使用
package com.example.controller;import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;// 增加用户@PostMappingpublic boolean addUser(@RequestBody User user) {return userService.save(user);}// 根据ID删除用户@DeleteMapping("/{id}")public boolean deleteUser(@PathVariable Long id) {return userService.removeById(id);}// 更新用户信息@PutMappingpublic boolean updateUser(@RequestBody User user) {return userService.updateById(user);}// 根据ID查询用户@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getById(id);}// 查询所有用户@GetMappingpublic List<User> getAllUsers() {return userService.list();}
}

:简单的增删改查直接在servi接口调用方法可以,复杂的需要逻辑判断的功能需要在service实现类中自己处理逻辑

(四)MyBatisPlus扩展功能
(1)代码生成器
使用插件生成和数据库表对应的代码,包括controller、service、serviceimpl等。
(2)逻辑删除

  • MyatstPus提供了逻辑盯赊功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。只需要在application.yaml文件中配置逻辑删除的字段名称和值即可
mybatis-plus:global-config:db-config:logic-delete-field: flag # 全局逻辑删除的实体字段名,字段类型可以是    boolean、integerlogic-delete-value: 1 #逻辑已删除值(默认为1)logic-not-delete-value: 0#逻辑未删除值(默认为0)
  • 然后,在实体类中添加逻辑删除字段,并使用 @TableLogic 注解标识。
package com.example.entity;import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Long id;private String name;private Integer age;@TableLogic // 标记逻辑删除字段@TableField(value = "is_deleted", fill = FieldFill.INSERT) // 指定逻辑删除字段名和填充策略private Integer deleted;
}

(3)枚举处理器
MyBatis-Plus 支持枚举类型的处理,可以将数据库中的枚举值和实体类中的枚举类型进行映射。

  • 在yml中配置
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
  • PO类中的枚举类型变量与数据库字段的转换:给枚举中的与数据库对应value值添加@EnumValue注解
public enum UserStatus {ACTIVE(1, "Active"),INACTIVE(2, "Inactive");@EnumValueprivate final int code;private final String label;UserStatus(int code, String label) {this.code = code;this.label = label;}

(4)Json处理器
当数据库存储了Json格式的数据时,需要进行JSON 数据与Java 对象中之间的映射

  • 数据库表对应的实体类上配置autoResultMap = true
  • 对应实体类中对应字段配置:@TableFiled(typeHandler=JacksonTypeHandler.calss)
    :JSON类型数据的处理无法进行全局配置,只能在每一个变量上使用@TableFiled进行配置
Data
@TableName(“user”,autoResultMap = true)
public class User{
private Long id;
private String username ;
@TaTableField(typeHandler = JacksonTypeHandler.class)
private UserInfo info ;
}

(5)全局分页插件
1. 配置分页插件属性

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.dialects.MySqlDialect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor () {
// 1.初始化核心插件
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//2添加分页插件
PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType .MYsQL);pageInterceptor.setMaxLimit( 1000L);//设置分页上限
interceptor.addInnerInterceptor(pageInterceptor) ;
return interceptor;
}

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

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

相关文章

谈谈软件交互设计

谈谈软件交互设计 交互设计的由来 交互设计(Interaction Design)这一概念,最初是由IDEO创始人之一Bill.Moggridge(莫格里奇)1984年在一次会议上提出。他设计了世界上第一台笔记本电脑Compass,并写作出版了在交互设计领域影响深远的《Designing Interactions》一书,被称…

mqtt.fx连接阿里云

本文主要是记述一下如何使用mqtt.fx连接在阿里云上创建好的MQTT服务。 1 根据MQTT填写对应端口即可 找到设备信息&#xff0c;里面有MQTT连接参数 2 使用物模型通信Topic&#xff0c;注意这里的post说设备上报&#xff0c;那也就是意味着云端订阅post&#xff1b;set则意味着设…

Linux内核编译安装 - Deepin,Debian系

为什么要自己编译内核 优点 定制化&#xff1a;你可以根据自己的硬件和需求配置内核&#xff0c;去掉不必要的模块&#xff0c;优化性能。性能优化&#xff1a;移除不需要的驱动程序和特性&#xff0c;减小内核体积&#xff0c;提高系统性能。最新特性和修复&#xff1a;获取…

【密码学】从有限状态自动机到密钥流生成器

本文是对流密码内容的拓展&#xff0c;在流密码中种子密钥通过一个伪随机数生成器产生一个与明文等长的伪随机密钥流。而本文的内容就是在回答这样两个问题&#xff1a; 伪随机密钥流是如何生成的&#xff1f;流密码、流密钥生成器和有限状态自动机之间是什么关系&#xff1f;…

Mac和VirtualBox Ubuntu共享文件夹

1、VirtualBox中点击设置->共享文件夹 2、设置共享文件夹路径和名称&#xff08;重点来了&#xff1a;共享文件夹名称&#xff09; 3、保存设置后重启虚拟机&#xff0c;执行下面的命令 sudo mkdir /mnt/share sudo mount -t vboxsf share /mnt/share/ 注&#xff1a;shar…

Gitea 仓库事件触发Jenkins远程构建

文章目录 引言I Gitea 仓库事件触发Jenkins远程构建1.1 Jenkins配置1.2 Gitea 配置引言 应用场景:项目部署 I Gitea 仓库事件触发Jenkins远程构建 Gitea支持用于仓库事件的Webhooks 1.1 Jenkins配置 高版本Jenkins需要关闭跨域限制和开启匿名用户访问 在Jenkins启动前加入…

东软“引战”国家队 通用技术“补链”大国重器

向来低调温和的东软创始人刘积仁&#xff0c;这一次抛出了“王炸”级的资产交易。 7月3日&#xff0c;《多肽链》获得一则足以引爆国内医疗设备行业的投资信息&#xff1a;被东软集团视为核心资产、掌上明珠的东软医疗&#xff0c;成功引入通用技术集团资本有限公司与中国国有…

华为配置蓝牙终端定位实验

个人主页&#xff1a;知孤云出岫 目录 配置蓝牙终端定位示例 业务需求 组网需求 数据规划 配置思路 配置注意事项 操作步骤 配置文件 配置蓝牙终端定位示例 组网图形 图1 配置蓝牙终端定位示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业…

用HTML和CSS实现提示工具(tooltip)及HTML元素的定位

所谓提示工具&#xff0c;是指将鼠标移动到某个HTML元素&#xff08;工具&#xff09;时会显示一些提示内容&#xff08;提示文本&#xff09;&#xff0c;而鼠标移出工具元素的范围时提示文本就消失了。考虑到提示文本元素应当在鼠标进入工具元素时显示&#xff0c;鼠标离开工…

【VS2019】安装下载库HtmlAgilityPack,可解析 HTML (图文详情)

目录 0.背景 1.环境 2.详细步骤 0.背景 项目需要&#xff0c;搭建WCF服务&#xff0c;需求是输入一个string类型字符串&#xff08;网页代码&#xff0c;如<html><body><p>Hello, <b>World</b>!</p></body></html>&#xf…

《代理选择与反爬虫策略探究:如何优化网络爬虫效率与稳定性》

代理IP如何选以及常见反爬策略 为什么需要代理&#xff1f; 因为有的网站会封IP&#xff0c;用户如果没有登录&#xff0c;那IP就是身份标识&#xff0c;如果网站发现用户行为异常就非常可能封IP 什么是代理IP 就是让一个人帮你转交请求&#xff0c;帮你转交的人对面不熟&a…

<数据集>猫狗识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3686张 标注数量(xml文件个数)&#xff1a;3686 标注数量(txt文件个数)&#xff1a;3686 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cat, dog] 序号类别名称图片数框数1cat118811892dog24982498 使用标…

vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容

1. 虚拟机先扩容 1.1 关机&#xff0c;并点击系统&#xff0c;让他是点选状态&#xff0c;但是没开机 1.2 右击&#xff0c;点击最下方设置&#xff0c;点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小&#xff0c;数字为总大小 完成提示&#xff1a; 磁盘已成功扩展。您…

整洁架构SOLID-接口隔离原则(ISP)

文章目录 定义ISP与编程语言ISP与软件架构小结 定义 在上图中有多个用户需要操作OPS类。现在&#xff0c;我们假设这里的User1只需要使用op1,User2只需要使用op2,User3只需要使用op3。 在这种情况下&#xff0c;如果OPS类是用Java编程语言编写的&#xff0c;那么很明显&#x…

安全防御实验2

一、实验拓扑 二、实验要求 办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c;办公区…

electron + express 实现 vue 项目客户端部署

写在前面 作为一个前端程序员&#xff0c;如何实现从前端到客户端的跨越&#xff0c;可能是一个很难实现的事。但客户需求千奇百怪&#xff0c;偶尔遇到一个非要客户端的&#xff0c;如何应对&#xff1f; 那Electron可能真是你福音。具体它有哪些功能&#xff0c;可自行官网…

《斯科特·凯尔比的风光摄影手册》读书笔记

写在前面 《斯科特凯尔比的风光摄影手册》读书笔记整理没有全部读完&#xff0c;选择了感兴趣的章节理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完事情&#xff0c;…

2-33 基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化

基于matlab的用于计算无故障的斜齿轮对啮合时接触线长度随时间的变化&#xff0c;根据需求设置斜齿轮对的相应参数&#xff0c;得到结果。程序已调通&#xff0c;可直接运行。 2-33 斜齿轮对啮合时接触线长度 齿轮参数 - 小红书 (xiaohongshu.com)

MongoDB - 查询操作符:比较查询、逻辑查询、元素查询、数组查询

文章目录 1. 构造数据2. MongoDB 比较查询操作符1. $eq 等于1.1 等于指定值1.2 嵌入式文档中的字段等于某个值1.3 数组元素等于某个值1.4 数组元素等于数组值 2. $ne 不等于3. $gt 大于3.1 匹配文档字段3.2 根据嵌入式文档字段执行更新 4. $gte 大于等于5. $lt 小于6. $lte 小于…

RocketMQ~架构了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统&#xff0c;由阿里巴巴团队开发&#xff0c;在 2016 年底贡献给 Apache&#xff0c;成为了 Apache 的一个顶级项目。 在阿里内部&#xff0c;RocketMQ 很好地服务了集…