在这篇文章中,荔枝主要梳理了MyBatis-Plus中的代码生成与多数据源的使用,基本操作相对来说比较简单,官网上也有详细教程,当荔枝还是梳理一下,希望能够帮助到有需要的小伙伴~~~
前言
一、通用枚举
二、代码生成器
三、多数据源
3.1 多数据源环境的配置
3.2 多数据源的应用
总结
当某些字段值是固定的,例如性别,可以使用MyBatis-Plus的通用枚举来实现。
设置枚举类
@EnumValue:将注解锁标识的属性的值存储在数据库中,如果不加该注解且没开启枚举扫描,则数据库插入的默认是MALE | FEMALE。
package com.crj.mybatisplus_test.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;
@Getter
public enum SexEnum {
MALE(1,"男"),
FEMALE(2,"女");
@EnumValue //将注解锁标识的属性的值存储在数据库中
private Integer sex;
private String sexName;
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
配置文件中设置扫描通用枚举
mybatis-plus:
#设置扫描通用枚举
type-enums-package: com.crj.mybatisplus_test.enums
测试类
package com.crj.mybatisplus_test;
import com.crj.mybatisplus_test.enums.SexEnum;
import com.crj.mybatisplus_test.mapper.UserMapper;
import com.crj.mybatisplus_test.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MyBatisPlusEnumTset {
@Autowired
private UserMapper userMapper;
@Test
public void test(){
User user = new User();
user.setName("CRJ");
user.setAge(21);
user.setSex(SexEnum.MALE);
int result = userMapper.insert(user);
System.out.println("result:"+result);
}
}
实体类
package com.crj.mybatisplus_test.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.crj.mybatisplus_test.enums.SexEnum;
import lombok.*;
//使用Lombok简化开发加上无参构造方法、有参构造
//@NoArgsConstructor
//@AllArgsConstructor
//@Getter
//@Setter
//@EqualsAndHashCode
@Data
@TableName("t_user")
public class User {
@TableId(value = "uid",type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
private SexEnum sex;
}
与MyBatis的逆向工程不同,MyBatis-Plus的代码生成器可以通过表生成控制层、业务层、持久层、映射文件以及mapper接口。
添加代码生成器的依赖
com.baomidou
mybatis-plus-generator
3.5.1
org.freemarker
freemarker
2.3.31
执行官网的快速生成demo
package com.crj.mybatisplus_test;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Collections;
public class FastAutoGeneratorTest {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false", "username", "password")
.globalConfig(builder -> {
builder.author("CRJ") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("D://mybatis_plus"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.crj") // 设置父包名
.moduleName("mybatisplus") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://mybatis_plus")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("t_user") // 设置需要生成的表名
.addTablePrefix("t_", "c_"); // 设置过滤表前缀
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
多数据源既动态数据源,项目开发逐渐扩大,单个数据源、单一数据源已经无法满足需求项目的支撑需求,比如多种类型库、一主多从和混合模式等,由此延伸了多数据源的扩展。多数据源的操作在日常的开发场景中也比较常见,下面看看多数据源环境下我们如何来操作数据。
首先在配置文件中添加开启多数据源的环境依赖
com.baomidou
dynamic-datasource-spring-boot-starter
3.5.0
配置数据源:对于是多库、一主多从还是混合模式的结构可以参考官方文档,这里给出的是一主多从。
spring:
#配置数据源信息
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
master:
url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0开始支持SPI可省略此配置
slave_1:
url: jdbc:mysql://localhost:3306/mybatis_plus_1?serverTimezone=GMT%2B8&characterEncoding=utf-8&userSSL=false
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
slave_2:
url: ENC(xxxxx) # 内置加密,使用请查看详细文档,文档需要付费!
username: ENC(xxxxx)
password: ENC(xxxxx)
driver-class-name: com.mysql.jdbc.Driver
#......省略
#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
实体类
package com.crj.mybatisPlusDatasource.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("t_user")
public class User {
@TableId(value = "uid",type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
}
mapper接口
mapper接口同样需要继承MyBatis-Plus中集成的有关CRUD的数据库操作的接口BaseMapper,继承相关的CRUD代码。
package com.crj.mybatisPlusDatasource.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.crj.mybatisPlusDatasource.pojo.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper {
}
service接口
service接口需要继承MyBatis-Plus的IService接口以得到有关数据操作的类方法。
package com.crj.mybatisPlusDatasource.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.crj.mybatisPlusDatasource.pojo.User;
import org.springframework.stereotype.Service;
public interface UserService extends IService {
}
service接口实现类
注意这里使用@DS来声明该实体类接口使用的是哪个数据源!
package com.crj.mybatisPlusDatasource.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.crj.mybatisPlusDatasource.mapper.UserMapper;
import com.crj.mybatisPlusDatasource.pojo.User;
import com.crj.mybatisPlusDatasource.service.UserService;
import org.springframework.stereotype.Service;
@Service
@DS("master")
public class UserServiceImpl extends ServiceImpl implements UserService {
}
同创建User实体类使用相同步骤创建一个Product实体类,并在测试类中测试是否成功开启多数据源。
Service层和Mapper层接口区别
简单理解其实mapper层接口就是继承BaseMapper接口实现基础的CRUD功能,而Service则通常通常定义了应用程序的业务逻辑方法,提供了对数据的高层次抽象。Service层接口实现类通过调用BaseMapper接口中的基本的CRUD操作实现业务逻辑。
终于,MyBatis-Plus阶段性的学习结束了,荔枝又可以回到项目的学习哈哈哈哈。最近荔枝有点焦虑哈哈,觉得自己有点着急,还是得花时间复盘一下这段时间的学习,扎实基础,就从软件设计模式和设计原则学起吧~~~
今朝已然成为过去,明日依然向往未来!我是小荔枝,在技术成长的路上与你相伴,码文不易,麻烦举起小爪爪点个赞吧哈哈哈~~~ 比心心♥~~~