MyBatisPlus基础功能使用

news2025/1/31 3:04:32

文章目录

  • MyBatisPlus基础功能
    • CRUD
      • BaseMapper
      • ServiceImpl
    • 条件构造器
    • 注解一对多、多对一映射

MyBatisPlus基础功能

CRUD

BaseMapper

BaseMapper 接口是 MyBatis-Plus 提供的一个基础 Mapper 接口,它定义了一系列的通用数据库操作方法,包括插入、更新、删除和查询等。通过继承 BaseMapper,我们可以直接使用其中定义的方法来执行数据库操作,无需编写繁琐的 SQL 语句和 XML 映射文件。BaseMapper 封装了底层的数据库访问逻辑,提供了一种更简洁和方便的方式来进行 CRUD 操作。
MyBatis-Plus 提供了基础的 CRUD(增删改查)操作,通过继承 BaseMapper 接口,可以直接使用 MyBatis-Plus 提供的方法来执行数据库的增删改查操作,无需编写繁琐的 SQL 语句和 XML 映射文件。以下是 MyBatis-Plus 的基础 CRUD 操作示例:

  1. 定义实体类和 Mapper 接口:
@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String username;
    private String email;
}

public interface UserMapper extends BaseMapper<User> {}
  1. 插入数据:
@Autowired
private UserMapper userMapper;

public void insertUser(User user) {
    userMapper.insert(user);
}

通过调用 userMapper.insert(user) 方法可以插入一条数据到数据库中。

  1. 根据主键查询数据:
public User getUserById(Long id) {
    return userMapper.selectById(id);
}

通过调用 userMapper.selectById(id) 方法可以根据主键查询对应的数据。

  1. 更新数据:
public void updateUser(User user) {
    userMapper.updateById(user);
}

通过调用 userMapper.updateById(user) 方法可以根据主键更新对应的数据。

  1. 删除数据:
public void deleteUserById(Long id) {
    userMapper.deleteById(id);
}

通过调用 userMapper.deleteById(id) 方法可以根据主键删除对应的数据。

这些示例展示了 MyBatis-Plus 的基础 CRUD 操作。通过继承 BaseMapper 接口,我们可以直接使用其中的方法来执行数据库的增删改查操作,无需手动编写 SQL 语句和 XML 映射文件,简化了开发过程。
这是BaseMapper接口内部的提供的crud的方法

/**
 * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
 * <p>这个 Mapper 支持 id 泛型</p>
 *
 * @author hubin
 * @since 2016-01-23
 */
public interface BaseMapper<T> extends Mapper<T> {

    /**
     * 插入一条记录
     *
     * @param entity 实体对象
     */
    int insert(T entity);

    /**
     * 根据 ID 删除
     *
     * @param id 主键ID
     */
    int deleteById(Serializable id);

    /**
     * 根据 columnMap 条件,删除记录
     *
     * @param columnMap 表字段 map 对象
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,删除记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 删除(根据ID 批量删除)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 根据 ID 修改
     *
     * @param entity 实体对象
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    T selectById(Serializable id);

    /**
     * 查询(根据ID 批量查询)
     *
     * @param idList 主键ID列表(不能为 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * 查询(根据 columnMap 条件)
     *
     * @param columnMap 表字段 map 对象
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * 根据 entity 条件,查询一条记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询总记录数
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录
     * <p>注意: 只返回第一个字段的值</p>
     *
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 entity 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
     * @param queryWrapper 实体对象封装操作类(可以为 null)
     */
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * 根据 Wrapper 条件,查询全部记录(并翻页)
     *
     * @param page         分页查询条件
     * @param queryWrapper 实体对象封装操作类
     */
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

ServiceImpl

ServiceImpl 则是在 BaseMapper 的基础上进一步封装的一个抽象类,用于实现 Service 层的基本操作。它提供了一系列的方法来执行数据库的增删改查操作,包括插入、更新、删除、查询等。通过继承 ServiceImpl,我们可以直接使用其中的方法来进行数据库操作,无需手动编写常见的数据库操作方法。ServiceImpl 进一步简化了 Service 层的代码编写,提高了开发效率。
ServiceImpl 是 MyBatis-Plus 提供的一个抽象类,用于实现 Service 层的基本操作。下面是 ServiceImpl 的使用方式:

  1. 创建实体类和 Mapper 接口:

    @Data
    @TableName("user")
    public class User {
        @TableId
        private Long id;
        private String username;
        private String email;
    }
    
    public interface UserMapper extends BaseMapper<User> {
    }
    
  2. 创建 Service 接口和实现类,并继承 ServiceImpl

    public interface UserService {
        void saveUser(User user);
        User getUserById(Long id);
        void updateUser(User user);
        void deleteUserById(Long id);
    }
    
    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
        @Override
        public void saveUser(User user) {
            this.save(user);
        }
    
        @Override
        public User getUserById(Long id) {
            return this.getById(id);
        }
    
        @Override
        public void updateUser(User user) {
            this.updateById(user);
        }
    
        @Override
        public void deleteUserById(Long id) {
            this.removeById(id);
        }
    }
    

    UserServiceImpl 中,通过继承 ServiceImpl<UserMapper, User>,我们可以直接使用 ServiceImpl 中封装的方法来执行数据库操作,无需手动编写常见的数据库操作方法。例如,通过调用 this.save(user) 可以插入一条数据,通过调用 this.getById(id) 可以根据主键查询数据。

    注意,要确保在 ServiceImpl 的泛型参数中传入正确的类型,第一个参数是 Mapper 接口,第二个参数是实体类类型。

  3. 在其他层或组件中注入并使用 Service:

    @RestController
    public class UserController {
        @Autowired
        private UserService userService;
    
        @PostMapping("/users")
        public void saveUser(@RequestBody User user) {
            userService.saveUser(user);
        }
    
        @GetMapping("/users/{id}")
        public User getUserById(@PathVariable Long id) {
            return userService.getUserById(id);
        }
    
        // 其他接口和方法
    }
    

    在上述代码中,我们可以通过注入 UserService 来使用其中定义的方法。例如,调用 userService.saveUser(user) 可以保存一个用户,调用 userService.getUserById(id) 可以根据用户ID查询用户。

通过继承 ServiceImpl,我们可以使用其中封装好的方法来执行数据库操作,无需手动编写常见的数据库操作方法,简化了代码的编写过程,提高了开发效率。同时,我们可以根据具体业务需求在 ServiceImpl 的基础上添加自定义的方法,实现更复杂的业务逻辑。

在这里插入图片描述
BaseMapper 和 ServiceImpl 都是对 MyBatis-Plus 的 CRUD 操作进行了封装。

条件构造器

条件构造器(Wrapper)在 MyBatis-Plus 中按照功能和用途可以分为三种类型:QueryWrapper、UpdateWrapper 和 LambdaQueryWrapper。下面将对每种类型进行分类说明,并展示其使用方式。

  1. QueryWrapper:
    QueryWrapper 用于构建查询条件,适用于 SELECT 操作。

    示例代码:

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "John")  // 等于条件
                .ne("age", 25)  // 不等于条件
                .like("email", "@gmail.com")  // 模糊匹配条件
                .between("age", 20, 30)  // 范围查询条件
                .orderByAsc("age");  // 排序条件
    
    List<User> userList = userMapper.selectList(queryWrapper);
    
  2. UpdateWrapper:
    UpdateWrapper 用于构建更新条件,适用于 UPDATE 操作。

    示例代码:

    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.set("email", "new_email@gmail.com")  // 设置更新字段
                 .eq("name", "John")  // 等于条件
                 .ne("age", 25);  // 不等于条件
    
    int affectedRows = userMapper.update(null, updateWrapper);
    
  3. LambdaQueryWrapper:
    LambdaQueryWrapper 是基于 Lambda 表达式的条件构造器,提供了更加类型安全的查询方式。

    示例代码:

    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.eq(User::getName, "John")  // 等于条件
                      .ne(User::getAge, 25)  // 不等于条件
                      .likeRight(User::getEmail, "@gmail.com")  // 模糊匹配条件,右侧模糊匹配
                      .between(User::getAge, 20, 30)  // 范围查询条件
                      .orderByAsc(User::getAge);  // 排序条件
    
    List<User> userList = userMapper.selectList(lambdaQueryWrapper);
    

通过选择合适的条件构造器类型,我们可以根据具体的操作类型和需求,灵活地构建查询条件或更新条件。这些条件构造器提供了丰富的方法来支持各种条件的组合和操作符的使用,使得查询条件或更新条件的编写更加简洁和易于理解。通过链式调用方法,我们可以便捷地构建复杂的条件,并通过相应的 MyBatis-Plus 方法来执行数据库操作。

注解一对多、多对一映射

使用 @Select@Results 注解可以实现一对多和多对一的映射查询。下面分别介绍如何使用这两个注解实现一对多和多对一的映射查询:

一对多关系映射查询示例(以用户和订单为例):

  1. 定义实体类 User 和 Order:
@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String username;
    @TableField(exist = false)
    private List<Order> orders;
}

@Data
@TableName("order")
public class Order {
    @TableId
    private Long id;
    private String orderNo;
    private Long userId;
}
  1. 在 UserMapper 中定义查询方法,并使用 @Select 注解编写查询 SQL,并使用 @Results 注解指定映射关系:
@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT u.*, o.id AS order_id, o.order_no FROM user u " +
            "LEFT JOIN `order` o ON u.id = o.user_id " +
            "WHERE u.id = #{userId}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "username", column = "username"),
            @Result(property = "orders", column = "id", javaType = List.class, /* 这里的id是要传递给下面查询里需要的参数,对应的是上面@Select注解中SQL查询出的user表的id,而这个id对应的是order表中的userID,传递到下面要调用的selectByUserId方法需要的userId参数*/,
                    many = @Many(select = "com.example.mapper.OrderMapper.selectByUserId"))
    })
    User selectUserWithOrders(@Param("userId") Long userId);
}

@Mapper
public interface OrderMapper extends BaseMapper<Order> {
    @Select("SELECT * FROM `order` WHERE user_id = #{userId}")
    List<Order> selectByUserId(@Param("userId") Long userId);
}

@Results 注解中,通过 @Result 注解指定实体类属性和数据库列之间的映射关系。其中,@Result 注解中的 property 属性指定实体类中的属性名,column 属性指定数据库查询结果集中的列名。在 @Result 注解中使用 @Many 注解指定一对多关系中多的一方的查询方法。

多对一关系映射查询示例(以订单和用户为例):

  1. 定义实体类 Order 和 User:
@Data
@TableName("order")
public class Order {
    @TableId
    private Long id;
    private String orderNo;
    private Long userId;
    @TableField(exist = false)
    private User user;
}

@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String username;
}
  1. 在 OrderMapper 中定义查询方法,并使用 @Select 注解编写查询 SQL,并使用 @Results 注解指定映射关系:
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
    @Select("SELECT o.*, u.id AS user_id, u.username FROM `order` o " +
            "LEFT JOIN user u ON o.user_id = u.id " +
            "WHERE o.id = #{orderId}")
    @Results({
            @Result(property = "id", column = "id"),
            @Result(property = "orderNo", column = "order_no"),
            @Result(property = "user", column

 = "user_id",
                    one = @One(select = "com.example.mapper.UserMapper.selectById"))
    })
    Order selectOrderWithUser(@Param("orderId") Long orderId);
}

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user WHERE id = #{userId}")
    User selectById(@Param("userId") Long userId);
}

@Results 注解中,通过 @Result 注解指定实体类属性和数据库列之间的映射关系。其中,@Result 注解中的 property 属性指定实体类中的属性名,column 属性指定数据库查询结果集中的列名。在 @Result 注解中使用 @One 注解指定多对一关系中一的一方的查询方法。

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

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

相关文章

项目——学生信息管理系统7

目录 学生选课功能的介绍 把 课程的数据库表创建出来 创建实体类 创建添加课程页面 AddCourseFrm&#xff0c;注意创建成JInternalFrame类型 页面制作&#xff0c;具体参照之前的 回到 MainFrm 添加课程管理菜单项 给添加课程按钮绑定事件 回到AddCourseFrm 页面 1. 把…

JSON百科全书:学习JSON看这一篇就够了

目录 1.1 JSON 简介 1.1.1 什么是 JSON 1.1.2 JSON 的特点 1.2 JSON 语法 1.2.1 JSON 键/值对 1.2.2 JSON 字符串 1.2.3 JSON 数值 1.2.4 JSON 对象 1.2.5 JSON 数组 1.2.6 JSON 布尔值 1.2.7 JSON null 1.2.8 JSON 文件 1.3 JSON 对象 1.3.1 访问对象的值 1.3…

7DGroup性能实施项目日记7

九月廿五 壬寅年 虎 庚戌月 丙午日 从昨天的场景执行和结果分析来看&#xff0c;效果有一些。今天我们又换了一个接口&#xff0c;看看有什么新问题。 从我的 RESAR 性能工程的逻辑上来看&#xff0c;现在是在基准场景执行的阶段。在这个阶段就是要把每个接口都单独压到最大tp…

大数据开发之Hive案例篇14:某个节点HDFS块比较多

文章目录 一. 问题描述二. 解决方案2.1 查看节点安装的组件2.2 排查HDFS配置2.3 排查Yarn配置2.3.1 首先查看下nodemanager的日志2.3.2 查看container分配情况2.3.3 查看调度机制2.3.4 查看集群任务情况2.3.5 集群负载情况2.3.6 resourcemanager与nodemanager是否可以混合部署 …

基于Springboot的在线竞拍系统(拍卖系统)

今天给大家带来了一个在线竞拍(拍卖)系统&#xff08;带设计报告&#xff09;&#xff0c;项目功能完善。 用户功能 包括沙箱支付宝支付&#xff0c;在线竞拍&#xff0c;收藏管理&#xff0c;个人资料管理&#xff0c;竞拍管理等等。 机构功能 包括&#xff0c;上传竞拍项目…

springboot球赛管理小程序

球赛管理系统 springboot球赛管理系统小程序 java球赛管理小程序 技术&#xff1a; 基于springbootvue小程序球赛管理系统的设计与实现 运行环境&#xff1a; JAVA版本&#xff1a;JDK1.8 IDE类型&#xff1a;IDEA、Eclipse都可运行 数据库类型&#xff1a;MySql&#xff08;…

优盘无法识别?恢复U盘数据就这样做!

到底是怎么回事呢&#xff1f;我的优盘用得好好的&#xff0c;突然就无法识别了。优盘里有对我很重要的数据&#xff0c;这些数据还能找回来吗&#xff1f;希望大家帮帮我&#xff01; 优盘作为常用的便携式存储设备。为我们随时随地保存数据提供了很大的便利。我们可以利用u盘…

C++并发编程之玩转condition_variable

C并发编程之玩转condition_variable 0.导语 最近在看并发编程相关的代码&#xff0c;自己顺手从0开始写了个小项目玩转并发场景下的生产消费者模型&#xff0c;如果你想提高多线程编程方面的能力&#xff0c;想熟练掌握condition_variable的使用&#xff0c;甚至想在面试当中凸…

Go 语言精进之路——Go 中常见并发模式总结

文章目录 前言创建模式退出模式分离模式join 模式notify-and-wait模式退出模式的应用 管道模式扇出与扇入模式 超时与取消模式 前言 在语言层面&#xff0c;Go针对CSP模型提供了三种并发原语。 goroutine&#xff1a;对应CSP模型中的P&#xff0c;封装了数据的处理逻辑&#x…

数字化赋能大健康实体行业迈入发展新阶段,大健康招商加盟系统优势有哪些?

数字经济的发展&#xff0c;正推动大健康实体行业迈入高质量发展新阶段。大健康实体行业应如何在数字化浪潮中抢占先机&#xff1f;大健康实体行业招商加盟平台应如何开发设计&#xff0c;才能帮助大健康企业主取得营收突破&#xff1f; 围绕蚓链大健康招商加盟系统&#xff0c…

ppt制作相关内容小结

ppt制作是天大的事&#xff01;是讲清一件事&#xff0c;表达自己的最好方式 1.删除ppt中的所有备注信息2.ppt制作中的快捷键3.精美的ppt收集 这里还是要提醒自己一下&#xff0c;做好ppt是外在的事情&#xff0c;把道理吃透才是根本&#xff01; 但是ppt外在也是表达的一种方式…

闭包实现函数柯里化,js实现

闭包实现函数柯里化&#xff0c;js实现 函数柯里化定义代码实现 函数柯里化定义 柯里化&#xff08;Currying&#xff09;是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数&#xff0c;并且返回接受余下的参数且返回结果的新函数的技术 即函数可以接…

.NET 8 Preview 4 中的 ASP.NET Core 更新

作者&#xff1a;Daniel Roth - Principal Program Manager, ASP.NET 翻译&#xff1a;Alan Wang 排版&#xff1a;Alan Wang .NET 8 Preview 4 现已可用&#xff0c;并包括了许多对 ASP.NET Core 的新改进。 以下是本预览版本中的新内容摘要&#xff1a; Blazor 使用 Blazor …

图片:前端展示图像(img 、picture、svg、canvas )及常用图片格式(PNG、JPG、JPEG、WebP、GIF、SVG、AVIF等)

一、浏览器网页展示图片方法 1.1、HTML <img> 标签 <!DOCTYPE html> <html><head><title>图片展示</title></head><body><h1>图片展示</h1><img src"example.jpg" alt"Example Image" w…

项目——学生信息管理系统3

目录 班级添加的界面实现 创建班级的实体类 在org.xingyun.dao 包下 编写 ClassDao 创建 AddStudentClassFrm 添加班级页面 注意创建成 JInternalFrame 类型 给控件起个名字 注释掉main方法 给提交按钮绑定事件 回到 MainFrm.java 给添加班级按钮绑定事件 启动测试 班…

chatgpt赋能python:Python重写父类的方法

Python重写父类的方法 在Python中&#xff0c;继承是一个常见的概念。通过继承&#xff0c;子类可以使用父类中定义的属性和方法。有时候&#xff0c;子类需要改变父类中的行为。这时候&#xff0c;可以通过重写父类的方法来实现这一目的。 什么是重写方法&#xff1f; 当一…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…

(八)灌溉系统-将nodejs部署到云服务器(未实现,思路供参考)

这里之后我就是升级优化了 如果不想再学习的话&#xff0c;前面的就足够用了 Node后端部署上线详细步骤及踩坑记录&#xff08;使用宝塔面板&#xff09;&#xff1a;参考文章 Xshelll7下载&#xff1a;教程 这里是成功连上了

如何使用 Terraform 和 Git 分支有效管理多环境?

作者&#xff5c;Sumeet Ninawe 翻译&#xff5c;Seal软件 链接&#xff5c;https://spacelift.io/blog/terraform-environments 通常我们使用 Terraform 将我们的基础设施定义为代码&#xff0c;然后用 Terraform CLI 在我们选择的云平台中创建制定的基础设施组件。从表面上看…

C++primer(第五版)第五章(语句)

5.1简单语句 一个语句在末尾加上分号;就变成了表达式语句.表达式语句的作用是执行表达式并丢弃掉求值结果(也可以用赋值运算符将求值结果存起来),不存起来的话,大多数表达式语句是没有什么实际用处的表达式语句,例如: int a10; a5; //这就是没什么用的表达式语句 ; …