秋招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/mydatabase
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml
  type-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 {

    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAllUsers() {
        return userService.list();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.save(user);
    }

    @PutMapping
    public 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 {

    @Autowired
    private UserService userService;

    // 增加用户
    @PostMapping
    public boolean addUser(@RequestBody User user) {
        return userService.save(user);
    }

    // 根据ID删除用户
    @DeleteMapping("/{id}")
    public boolean deleteUser(@PathVariable Long id) {
        return userService.removeById(id);
    }

    // 更新用户信息
    @PutMapping
    public boolean updateUser(@RequestBody User user) {
        return userService.updateById(user);
    }

    // 根据ID查询用户
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getById(id);
    }

    // 查询所有用户
    @GetMapping
    public 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、integer
	  logic-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");
    @EnumValue
    private 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.mfbz.cn/a/797227.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

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

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

NAT地址转换+多出口智能选路,附加实验内容

本章主要讲&#xff1a;基于目标IP、双向地址的转换 注意&#xff1a;基于目标NAT进行转换 ---基于目标IP进行地址转换一般是应用在服务器端口映射&#xff1b; NAT的基础知识 1、服务器映射 服务器映射是基于目标端口进行转换&#xff0c;同时端口号也可以进行修改&…

力扣每日一题:3011. 判断一个数组是否可以变为有序

力扣官网&#xff1a;前往作答&#xff01;&#xff01;&#xff01;&#xff01; 今日份每日一题&#xff1a; 题目要求&#xff1a; 给你一个下标从 0 开始且全是 正 整数的数组 nums 。 一次 操作 中&#xff0c;如果两个 相邻 元素在二进制下数位为 1 的数目 相同 &…

Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用

Dot&#xff1a;指代点对象或者表示点的符号。Arrow&#xff1a;指代箭头对象&#xff0c;包括直线上的箭头或者向量箭头等。NumberPlane&#xff1a;指代数轴平面对象&#xff0c;在Manim中用来创建包含坐标轴的数学坐标系平面。Text&#xff1a;指代文本对象&#xff0c;用来…

WEB前端02-HTML5基础(02)

7.表格标签 在基本表格结构中&#xff0c;表格标题、项目表头和数据资料构成了表格基本结构三个要素。 table标签&#xff1a;定义表格整体 <caption>我的标题</caption>&#xff1a;表格的标题tr标签&#xff1a;定义表格的行 height&#xff1a;设置行的高度…

探索 Prompt 的世界:让你的 AI 更智能

探索 Prompt 的世界&#xff1a;让你的 AI 更智能 引言什么是 Prompt&#xff1f;Prompt 的重要性如何编写有效的 Prompt1. 清晰明确2. 包含关键细节3. 提供上下文 实践中的 Prompt 技巧1. 多次迭代2. 实验不同风格3. 结合实际应用 总结 引言 随着人工智能&#xff08;AI&…

卸载wps office的几种方法收录

​ 第一种方法: 1.打开【任务管理器】&#xff0c;找到相关程序&#xff0c;点击【结束任务】。任务管理器可以通过左下角搜索找到。 2.点击【开始】&#xff0d;【设置】&#xff0d;【应用】&#xff0d;下拉找到WPS应用&#xff0c;右键卸载&#xff0c;不保留软件配置 …

Java 设计模式系列:解释器模式

简介 解释器模式是一种行为型设计模式&#xff0c;它提供了一种构建抽象语法树的机制&#xff0c;并定义了如何解释这棵树。解释器模式属于编译原理中的语法制导翻译的范畴。 如上图&#xff0c;设计一个软件用来进行加减计算。我们第一想法就是使用工具类&#xff0c;提供对应…

【微信小程序知识点】getApp()全局数据共享,页面间通信,组件间通信

getApp()-全局数据共享 在小程序中&#xff0c;可以通过getApp()方法获取到小程序全局唯一的App实例。因此在App()方法中添加全局共享的数据&#xff0c;方法&#xff0c;从而实现页面&#xff0c;组件的数据传值。 // app.js App({//全局共享的数据globalData: {token: &qu…

prompt第二讲-langchain实现中英翻译助手

文章目录 prompt模板 (prompt template)langchain 中的prompt模板 (prompt template)langchain实现中英翻译助手 prompt模板 (prompt template) 开篇我介绍了在llm中&#xff0c;通常输入的那个字符串会被我们称之为prompt&#xff0c;下面就是一个中英文翻译助手的prompt例子…

从“Hello,World”谈起(C++入门)

前言 c的发展史及c能干什么不能干什么不是我们今天的重点&#xff0c;不在这里展开&#xff0c;有兴趣的朋友可以自行查阅相关资料。今天我们主要是围绕c的入门程序&#xff0c;写一个“hello&#xff0c;world”&#xff0c;并且围绕这个入门程序简单介绍一下c和c的一些语法&…

windows USB 设备驱动开发-USB 功能控制器驱动开发(二)

USB 功能客户端驱动程序使用的 UFX 对象和句柄 USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 重要的 API UfxDeviceCreateUfxEndpointCreate USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 这些对象是 WDF 对…

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架&#xff0c;支持所有主要操作系统&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写&#xff0c;包括计算机视觉、几何、媒体处理、网络和渲染&#x…

sentinel源码分析: dashboard与微服务的交互、pull模式持久化

文章目录 原始方式微服务端规则如何保存规则如何加载进内存微服务端接收控制台请求控制台推送规则总结 pull拉模式官方demo如何整合Spring Cloud整合Spring Cloud 前置知识 SentinelResource的实现原理、SphU.entry()方法中ProcessorSlotChain链、entry.exit() 建议先会使用se…

鸿蒙系统在服装RFID管理中的应用:打造智能零售新时代

​随着物联网技术的迅速发展&#xff0c;服装零售行业正面临着新的变革与挑战。鸿蒙系统作为新一代智能操作系统&#xff0c;结合RFID技术&#xff0c;为服装行业提供了高效、智能的管理解决方案。常达智能物联&#xff0c;作为RFID技术的领先企业&#xff0c;致力于将鸿蒙系统…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)

7-1、2、3 IPFS介绍使用及浏览器交互&#xff08;react区块链实战&#xff09; 7-1 ipfs介绍7-2 IPFS-desktop使用7-3 reactipfs-api浏览器和ipfs交互 7-1 ipfs介绍 IPFS区块链上的文件系统 https://ipfs.io/ 这个网站本身是需要科学上网的 Ipfs是点对点的分布式系统 无限…

如何在 Android Studio 中导出并在 IntelliJ IDEA 中查看应用的 SQLite 数据库

在 Android 应用开发过程中&#xff0c;调试和查看应用内的数据库内容是常见的需求。本文将介绍如何使用 Android Studio 导出应用的 SQLite 数据库&#xff0c;并在 IntelliJ IDEA 中查看该数据库。 步骤一&#xff1a;在设备上运行您的应用 首先&#xff0c;确保您的应用已…

5G-A通感融合赋能低空经济-RedCap芯片在无人机中的应用

1. 引言 随着低空经济的迅速崛起&#xff0c;无人机在物流、巡检、农业等多个领域的应用日益广泛。低空飞行器的高效、安全通信成为制约低空经济发展的关键技术瓶颈。5G-A通感一体化技术通过整合通信与感知功能&#xff0c;为低空网络提供了强大的技术支持。本文探讨了5G-A通感…