翼度科技»论坛 编程开发 mysql 查看内容

mybatis plus 常用知识汇总(保姆级教程!~)

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
介绍:

MyBatis-Plus 是基于 MyBatis 框架的一个增强工具,主要目的是简化 MyBatis 的开发过程,提供更加简洁、方便的 CRUD 操作。它是在保留 MyBatis 强大功能的基础上,通过封装和优化一些常见操作来提高开发效率。
MyBatis-Plus 提供了许多开箱即用的功能,包括自动 CRUD 代码生成、分页查询、性能优化、以及支持多种数据库。与 MyBatis 相比,MyBatis-Plus 的 部分 核心特性包括:

  • 无侵入设计:不会改变 MyBatis 原有的 API 和使用方式,你可以自由选择 MyBatis 和 MyBatis-Plus 的功能。
  • 自动 CRUD:通过 BaseMapper 和 ServiceImpl 接口,MyBatis-Plus 提供了一系列 CRUD 操作的方法,如 insert、delete、update 和 select,减少了重复的 SQL 编写工作。
  • 条件构造器:MyBatis-Plus 提供了条件构造器(如 QueryWrapper),可以通过链式编程方式轻松构建复杂的查询条件。
1、准备工作

1.1 添加依赖

创建一个 springboot 项目, 在 pom.xml 文件中的 dependencies 标签中添加所需要的依赖。
打开 maven官网 搜索所需依赖。大家添加最新版本的就行

  • mybatis plus

  1. <dependency>
  2.      <groupId>com.baomidou</groupId>
  3.      <artifactId>mybatis-plus-boot-starter</artifactId>
  4.      <version>3.5.7</version>
  5. </dependency>
复制代码

  • mysql

  1. <dependency>
  2.     <groupId>com.mysql</groupId>
  3.     <artifactId>mysql-connector-j</artifactId>
  4.     <version>9.0.0</version>
  5. </dependency>
复制代码

  • mybatis spring
这个依赖最好加上,它可以解决部分 mybatis 和 spring 之间的兼容性问题

  1. <dependency>
  2.     <groupId>org.mybatis</groupId>
  3.     <artifactId>mybatis-spring</artifactId>
  4.     <version>3.0.4</version>
  5. </dependency>
复制代码
1.2 创建数据表和数据

mybatis plus 官网 给的有 sql 语句, 执行生成数据表和数据

在 application.properties 文件中添加下面信息连接数据库
  1. spring.datasource.url=jdbc:mysql://localhost:3306/yourDatabaseName?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
  2. spring.datasource.username=YourUserName
  3. spring.datasource.password=YourPassword
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
复制代码
idea连接数据库,创建pojo,mapper,service,controller文件就不多赘述了..
2、mapper层基本的操作

BaseMapper 是 MyBatis-Plus 提供的一个基础 Mapper 接口,它简化了数据访问层(Data Access Layer)的开发。BaseMapper 提供了一系列通用的数据库操作方法,这样你就不必手动编写常见的 SQL 语句,从而提升了开发效率。
1. 使用 BaseMapper

假设我们有一个用户实体类 User,如下:
  1. public class User {
  2.     private Long id;
  3.     private String name;
  4.     private Integer age;
  5.     private String email;
  6.     // Getter 和 Setter
  7. }
复制代码
你可以创建一个 UserMapper 接口来继承 BaseMapper:
  1. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  2. public interface UserMapper extends BaseMapper<User> {
  3.     // 你可以在这里添加自定义方法
  4. }
复制代码
通过继承 BaseMapper,UserMapper 立即拥有了所有的 CRUD 操作方法。你可以在你的服务层(Service Layer)中直接使用这些方法,无需再编写任何 SQL 语句。
2. BaseMapper 提供的常用方法

2.1 增(Insert)

简单示例:
  1. // 定义用户实体类
  2. public class User {
  3.     private Long id;
  4.     private String username;
  5.     private String email;
  6. }
  7. // 使用 MyBatis-Plus 提供的 BaseMapper 接口
  8. public interface UserMapper extends BaseMapper<User> {
  9. }
  10. // 插入一条记录
  11. User user = new User();
  12. user.setUsername("john_doe");
  13. user.setEmail("john@example.com");
  14. // 调用 insert 方法
  15. userMapper.insert(user);
复制代码
解释:这里的 insert 方法直接使用实体类对象 user,将其插入到数据库中。MyBatis-Plus 自动生成的 insert 方法会根据实体类的属性映射到数据库表的字段。
2.2 删(Delete)

简单示例:
  1. // 根据 ID 删除一条记录
  2. userMapper.deleteById(1L);
复制代码
解释:deleteById 方法通过传入用户的 id 删除该用户。这个方法直接删除主键为 1 的用户。
2.3 改(Update)

简单示例:
  1. // 创建一个用户对象,设置要修改的字段
  2. User user = new User();
  3. user.setId(1L);  // 设置要更新的用户 ID
  4. user.setEmail("newemail@example.com");  // 修改用户邮箱
  5. // 更新用户信息
  6. userMapper.updateById(user);
复制代码
解释:updateById 方法根据 id 更新用户记录,这里只更新了邮箱字段,其他字段保持不变。
2.4 查(Select)

简单示例:
  1. // 根据 ID 查询用户
  2. User user = userMapper.selectById(1L);
  3. // 输出用户信息
  4. System.out.println(user.getUsername());
复制代码
解释:selectById 方法根据传入的 id 查询对应的用户信息,然后可以输出或使用这个用户信息。
2.5 条件查询

简单示例:
  1. // 构建查询条件
  2. QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // <-------- 下面会讲到
  3. queryWrapper.eq("username", "john_doe");  // 设置条件:用户名为 john_doe
  4. // 执行查询
  5. List<User> users = userMapper.selectList(queryWrapper);
  6. // 输出查询结果
  7. for (User u : users) {
  8.     System.out.println(u.getUsername());
  9. }
复制代码
6.3 排序查询

示例 1:按 age 升序和 name 升序排序

假设你想首先按用户的年龄升序排序,然后按姓名升序排序,可以使用如下代码:
  1. @Service
  2. public class UserService {
  3.     @Autowired
  4.     private UserMapper userMapper;
  5.     // 插入一条记录
  6.     public void addUser(User user) {
  7.         userMapper.insert(user);
  8.     }
  9.     // 根据 ID 删除一条记录
  10.     public void deleteUserById(Long id) {
  11.         userMapper.deleteById(id);
  12.     }
  13.     // 更新用户信息
  14.     public void updateUser(User user) {
  15.         userMapper.updateById(user);
  16.     }
  17.     // 根据 ID 查询用户
  18.     public User getUserById(Long id) {
  19.         return userMapper.selectById(id);
  20.     }
  21.     // 查询所有用户
  22.     public List<User> getAllUsers() {
  23.         return userMapper.selectList(null);
  24.     }
  25. }
复制代码
生成的 SQL:
  1. public interface UserService extends IService<User> {
  2.     // 可以定义一些自定义的服务方法
  3. }
复制代码
示例 2:按 age 降序排序

假设你想按用户的年龄降序排序,可以使用如下代码:
  1. @Service
  2. public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
  3.     // 你可以重写 ServiceImpl 中的方法,或者定义更多的业务逻辑
  4. }
复制代码
生成的 SQL:
  1. @TableName("sys_user")
  2. public class User {
  3.     // 属性和方法
  4. }
复制代码
示例 3:按 age 升序和 name 降序组合排序

假设你想先按年龄升序排序,再按姓名降序排序,可以使用如下代码:
  1. @TableField("user_name")
  2. private String userName;
复制代码
生成的 SQL:
  1. @TableField("`desc`")
  2. private String desc;
复制代码
示例 4:按多字段排序,并指定是否为空

假设你想按 age 升序排序,并希望将 name 为空的记录排在前面,可以使用如下代码:
  1. @TableField(select = false)
  2. private Integer age;
复制代码
生成的 SQL:
  1. public interface UserService extends IService<User> {
  2.     // 可以定义一些自定义的服务方法
  3. }
复制代码
6.4 逻辑查询

func 方法是 MyBatis-Plus 提供的一个非常灵活的功能,它允许你将一段自定义的逻辑包装到查询条件中。这对于需要根据不同的条件来动态构建查询的场景特别有用。下面是对 func 方法的详细解释。
1. func 方法的基本用法

func 方法接收一个 Consumer,该 Consumer 的参数是 QueryWrapper(或 LambdaQueryWrapper)的一个实例。你可以在这个 Consumer 中编写自定义的逻辑,并根据不同的条件来动态地添加或修改查询条件。
语法结构
  1. @TableId(value = "user_id", type = IdType.ASSIGN_UUID)
  2. private String userId;
复制代码
主要参数


  • Consumer 或 Consumer:这是一个函数式接口,允许你传入一个 Lambda 表达式或方法引用。你可以在这个接口的 accept 方法中实现自己的逻辑。
实际应用场景

假设你有一个用户查询接口,允许用户根据不同的条件来过滤结果,例如按 id 或按 name。你可以使用 func 来根据用户输入动态地构建查询条件。
  1. @TableId(value = "user_id", type = IdType.ASSIGN_UUID)
  2. private String userId;
复制代码

  • 示例解释

    • 如果 userInput 非空且有效,则查询条件为 name = userInput.getName()。
    • 否则,查询条件为 id != 1。

2. and 和 or 的使用

在 MyBatis-Plus 中,and 和 or 用于在构建查询条件时处理多条件的逻辑运算。它们允许你在查询中组合多个条件,以实现复杂的查询逻辑。
and 方法

and 方法用于将多个查询条件通过逻辑“与” (AND) 连接在一起。它将多个条件组合成一个大的 AND 条件,从而要求所有这些条件都必须满足。
示例

假设你有一个 User 表,你想查询年龄大于 20 且名字为 "Jack" 的用户。可以使用以下代码:
  1. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  2. queryWrapper
  3.     .eq("name", "张三")  // name 等于 张三。 eq也可以写三个参数, 第一个参数是boolean, false 表示这个条件不起作用, true 表示起作用
  4.     .ge("age", 18)       // age 大于等于 18
  5.     .like("email", "gmail.com")  // email 包含 gmail.com
  6.     .orderByDesc("create_time"); // 按 create_time 降序排列
  7. List<User> users = userMapper.selectList(queryWrapper);
复制代码
生成的 SQL:
  1. LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
  2. lambdaQuery
  3.     .eq(User::getName, "张三")  // name 等于 张三
  4.     .ge(User::getAge, 18)       // age 大于等于 18
  5.     .like(User::getEmail, "gmail.com")  // email 包含 gmail.com
  6.     .orderByDesc(User::getCreateTime); // 按 create_time 降序排列
  7. List<User> users = userMapper.selectList(lambdaQuery);
复制代码
在这个例子中,and 方法的作用是将 .gt("age", 20) 和 .eq("name", "Jack") 这两个条件通过 AND 组合在一起。
or 方法

or 方法用于将多个查询条件通过逻辑“或” (OR) 连接在一起。它将多个条件组合成一个大的 OR 条件,只要其中一个条件满足,就会返回符合的结果。
示例

假设你有一个 User 表,你想查询年龄大于 20 或名字为 "Jack" 的用户。可以使用以下代码:
  1. UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  2. updateWrapper
  3.     .eq("name", "张三")
  4.     .set("age", 30);  // 将年龄更新为 30
  5. userMapper.update(null, updateWrapper);
复制代码
生成的 SQL:
  1. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  2. queryWrapper.select("age", "COUNT(*) as count");
  3. queryWrapper.groupBy("age");
  4. List<Map<String, Object>> result = userMapper.selectMaps(queryWrapper);
复制代码
在这个例子中,or 方法的作用是将 .gt("age", 20) 和 .eq("name", "Jack") 这两个条件通过 OR 组合在一起。
组合使用 and 和 or

你还可以结合使用 and 和 or 方法,以构建更复杂的查询。例如,如果你想查询年龄大于 20 且(名字为 "Jack" 或邮箱为 "test@example.com")的用户,可以使用以下代码:
  1. SELECT age, COUNT(*) as count FROM user GROUP BY age;
复制代码
生成的 SQL:
  1. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  2. queryWrapper.select("age", "COUNT(*) as count");
  3. queryWrapper.groupBy("age");
  4. queryWrapper.having("COUNT(*) > 1");
  5. List<Map<String, Object>> result = userMapper.selectMaps(queryWrapper);
复制代码
在这个例子中,and 和 or 方法的结合使用允许你在 age > 20 的基础上,增加一个组合条件 (name = 'Jack' OR email = 'test@example.com')。
6.5 其他查询

apply 方法

apply 方法允许你直接在 QueryWrapper 中插入自定义的 SQL 片段。apply 方法中的 SQL 片段会被添加到 WHERE 子句的末尾。这允许你在现有的查询条件基础上,添加更复杂的条件或函数。
基本用法:
  1. SELECT age, COUNT(*) as count FROM user GROUP BY age HAVING COUNT(*) > 1;
复制代码
在这个示例中:

  • apply 方法接受一个 SQL 片段作为第一个参数,并可以通过 {} 占位符来插入参数。
  • 这里使用了 DATE_FORMAT 函数来格式化 create_time 字段,并将其与特定的日期进行比较。
last 方法

last 方法用于在生成的 SQL 查询的末尾添加额外的 SQL 片段。通常用于添加额外的 SQL 语句,如 ORDER BY, LIMIT, OFFSET 等,这些操作是在生成的 SQL 的最后部分进行的。
基本用法:
  1. QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  2. queryWrapper.orderByAsc("age").orderByAsc("name");
  3. List<User> result = userMapper.selectList(queryWrapper);
复制代码
在这个示例中:

  • last 方法添加了一个 LIMIT 5 子句到查询的末尾,用于限制结果集的返回行数。
示例

假设你有一个 User 表,并且想要查询所有 age 大于 20 的用户,并且结果按照 id 降序排列,并且只返回前 10 条记录。你可以使用 apply 和 last 方法来实现这个需求:
  1. SELECT * FROM user ORDER BY age ASC, name ASC;
复制代码
以上内容包含了 mybatis plus 的大部分常用内容,基本能满足大部分需求。
其他内容 ... 待更~

来源:https://www.cnblogs.com/xxctx/p/18404560
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具