MyBatisPlus讲解(二)

目录

一、通用枚举(不常用)

表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现。

1、创建通用枚举类型

创建枚举类如下:

java 复制代码
package com.qcby.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
public enum SexEnum {
    MALE(1, "男"),
    FEMALE(2, "女");

    @EnumValue
    private Integer sex;
    private String sexName;

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public String getSexName() {
        return sexName;
    }

    public void setSexName(String sexName) {
        this.sexName = sexName;
    }

    SexEnum(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }
}

2、配置扫描通用枚举

xml 复制代码
mybatis-plus:
  global-config:
    db-config:
      id-type: auto
  type-enums-package: com.qcby.enums
  mapper-locations: classpath*:com/qcby/mapper/*.xml
  type-aliases-package: com.qcby.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、测试

测试方法如下:

java 复制代码
    @Test
    public void testSexEnum(){
        User user = new User();
        user.setName("Enum");
        user.setAge(20);
//设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
        user.setSex(SexEnum.MALE);
//INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? ) //Parameters: Enum(String), 20(Integer), 1(Integer)
        userService.save( user);
    }

实体类定义如下:

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
//@TableName("t_user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Long uid;
    private String name;
    private Integer age;
    private String email;
//    @TableLogic
    @TableField("isDelete")
    private Integer isDelete;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;
    private SexEnum sex;
}

其中sex的属性名是SexEnum,不是泛型的Enum,才可以实现。

二、代码生成器

1、引入依赖

我们需要引入代码生成器的相关依赖如下:

xml 复制代码
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

2、快速生成文件类

我们需要定义一个快速生成文件的类,用于实现代码生成器。

代码生成器类定义如下:

java 复制代码
public class FastAutoGeneratorTest {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/mybatis_plus? characterEncoding=utf-8&userSSL=false", "root", "12171032Aa")
                .globalConfig(builder -> {
                    builder.author("qcby") // 设置作者
//.enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件
                            .outputDir("D://mybatis_plus"); // 指定输出目录
                    })
                .packageConfig(builder -> {
                        builder.parent("com.qcby") // 设置父包名
                                .moduleName("mybatisplus") // 设置父包模块名

                                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://mybatis_plus"));
// 设置mapperXml生成路径
                    })
                            .strategyConfig(builder -> {
                                builder.addInclude("user"); // 设置需要生成的表名
//                                        .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                            })
                            .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker 引擎模板,默认的是Velocity引擎模板
                            .execute();
                }
}

运行结果如下:

生成相对应的三层架构的框架,mapper继承了BaseMapper,service层继承了Iservice等。

三、多数据源配置

适用于多种场景:纯粹多库、读写分离、 一主多从、混合模式等

目前我们就来模拟一个纯粹多库的一个场景,其他场景类似

场景说明:

我们创建两个库,分别为: mybatis_plus(以前的库不动)与mybatis_plus_1 (新建),将mybatis_plus库的product表移动到mybatis_plus_1库,这样每个库一张表,通过一个测试用例 分别获取用户数据与商品数据,如果获取到说明多库模拟成功。

1、创建数据库及表

sql 复制代码
CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus_1`;
CREATE TABLE product
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称 ',
price INT(11) DEFAULT 0 COMMENT '价格 ',
version INT(11) DEFAULT 0 COMMENT '乐观锁版本号 ',
PRIMARY KEY (id)
);

并且我们需要引入下面的相关依赖:

xml 复制代码
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>

2、配置多数据源

单一数据源的配置文件如下:

xml 复制代码
spring:
  datasource:
    # 配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource
    # 配置连接数据库信息
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
    username: root
    password: 12171032Aa

多数据源的配置文件如下:

xml 复制代码
spring:
  datasource:
    dynamic:
      # 设置默认的数据源或者数据源组 ,默认值即为master
      primary: master
      # 严格匹配数据源 ,默认false.true未匹配到指定数据源时抛异常 ,false使用默认数据源
      strict: false
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
          driver-class-name: com.mysql.cj.jdbc.Driver
          username: root
          password: 12171032Aa
        slave:
          url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
          driver-class-name: com.mysql.cj.jdbc.Driver
          username: root
          password: 12171032Aa

单一数据源需要在spring.datasource下面配置路径、账号、密码之类的。
多数据源需要在spring.datasource.dynamic中配置多个数据源,每个数据源都可以是不同的数据库类型和数据库。

3、测试多数据源实例

创建User和Product的实体类、业务层等文件,如下:

java 复制代码
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
public interface ProductService extends IService<Product> {
}
public interface UserService extends IService<User> {
}

测试方法定义如下:

java 复制代码
@SpringBootTest

public class UserProductTest {
    @Autowired
    private UserService userService;
    @Autowired
    private ProductService productService;
    @Test
    public void testGetByIdUser(){
        System.out.println(userService.getById(1));
    }
    @Test
    public void testGetByIdProduct(){
        System.out.println(productService.getById(1));
    }
}

当没有使用@DS注解时,所有数据库源都会指向application.yml中的 primary: master字段。

如果想要改变数据源的来源,需要在service层中使用@DS注解进行修改。


我们修改一下,让User的实体类中的数据从mybatis_plus_1中查找,而不是mybatis_plus中查找。

UserServiceImpl修改如下:

java 复制代码
@DS("slave")
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

其中添加了@DS("slave")。

我们再一次执行测试方法:

我们可以看到其数据源发生了改变,所以@DS注解时可以改变数据源的位置。

相关推荐
lcu1111 小时前
Java 学习42:抽象
java
Mr.朱鹏1 小时前
RocketMQ安装与部署指南
java·数据库·spring·oracle·maven·rocketmq·seata
雨中飘荡的记忆1 小时前
Spring表达式详解:SpEL从入门到实战
java·spring
Coder-coco1 小时前
个人健康管理|基于springboot+vue+个人健康管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·mysql·论文
b***65321 小时前
springboot整合mybatis-plus(保姆教学) 及搭建项目
spring boot·后端·mybatis
5***E6851 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
5***26221 小时前
Spring Boot问题总结
java·spring boot·后端
xkroy2 小时前
Spring Boot日志
java·spring boot·后端
n***F8752 小时前
【Spring Boot】SpringBoot自动装配-Import
java·spring boot·后端