秋招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.mzph.cn/news/871695.shtml

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

相关文章

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件&#xff1f;&#xff08;&#xff09; 训练文件&#xff1f;&#xff08;&#xff09; 模型文件&#xff1f;&#xff08;√&#xff09; 1.2 骨干网络与模块缝合 以Vision Transformer为例&#xff0c;模型文件里有很多类&#xff0c;我们只在最后…

嘉立创EDA隐藏地线或者

https://prodocs.lceda.cn/cn/pcb/side-panel-left-net/#%E9%A3%9E%E7%BA%BF

50+dfm模型素人网红路人实时直播替换DFLive模型dfm格式

作为一名直播达人&#xff0c;我投入了大量时间和精力在网上收集和购买各种直播所需的模型资源。这些资源不仅包括男模、女模&#xff0c;还有明星脸、大众脸、网红脸以及各类稀有的素人模型。为了回馈广大直播爱好者&#xff0c;我将这些宝贵资源整理成一个合集&#xff0c;供…

elasticsearch性能调优方法原理与实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

ROS1导航状态机与ROS2导航行为树

ROS1和ROS2导航框架中用到的各种底层算法基本相同&#xff0c;比如代价地图&#xff0c;全局路径规划和局部路径规划等&#xff0c;它们最大的不同在于整个系统框架设计。 一&#xff0c;ROS1 导航状态机 ROS1导航功能包move_base是一个状态机&#xff0c;从软件设计上来看&am…

sip协议栈简介

SIP协议栈简介 SIP协议栈流程 数据链路层&#xff1a;当SIP消息从网络中传输到达TCP/IP协议栈时&#xff0c;首先被接收到的是数据链路层的数据帧。数据链路层会对数据帧进行解封装&#xff0c;得到网络层的IP数据报。 网络层&#xff1a;网络层会对IP数据报进行解析&#xf…

【GDCPC2024】【min_25筛】J.另一个计数问题

题目 传送门 思路 考场上的思路和正解差远了&#xff0c;属实是反演学魔怔了。 首先&#xff0c;对于所有的 x x x&#xff0c;它可以通过 2 x 2x 2x 和 2 2 2 连通&#xff0c;而 2 2 2 又可以和所有 m i n p ≤ ⌊ n 2 ⌋ minp\leq \left\lfloor\frac{n}{2}\right\…

浏览器插件利器--allWebPluginV2.0.0.16-alpha版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持chrome、FireFo…

江协科技51单片机学习- p27 I2C AT24C02存储器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Wikijs 部署教程

以下是一个 Wikijs 部署的简单教程&#xff0c;涵盖了使用 Docker 和直接安装两种方式&#xff1a; 方法一&#xff1a; 使用 Docker (推荐) Docker 是一个方便快捷的方式来部署 Wikijs&#xff0c;它可以避免许多手动配置步骤。 安装 Docker: 按照 https://docs.docker.com/…

JRE、JVM、JDK分别是什么。

JDK JDK的英文全称是Java Development Kit。JDK是用于制作程序和Java应用程序的软件开发环境。JDK 是 Java 开发工具包&#xff0c;它是 Java 开发者用来编写、编译、调试和运行 Java 程序的集合。JDK 包括了 Java 编译器&#xff08;javac&#xff09;、Java 运行时环境&…

【已解决】如何在一篇笔记中呈现另一篇笔记的内容,hover editor插件?obsidian

问题 问题&#xff1a;【已解决】如何让一篇笔记内容在另一篇的笔记里呈现&#xff1f; - 疑问解答 - Obsidian 中文论坛 如何在一篇笔记里&#xff0c;在插入内链接时&#xff0c;同时展示内链接的笔记中的内容&#xff1f; 比如&#xff1a; 哲学是一门[[学问]]这篇笔记…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(3)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案&#xff08;第1批次&#xff09;&#xff08;3&#xff09; 第41题&#xff1a;在应用集成中&#xff0c;有多个组件帮助协调连接各种应用。其中&#xff08;&#xff09;利用特定的数据结构&#xff0c;帮助开发人…

电脑硬盘里的文件能保存多久?电脑硬盘文件突然没了怎么办

在数字化时代&#xff0c;电脑硬盘作为我们存储和访问数据的重要设备&#xff0c;承载着无数珍贵的回忆、工作成果和创意灵感。然而&#xff0c;硬盘里的文件能保存多久&#xff1f;当这些文件突然消失时&#xff0c;我们又该如何应对&#xff1f;本文将深入探讨这两个问题&…

13-《鸭跖草》

鸭跖草 鸭跖草&#xff0c;拉丁学名&#xff1a;&#xff08;Commelina communis&#xff09;&#xff0c;别名碧竹子、翠蝴蝶、淡竹叶等。属粉状胚乳目、鸭跖草科、鸭跖草属一年生披散草本。鸭跖草叶形为披针形至卵状披针形&#xff0c;叶序为互生&#xff0c;茎为匍匐茎&…

实验发现AI提高了个人创造力,但降低了整体创造力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【ingress-nginx】安装配置及Helm工具安装

【ingress-nginx】安装配置及Helm工具安装 安装时候需要用到一个工具——Helm【相当于linux中的yum工具】。 一&#xff0c;Helm安装 官网&#xff1a;https://helm.sh/docs/intro/install # 下载 wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz# 解压 tar -zxv…

【数据结构】初探数据结构面纱:栈和队列全面剖析

【数据结构】初探数据结构面纱&#xff1a;栈和队列全面剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;数据结构 文章目录 【数据结构】初探数据结构面纱&#xff1a;栈和队列全面剖析前言一.栈1.1栈的概念及结构1.2栈的结构选择1.3栈的…

Win10工具:批量word转png图片

首先声明这个小工具是小编本人开发的&#xff0c;无任何广告&#xff0c;会员收费机制等&#xff0c;永久使用。允许公司或个人使用&#xff0c;不允许倒卖&#xff0c;否则发现后会追究法律责任&#xff0c;毕竟开发不易。工具是用python开发的。 功能非常单一&#xff0c;就…

做过的试卷怎样才能去掉答案打印

对于做过的试卷&#xff0c;如想将其打印比较难以解决的困难就是“去除打印”。当然&#xff0c;目前应用上市场上也会有很多能够去除打印的应用软件&#xff0c;如“试卷擦除宝”这是一款专业的试卷擦除软件&#xff0c;能够擦除试卷上的手写笔迹&#xff0c;并将试卷转化为电…