Mybatis-Plus的使用

Mybatis-Plus的使用

  • 一、核心特性
  • 二、基础配置
    • [2.1 依赖配置](#2.1 依赖配置)
    • [2.2 yml文件配置](#2.2 yml文件配置)
  • 三、实际使用
    • [3.1 添加配置类](#3.1 添加配置类)
    • [3.2 创建实体类](#3.2 创建实体类)
    • [3.3 创建Mapper接口](#3.3 创建Mapper接口)
    • [3.4 创建Service层](#3.4 创建Service层)
    • [3.5 创建Service实现层](#3.5 创建Service实现层)
    • [3.6 创建Controller](#3.6 创建Controller)
    • [3.7 用配置类里面的操作,完善Service实现层(使用Lambda方法)](#3.7 用配置类里面的操作,完善Service实现层(使用Lambda方法))

一、核心特性

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响
  2. 损耗小:启动即会自动注入基本CURD,性能基本无损耗
  3. 强大的CRUD操作:内置通用Mapper、通用Service
  4. 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件
  5. 支持主键自动生成:支持多达4种主键策略
  6. 支持ActiveRecord模式:支持ActiveRecord形式调用
  7. 支持自定义全局通用操作:支持全局通用方法注入
  8. 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码
  9. 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作
  10. 内置性能分析插件:可输出SQL语句以及其执行时间

二、基础配置

2.1 依赖配置

java 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
        
<!-- MyBatis Plus -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>

<!-- MySQL驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
       
<!-- Lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2.2 yml文件配置

java 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo1?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# MyBatis Plus配置
mybatis-plus:
  configuration:
    # 日志输出
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 驼峰命名转换
    map-underscore-to-camel-case: true
  global-config:
    db-config:
      # 主键类型
      id-type: auto
      # 逻辑删除字段
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  # Mapper XML文件位置
  mapper-locations: classpath*:/mapper/**/*.xml

三、实际使用

3.1 添加配置类

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("cn.itwy.studydemo1")
public class MyBatisPlusConfig {

    // 分页插件
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    // 自动填充处理器
    public MetaObjectHandler mataObjectHandler() {
        return new MetaObjectHandler(){

            @Override
            public void insertFill(MetaObject metaObject) {
                this.strictInsertFill(metaObject, "createTime", java.util.Date.class, new java.util.Date());
                this.strictInsertFill(metaObject, "updateTime", java.util.Date.class, new java.util.Date());
            }

            @Override
            public void updateFill(MetaObject metaObject) {
                this.strictUpdateFill(metaObject, "updateTime", java.util.Date.class, new java.util.Date());
            }
        };
    }
}

3.2 创建实体类

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.time.LocalDateTime;

@Data
@TableName("user")
public class User {

    @TableId(type = IdType.AUTO)
    private Long id;

    private String username;

    private String email;

    private Integer age;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableLogic
    private Integer deleted;
}

3.3 创建Mapper接口

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    /**
     * 根据用户名查询用户
     */
    @Select("SELECT * FROM user WHERE username = #{username}")
    User selectByUsername(@Param("username") String username);
}  

3.4 创建Service层

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.extension.service.IService;

public interface UserService extends IService<User> {
    User selectByUsername(String username);
}

3.5 创建Service实现层

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public User selectByUsername(String username) {
        return baseMapper.selectByUsername(username);
    }
}

3.6 创建Controller

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/all")
    public List<User> listAllUsers() {
        return userService.list();
    }

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

    @PostMapping("/creatUser")
    public boolean createUser(@RequestBody User user) {
        return userService.save(user);
    }

    @PostMapping("/changeUser/{id}")
    public boolean changeUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        return userService.updateById(user);
    }

    @DeleteMapping("/delete/{id}")
    public boolean deleteUser(@PathVariable Long id) {
        return userService.removeById(id);
    }

    @GetMapping("/page")
    public IPage<User> page(@RequestParam(defaultValue = "1") Integer current, @RequestParam(defaultValue = "10") Integer size) {
        return userService.page(new Page<>(current, size));
    }
}

3.7 用配置类里面的操作,完善Service实现层(使用Lambda方法)

java 复制代码
package cn.itwy.studydemo1;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Override
    public User selectByUsername(String username) {
        return baseMapper.selectByUsername(username);
    }

    public List<User> searchUsers(String username, Integer minAge, Integer maxAge) {
        return lambdaQuery()
                .like(StringUtils.isNotBlank(username), User::getUsername, username)
                .ge(minAge != null, User::getAge, minAge)
                .le(maxAge != null, User::getAge, maxAge)
                .orderByDesc(User::getCreateTime)
                .list();
    }

    // 分页查询
    public IPage<User> pageUsers(Integer current, Integer size, String keyword) {
        return lambdaQuery()
                .like(StringUtils.isNotBlank(keyword), User::getUsername, keyword)
                .or()
                .like(StringUtils.isNotBlank(keyword), User::getEmail, keyword)
                .orderByDesc(User::getCreateTime)
                .page(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(current, size));
    }


    // 更新操作
    public boolean updateUser(Long id, Integer age) {
        return lambdaUpdate()
                .eq(User::getId, id)
                .set(User::getAge, age)
                .update();
    }
}
相关推荐
zmsofts1 天前
java面试必问13:MyBatis 一级缓存、二级缓存:从原理到脏数据,一篇讲透
java·面试·mybatis
MegaDataFlowers2 天前
使用SpringBoot+MyBatis+MySQL完成后端的数据库增删改查(CRUD)操作
数据库·spring boot·mybatis
一只大袋鼠2 天前
MyBatis 特性(三):缓存、延迟加载、注解开发
java·数据库·笔记·sql·缓存·mybatis
木易 士心2 天前
MyBatis Plus 核心功能与用法
java·后端·mybatis
一只大袋鼠2 天前
MyBatis 进阶实战(四): 连接池、动态 SQL、多表关联(一对多 / 多对一 / 多对多)
java·开发语言·数据库·sql·mysql·mybatis
霸道流氓气质3 天前
SpringBoot中调用mybatis方法提示映射文件未找到Invalid bound statement(not found)的奇葩解决
spring boot·后端·mybatis
一只大袋鼠3 天前
MyBatis 从入门到实战(二):代理 Dao 开发与多表关联查询
java·开发语言·数据库·mysql·mybatis
tycooncool3 天前
Spring Boot中集成MyBatis操作数据库详细教程
数据库·spring boot·mybatis
一只大袋鼠3 天前
MyBatis 入门详细实战教程(一):从环境搭建到查询运行
java·开发语言·数据库·mysql·mybatis
Full Stack Developme4 天前
MyBatis-Plus 流式查询教程
前端·python·mybatis