【Spring Cloud Alibaba】Mybatis Plus 持久层

文章目录

【Spring Cloud Alibaba】Mybatis Plus 持久层

1、Mybatis Plus

Mybatis Plus 是国产的持久层框架,这里使用起来就很简单了,应为是中文!

Mybatis Plus 官网:https://baomidou.com/
在 Spring Cloud Alibaba 中集成的方式和 Spring Boot 是一样的

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可*配置,- 完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

2、集成 Mybatis Plus

创建 spring-cloud-alibaba-mybatis-plus 模块,引入相关依赖,和其他的模块没有什么区别,同样的注册到 Nacos 中

${mybatis-plus-boot-starter.version}
${lombok.version}

版本为

<mybatis-plus-boot-starter.version>3.4.3</mybatis-plus-boot-starter.version>
<lombok.version>1.18.20</lombok.version>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus-boot-starter.version}</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

修改 application.yml 配置文件,为了方便编写,这里使用的是 yml 格式的

# 应用配置
server:
  port: 8006

# 端点监控
management:
  endpoint:
    health:
      show-details: always
  endpoints:
    jmx:
      exposure:
        include: '*'
    web:
      exposure:
        include: '*'
  server:
    port: 9006

spring:
  # 应用名称
  application:
    name: spring-cloud-alibaba-gateway
  # 数据源
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/spring-cloud-alibaba-learn?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: 123456
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false
  # Nacos配置
  cloud:
    nacos:
      discovery:
        namespace: sandbox-configuration
        password: nacos
        server-addr: localhost:8848
        username: nacos

# MybatisPlus配置
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: true
    auto-mapping-behavior: full
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath*:mapper/**/*Mapper.xml
  global-config:
    # 逻辑删除配置
    db-config:
      # 删除前
      logic-not-delete-value: 1
      # 删除后
      logic-delete-value: 2

启动类增加

@EnableDiscoveryClient

创建控制层

package cn.tellsea.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户表 前端控制器
 *
 * @author Tellsea
 * @since 2021-12-28
 */
@RestController
@RequestMapping("/userInfo")
public class UserInfoController {

}

创建接口

package cn.tellsea.service;

import cn.tellsea.entity.UserInfo;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * 用户表 服务类
 *
 * @author Tellsea
 * @since 2021-12-28
 */
public interface IUserInfoService extends IService<UserInfo> {

}

创建接口实现类

package cn.tellsea.service.impl;

import cn.tellsea.entity.UserInfo;
import cn.tellsea.mapper.UserInfoMapper;
import cn.tellsea.service.IUserInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * 用户表 服务实现类
 *
 * @author Tellsea
 * @since 2021-12-28
 */
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {

}

创建 Mapper

package cn.tellsea.mapper;

import cn.tellsea.entity.UserInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

/**
 * Mapper 接口
 *
 * @author Tellsea
 * @since 2021-12-28
 */
public interface UserInfoMapper extends BaseMapper<UserInfo> {

}

在 resources/mapper 下面创建 Mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tellsea.mapper.UserInfoMapper">

    <!-- 自定义SQL -->

</mapper>

创建 Mybatis Plus 注入器,补全字段

package cn.tellsea.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;

import java.util.Date;

/**
 * MybatisPlus注入处理器
 *
 * @author Tellsea
 * @date 2021/12/28
 */
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        if (metaObject.hasGetter("createTime")) {
            if (metaObject.getValue("createTime") == null) {
                this.setFieldValByName("createTime", new Date(), metaObject);
            }
        }
        if (metaObject.hasGetter("createBy")) {
            if (metaObject.getValue("createBy") == null) {
                this.setFieldValByName("createBy", "当前登录的用户名", metaObject);
            }
        }
        this.setFieldValByName("status", 1, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        if (metaObject.hasGetter("updateBy")) {
            if (metaObject.getValue("updateBy") == null) {
                this.setFieldValByName("updateBy", "当前登录的用户名", metaObject);
            }
        }
        if (metaObject.hasGetter("updateTime")) {
            if (metaObject.getValue("updateTime") == null) {
                this.setFieldValByName("updateTime", new Date(), metaObject);
            }
        }
    }

}

创建单元测试

package cn.tellsea;

import cn.tellsea.entity.UserInfo;
import cn.tellsea.service.IUserInfoService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.ArrayList;
import java.util.List;

/**
 * 单元测试
 *
 * @author Tellsea
 * @date 2021/12/28
 */
@SpringBootTest
class SpringCloudAlibabaMybatisPlusApplicationTests {

    @Autowired
    private IUserInfoService userInfoService;

    @Test
    void contextLoads() {
    }

    @Test
    public void test() {
        UserInfo entity = new UserInfo();
        List<UserInfo> userInfoList = new ArrayList<>();

        // 新增
        userInfoService.save(entity);

        // 批量新增
        userInfoService.saveBatch(userInfoList);

        // 根据ID更新
        userInfoService.updateById(entity);

        // 根据ID批量更新
        userInfoService.updateBatchById(userInfoList);

        // 根据ID删除
        userInfoService.removeById(entity.getId());

        // 查询所有
        userInfoService.list();

        // 条件查询
        userInfoService.list(new LambdaQueryWrapper<UserInfo>()
                .like(UserInfo::getUserName, entity.getUserName()));
    }

}

这些代码可以通过 Mybatis Plus 的代码生成器一次性生成的,本篇文章主要说明 Mybatis Plus 在 SpringCloud Alibaba 中的使用和在 Spring Boot 中的使用是一样的。Mybatis Plus 的代码生成器会在相对应的模块更新,并具体说明使用方法,和定制模板

微信公众号

【Spring Cloud Alibaba】Mybatis Plus 持久层

上一篇:mybatis-plus团队新作:mybatis-mate 轻松学会数据权限


下一篇:处理南通一客户:Fortigate 310B Firmware丢失