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

我们要想把哪一个属性的值存储到数据库当中,我们就在这个属性上面添加一个注解@EnumValue,将注解所标识的属性的值存储到数据库中。
- 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;
- }
- }
还需要再配置文件当中设置一个扫描通用枚举,只有通过扫描之后让mp知道扫描是谁,这个时候才能够将当前所添加的这个注解的功能来进行解析。
- mybatis-plus:
- configuration:
- # 配置MyBatis日志
- log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- global-config:
- db-config:
- # 配置MyBatis-Plus操作表的默认前缀
- table-prefix: t_
- # 配置MyBatis-Plus的主键策略
- id-type: auto
- # 配置扫描通用枚举
- type-enums-package: com.zqf.mybatisplus.enums
MP来使用通用枚举的话,只有两个操作,第一个操作我们在枚举中,把某一个属性的值存储到数据库中,直接把这个属性上添加@EnumValue,然后再在配置文件中来扫描咱们的枚举就可以了。
- @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)
- userMapper.insert(user);
- }
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-generatorartifactId>
- <version>3.5.1version>
- dependency>
- <dependency>
- <groupId>org.freemarkergroupId>
- <artifactId>freemarkerartifactId>
- <version>2.3.31version>
- dependency>
- package com.zqf.mybatisplus;
-
- import java.util.Collections;
-
- 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", "123456")
- .globalConfig(builder -> {
- builder.author("zqf") // 设置作者
- //.enableSwagger() // 开启 swagger 模式
- .fileOverride() // 覆盖已生成文件
- .outputDir("D://mybatis_plus"); // 指定输出目录
- })
- .packageConfig(builder -> {
- builder.parent("com.zqf") // 设置父包名
- .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();
- }
- }
适用于多种场景:纯粹多库(工程中所操作的表分散在不同的数据库当中)、 读写分离(有的数据库专门实现读的功能,有的数据库专门实现写的功能)、 一主多从、 混合模式等。
我们创建两个库,第一个是我们之前所使用的mybatis_plus,第二个是mybatis_plus1,然后我们把user表放在咱们以前的mybatis_plus中,然后把product表放在mybatis_plus1中,然后这个时候通过MP设置的多数据源之后,来测试一下看能否从这两个数据库中来读取到数据。
- 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)
- );
-
- INSERT INTO product (id, NAME, price) VALUES (1, '外星人笔记本', 100);
-
- --删除原本mybatis_plus库product表
- use mybatis_plus;
- DROP TABLE IF EXISTS product;
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>dynamic-datasource-spring-boot-starterartifactId>
- <version>3.5.0version>
- dependency>
说明:注释掉之前的数据库连接,添加新配置
- spring:
- # 配置数据源信息
- datasource:
- dynamic:
- # 设置默认的数据源或者数据源组,默认值即为master
- primary: master
- # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源(master)
- strict: false
- datasource:
- master:
- url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf8&useSSL=false
- driver-class-name: com.mysql.cj.jdbc.Driver
- username: root
- password: 123456
- slave_1:
- url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf8&useSSL=false
- driver-class-name: com.mysql.cj.jdbc.Driver
- username: root
- password: 123456
-
通过@DS注解来设置当前的业务逻辑操作的是哪一个数据源
- public interface UserService extends IService
{ - }
- @DS("master") //指定所操作的数据源
- @Service
- public class UserServiceImpl extends ServiceImpl
implements - UserService {
- }
- public interface ProductService extends IService
{ - }
- @DS("slave_1")
- @Service
- public class ProductServiceImpl extends ServiceImpl
- implements ProductService {
- }
- @Autowired
- private UserService userService;
- @Autowired
- private ProductService productService;
- @Test
- public void testDynamicDataSource(){
- System.out.println(userService.getById(1L));
- System.out.println(productService.getById(1L));
- }
如果我们实现读写分离,将写操作方法加上主库数据源,读操作方法加上从库数据源
MyBatis-Plus为我们提供了强大的mapper和service模板,能够大大的提高开发效率 但是在真正开发过程中,MyBatis-Plus并不能为我们解决所有问题,例如一些复杂的SQL,多表 联查,我们就需要自己去编写代码和SQL语句,这个时候可以使用MyBatisX插件。
当我们使用了MyBatisX的时候,我们就可以快速的去定位到mapper接口所对应的映射文件以及映射文件所对应的mapper接口。





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

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

映射文件中的sql:
更多例子:


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