• MyBatisPlus(七)——通用枚举、代码生成器、多数据源、MyBatisX


    目录

    通用枚举        

    代码生成器

    多数据源

    MyBatisX


    通用枚举        

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

    • 在数据库表中添加字段sex

    •  创建通用枚举类型

            我们要想把哪一个属性的值存储到数据库当中,我们就在这个属性上面添加一个注解@EnumValue,将注解所标识的属性的值存储到数据库中。

    1. import com.baomidou.mybatisplus.annotation.EnumValue;
    2. import lombok.Getter;
    3. @Getter
    4. public enum SexEnum {
    5. MALE(1, "男"),
    6. FEMALE(2, "女");
    7. @EnumValue
    8. private Integer sex;
    9. private String sexName;
    10. SexEnum(Integer sex, String sexName) {
    11. this.sex = sex;
    12. this.sexName = sexName;
    13. }
    14. }
    • 配置扫描通用枚举

            还需要再配置文件当中设置一个扫描通用枚举,只有通过扫描之后让mp知道扫描是谁,这个时候才能够将当前所添加的这个注解的功能来进行解析。

    1. mybatis-plus:
    2. configuration:
    3. # 配置MyBatis日志
    4. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    5. global-config:
    6. db-config:
    7. # 配置MyBatis-Plus操作表的默认前缀
    8. table-prefix: t_
    9. # 配置MyBatis-Plus的主键策略
    10. id-type: auto
    11. # 配置扫描通用枚举
    12. type-enums-package: com.zqf.mybatisplus.enums

            MP来使用通用枚举的话,只有两个操作,第一个操作我们在枚举中,把某一个属性的值存储到数据库中,直接把这个属性上添加@EnumValue,然后再在配置文件中来扫描咱们的枚举就可以了。

    • 测试
    1. @Test
    2. public void testSexEnum(){
    3. User user = new User();
    4. user.setName("Enum");
    5. user.setAge(20);
    6. //设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
    7. user.setSex(SexEnum.MALE);
    8. //INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? )
    9. //Parameters: Enum(String), 20(Integer), 1(Integer)
    10. userMapper.insert(user);
    11. }

    代码生成

    • 引入相关依赖
    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>mybatis-plus-generatorartifactId>
    4. <version>3.5.1version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.freemarkergroupId>
    8. <artifactId>freemarkerartifactId>
    9. <version>2.3.31version>
    10. dependency>
    • 快速生成
    1. package com.zqf.mybatisplus;
    2. import java.util.Collections;
    3. public class FastAutoGeneratorTest {
    4. public static void main(String[] args) {
    5. FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false", "root", "123456")
    6. .globalConfig(builder -> {
    7. builder.author("zqf") // 设置作者
    8. //.enableSwagger() // 开启 swagger 模式
    9. .fileOverride() // 覆盖已生成文件
    10. .outputDir("D://mybatis_plus"); // 指定输出目录
    11. })
    12. .packageConfig(builder -> {
    13. builder.parent("com.zqf") // 设置父包名
    14. .moduleName("mybatisplus") // 设置父包模块名
    15. .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://mybatis_plus"));// 设置mapperXml生成路径
    16. })
    17. //策略配置
    18. .strategyConfig(builder -> {
    19. builder.addInclude("t_user") // 设置需要逆向生成的表名
    20. .addTablePrefix("t_", "c_"); // 设置过滤表前缀
    21. })
    22. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
    23. .execute();
    24. }
    25. }

    多数据源

            适用于多种场景:纯粹多库(工程中所操作的表分散在不同的数据库当中)、 读写分离(有的数据库专门实现读的功能,有的数据库专门实现写的功能)、 一主多从、 混合模式等。

            我们创建两个库,第一个是我们之前所使用的mybatis_plus,第二个是mybatis_plus1,然后我们把user表放在咱们以前的mybatis_plus中,然后把product表放在mybatis_plus1中,然后这个时候通过MP设置的多数据源之后,来测试一下看能否从这两个数据库中来读取到数据。

    • 创建数据库及表
    1. CREATE DATABASE `mybatis_plus_1` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
    2. use `mybatis_plus_1`;
    3. CREATE TABLE product
    4. (
    5. id BIGINT(20) NOT NULL COMMENT '主键ID',
    6. name VARCHAR(30) NULL DEFAULT NULL COMMENT '商品名称',
    7. price INT(11) DEFAULT 0 COMMENT '价格',
    8. version INT(11) DEFAULT 0 COMMENT '乐观锁版本号',
    9. PRIMARY KEY (id)
    10. );
    11. INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本', 100);
    12. --删除原本mybatis_plus库product表
    13. use mybatis_plus;
    14. DROP TABLE IF EXISTS product;
    • 引入依赖
    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>dynamic-datasource-spring-boot-starterartifactId>
    4. <version>3.5.0version>
    5. dependency>
    • 配置多数据源

    说明:注释掉之前的数据库连接,添加新配置

    1. spring:
    2. # 配置数据源信息
    3. datasource:
    4. dynamic:
    5. # 设置默认的数据源或者数据源组,默认值即为master
    6. primary: master
    7. # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源(master)
    8. strict: false
    9. datasource:
    10. master:
    11. url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf8&useSSL=false
    12. driver-class-name: com.mysql.cj.jdbc.Driver
    13. username: root
    14. password: 123456
    15. slave_1:
    16. url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf8&useSSL=false
    17. driver-class-name: com.mysql.cj.jdbc.Driver
    18. username: root
    19. password: 123456
    • 创建用户service以及mapper接口

    通过@DS注解来设置当前的业务逻辑操作的是哪一个数据源

    1. public interface UserService extends IService {
    2. }
    1. @DS("master") //指定所操作的数据源
    2. @Service
    3. public class UserServiceImpl extends ServiceImpl implements
    4. UserService {
    5. }
    • 创建商品service以及mapper
    1. public interface ProductService extends IService {
    2. }
    1. @DS("slave_1")
    2. @Service
    3. public class ProductServiceImpl extends ServiceImpl
    4. implements ProductService {
    5. }
    • 测试
    1. @Autowired
    2. private UserService userService;
    3. @Autowired
    4. private ProductService productService;
    5. @Test
    6. public void testDynamicDataSource(){
    7. System.out.println(userService.getById(1L));
    8. System.out.println(productService.getById(1L));
    9. }

    如果我们实现读写分离,将写操作方法加上主库数据源,读操作方法加上从库数据源

    MyBatisX

            MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率 但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题,例如一些复杂的SQL,多表 联查,我们就需要自己去编写代码和SQL语句,这个时候可以使用MyBatisX插件。

            当我们使用了MyBatisX的时候,我们就可以快速的去定位到mapper接口所对应的映射文件以及映射文件所对应的mapper接口。

    代码快速生成

    • 连接数据库

    • 生成代码

    •  基础设置

    •  设置mapper接口和映射文件

    •  生成结果

    • 快速生成CRUD

            我们先来生成一个添加的方法,不需要去写返回值,只需要后来写方法名就行,然后我们需要把方法名给写出来,这个时候mybatisx就可以根据方法名快速的帮助我们去生成相对应的sql语句(见面识义)。

     Alt+Enter自动补全方法

            当我们创建一个方法后,mybatisx会把我们当前接口中的方法跟映射文件中的sql进行关联,如果这个接口的方法没有相对应的sql语句的话,它就会直接报错。

    映射文件中的sql:

    更多例子: 

    更多用法:MybatisX快速开发插件 | MyBatis-Plus (baomidou.com)icon-default.png?t=M666https://baomidou.com/pages/ba5b24/#%E5%8A%9F%E8%83%BD

  • 相关阅读:
    Spring Boot魔法:简化Java应用的开发与部署
    innovus: clock cell spacing如何设置?
    【Linux】——select详解
    pytorch环境、jupyter、pycharm
    Java零基础入门-如何代码模拟斗地主洗牌发牌动作(上)?
    LeetCode150. 逆波兰表达式求值
    Python旅游门票收费问题
    免费生成证书
    vue项目打包成H5apk中使用语音播放
    Windows10 下载并编译指定版本chromium源码
  • 原文地址:https://blog.csdn.net/m0_52601969/article/details/125992404