MyBatisPlus基础功能使用

文章目录

  • 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 {@TableIdprivate 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 {@TableIdprivate 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 {@Overridepublic void saveUser(User user) {this.save(user);}@Overridepublic User getUserById(Long id) {return this.getById(id);}@Overridepublic void updateUser(User user) {this.updateById(user);}@Overridepublic 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 {@Autowiredprivate 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 {@TableIdprivate Long id;private String username;@TableField(exist = false)private List<Order> orders;
}@Data
@TableName("order")
public class Order {@TableIdprivate 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 {@TableIdprivate Long id;private String orderNo;private Long userId;@TableField(exist = false)private User user;
}@Data
@TableName("user")
public class User {@TableIdprivate 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.hqwc.cn/news/1793.html

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

相关文章

【C/C++】使用类和对象 练习EasyX图形库

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

黑马微信小程序-实现本地服务九宫格并展示商品列表

一、九宫格实现 1.获取数据 1.1准备接口 黑马接口&#xff1a;https://applet-base-api-t.itheima.net/categories 说明&#xff1a;这是获取九宫格的数据接口 1.2使用接口 说明&#xff1a;声明变量获取数据。 getGridList() {wx.request({url: https://applet-base-api-t.…

ECS云服务器U实例评测,可以免费体验哦

目录 一、ECS云服务器U实例介绍 话题一、U实例使用体感如何&#xff0c;是否和主售型实例有区别&#xff0c;具体体现在哪里&#xff1f; 话题二、结合相关数据材料&#xff0c;对您感兴趣的场景 话题三、使用u实例是否为您的云上业务或者测试项目提供了帮助支持&#xff1…

Qgis加载在线XYZ瓦片影像服务的实践操作

目录 背景 一、XYZ瓦片相关知识 1、xyz瓦片金字塔 2、 瓦片编号 3、瓦片访问 二、在Qgis中加载在线地图 1、Qgis版本 2、瓦片加载 3、地图属性预览 总结 背景 在做电子地图应用的时候&#xff0c;很常见的会提到瓦片&#xff08;tile&#xff09;的概念&#xff0c;瓦片…

Redis系列 | 分类树查询功能如何从2s优化到0.1s

大家好&#xff0c;今天我们继续来分享一个在项目开发过程中遇到的实际问题&#xff0c;这里也来梳理并总结一下我们是如何对它进行持续优化的&#xff0c;希望能对大家有所帮助。 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在一些电商系统中…

国产chatgpt:基于chatGLM微调nlp分类任务

文章目录 一、源码网址1. 硬件设施&#xff1a;2. INT4 量化示例 二、重要的开源社区功能&#xff1a;网址&#xff1a;使用方法&#xff1a;利用方法&#xff1a;对 NLP 工作者的作用&#xff1a;对大模型工程师的用处&#xff1a; 三、重要的开源库四、提示词工程五、进行分类…

线性代数笔记整理

文章目录 1 行列式2 矩阵&#xff08;本质是数表&#xff09;3 方程组的解4 向量5 矩阵的特征值和特征向量6 相似矩阵和相似对角化7 合同对角化8 二次型及其标准型 1 行列式 2 矩阵&#xff08;本质是数表&#xff09; 3 方程组的解 4 向量 5 矩阵的特征值和特征向量 6 相似矩阵…

从0到1精通自动化测试,pytest自动化测试框架,skip跳过用例(八)

一、前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能&#xff0c;或者希望自己失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过&#xff0c;否则pytest应该跳过运行测试。 常见示例是在非Windows平台上跳过仅限Windows的测试&#xff0c;或跳过测…

pytorch搭建AlexNet网络实现花分类

pytorch搭建AlexNet网络实现花分类 一、AlexNet网络概述分析 二、数据集准备下载划分训练集和测试集 三、代码model.pytrain.pypredict.py 一、AlexNet网络 概述 使用Dropout的方式在网络正向传播过程中随机失活一部分神经元&#xff0c;以减少过拟合 分析 对其中的卷积层、…

MyCat01——如何实现MySQL中的主从复制

1 问题 数据对于我们来说是一项最重要的资产&#xff0c;因为数据丢失带来的损失&#xff0c;对于一家公司来说&#xff0c;有时也是毁灭性的。 那么如何确保数据安全&#xff0c;不因断电或系统故障带来数据丢失呢&#xff1f; 当用户增加&#xff0c;对数据库的访问量也随…

【Soft-prompt Tuning for Large Language Models to Evaluate Bias 论文略读】

Soft-prompt Tuning for Large Language Models to Evaluate Bias 论文略读 INFORMATIONAbstract1 Introduction2 Related work3 Methodology3.1 Experimental setup 4 Results5 Discussion & Conclusion总结A Fairness metricsB Hyperparmeter DetailsC DatasetsD Prompt …

【Java】JVM学习(七)

JVM调优 堆空间如何设置 在分代模型中&#xff0c;各分区的大小对GC的性能影响很大。如何将各分区调整到合适的大小&#xff0c;分析活跃数据的大小是很好的切入点。 活跃数据的大小&#xff1a;应用程序稳定运行时长期存活对象在堆中占用的空间大小&#xff0c;也就是Full …