Mybaits-Plus的入门使用

目录

一、简介

二、主要特性

三、快速上手

四、常用方法

一、简介

MyBatis-Plus官网:MyBatis-Plus 🚀 为简化开发而生 (baomidou.com)

MyBatis-Plus 是一个 MyBatis 增强工具,旨在简化开发、提高效率。它提供了丰富的功能,如 CRUD 接口、自动代码生成、条件构造器、分页插件等,大大减少了重复代码的编写。

二、主要特性

  1. 无侵入性:在不改变原有 MyBatis 的情况下进行增强,兼容性好。
  2. 丰富的插件支持:包括分页插件、性能分析插件、全局拦截插件等。
  3. 强大的 CRUD 操作:内置通用 Mapper 和 Service,单表 CRUD 无需编写代码。
  4. 代码生成器:通过简单的配置,生成实体类、Mapper、Service、Controller 等代码。
  5. 条件构造器:使用 Lambda 表达式优雅地构建查询条件,避免字段名写错。
  6. 支持主流数据库:如 MySQL、Oracle、PostgreSQL、SQL Server 等。

三、快速上手

1.引入依赖

在SpringBoot项目的 pom.xml 中添加MyBatis-Plus 依赖:

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.6</version>
        </dependency>

2.配置数据源

application.yml 中配置数据库连接信息,此处使用MySQL数据库:

spring:
  datasource:
  	//改为自己的数据库名
    url: jdbc:mysql://localhost:3306/database_name
    //改为自己的数据库用户名和密码
    username: username
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

3.编写实体类

@Data
@TableName("user")//对应数据库中的表名
public class User {
    private Long id;
    private String username;
    private String password;
    private String email;
}

4.编写Mapper接口

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 可以添加自定义的数据库操作方法
}

5.编写Service接口

public interface UserService extends IService<User> {
    // 定义 User 的业务方法
    User findUserByUsername(String username);
}

6.编写ServiceImpl实现类

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public User findUserByUsername(String username) {
        // 使用 LambdaQueryWrapper 构建查询条件
        return this.lambdaQuery().eq(User::getUsername, username).one();
    }
}

7.控制层示例

@RestController
@RequestMapping("/users")
public class UserController {

    @Resource
    private UserService userService;

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

    @PostMapping
    public boolean addUser(@RequestBody User user) {
        return userService.save(user);
    }

    @GetMapping("/username/{username}")
    public User getUserByUsername(@PathVariable String username) {
        return userService.findUserByUsername(username);
    }
}

四、常用方法

1.基本CRUD方法

1.save()

用于插入一条记录:

User user = new User();
user.setName("张三");
user.setAge(25);
userService.save(user);
2.remove()

用于删除记录,可以根据 ID、条件等删除。

//根据ID删除
userService.removeById(1L);
//根据条件删除
userService.remove(new QueryWrapper<User>().eq("name", "张三"));
3.update()

用于更新记录

//根据ID更新
User user = new User();
user.setId(1L);
user.setAge(30);
userService.updateById(user);
//根据条件更新
User user = new User();
user.setAge(30);
userService.update(user, new UpdateWrapper<>().eq("name", "张三"));
4.getById()

根据 ID 查询记录。

User user = userService.getById(1L);
5.list()

查询所有记录或根据条件查询列表。

List<User> users = userService.list();
List<User> users = userService.list(new QueryWrapper<>().gt("age", 20));

2.链式查询方法

1.query()

返回一个 QueryChainWrapper 对象,用于链式构建查询条件。

List<User> users = userService.query()
    .eq("name", "张三")
    .gt("age", 20)
    .list();
2.lambdaQuery()

返回一个 LambdaQueryChainWrapper 对象,使用 Lambda 表达式,避免手写字符串字段名,防止字段名错误。

List<User> users = userService.lambdaQuery()
    .eq(User::getName, "张三")
    .gt(User::getAge, 20)
    .list();
3.update()lambdaUpdate()

用于链式更新操作。

userService.update()
    .set("age", 30)
    .eq("name", "张三")
    .update();

userService.lambdaUpdate()
    .set(User::getAge, 30)
    .eq(User::getName, "张三")
    .update();
4.remove() 的链式调用
userService.lambdaUpdate()
    .eq(User::getName, "张三")
    .remove();

3.条件构造器

1.QueryWrapper()LambdaQueryWrapper()

QueryWrapper:基于字段名的条件构造器,需要手写字段名。

LambdaQueryWrapper:基于 Lambda 表达式的条件构造器,避免手写字段名。

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").gt("age", 20);
List<User> users = userService.list(queryWrapper);

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三").gt(User::getAge, 20);
List<User> users = userService.list(lambdaQuery);
2.常用条件方法
  1. eq():等于
  2. ne():不等于
  3. gt():大于
  4. ge():大于等于
  5. lt():小于
  6. le():小于等于
  7. like():模糊匹配,生成 LIKE '%value%' 操作
  8. notLike():不匹配,生成 NOT LIKE '%value%' 操作
  9. likeLeft():左匹配,生成 LIKE '%value' 操作
  10. likeRight():右匹配,生成 LIKE 'value%' 操作
  11. between():在两者之间
  12. notBetween():不在两者之间
  13. in():包含在集合中
  14. notIn():不包含在集合中
  15. orderByAsc():升序排序
  16. orderByDesc():降序排序
  17. isNull():为空
  18. isNotNull(): 不为空

4.分页查询

1.配置插件

在配置类中进行配置:

@Configuration
@MapperScan("scan.your.mapper.package")
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); 
        // 如果配置多个插件, 切记分页最后添加
        return interceptor;
    }
}
2.Page对象
public void getUserPage() {
    // 创建分页对象,参数:当前页码,每页条数
    Page<User> page = new Page<>(1, 10);
    // 调用分页查询方法
    IPage<User> userPage = userService.page(page);
    // 获取分页结果
    List<User> users = userPage.getRecords();
    long total = userPage.getTotal(); // 总记录数
    long pages = userPage.getPages(); // 总页数
}
3.条件分页查询
public void getUserPageByCondition() {
    Page<User> page = new Page<>(1, 10);
    // 构建查询条件
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.ge(User::getAge, 20);
    // 执行分页查询
    IPage<User> userPage = userService.page(page, queryWrapper);
    // 获取结果
    List<User> users = userPage.getRecords();
}
4.前端传递参数

在实际开发中,分页参数通常由前端传递,需要在控制器中接收。

@RestController
@RequestMapping("/users")
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/page")
    public IPage<User> getUserPage(
            @RequestParam(value = "pageNum", defaultValue = "1") int pageNum,
            @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return userService.page(page);
    }
}

5.批量操作

进行批量操作时在方法上添加注解@Transactional,声明该方法执行时被事务管理,确保整个批量操作要么全部成功,要么全部失败,符合事务的原子性原则。

1.批量保存
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25));
userList.add(new User("李四", 30));
userService.saveBatch(userList);
2.批量更新
userService.updateBatchById(userList);
3.批量删除

根据 ID 列表删除:

List<Long> ids = Arrays.asList(1L, 2L, 3L);
userService.removeByIds(ids);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值