MyBatis-Plus


一、快速开始

1. 创建数据库

  • mybatis-plus
    在这里插入图片描述

DROP TABLE IF EXISTS user;

CREATE TABLE user 
(
	id BIGINT(20) NOT NULL COMMENT '主键ID',
	name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
	age INT(11) NULL DEFAULT NULL COMMENT '年龄',
	email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY (id)
);
-- version(乐观锁)、deleted(逻辑删除)、gmt_create、gmt_modified

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

2. 新建项目

  • mybatis-plus

2.1 POM
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

2.2 YML
## MySQL 5 驱动 com.mysql.jdbc.Driver
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://192.168.91.132:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8
#spring.datasource.username=root
#spring.datasource.password=123456

## MySQL 8 驱动 com.mysql.cj.jdbc.Driver,增加时区的配置 &serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.91.132:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

2.3 User
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

2.4 UserMapper
// 代表持久层
@Repository
public interface UserMapper extends BaseMapper<User> {
    // 所有的CRUD操作都已经编写完成了
}

2.5 主启动
@SpringBootApplication
// 扫描 mapper 文件夹
@MapperScan("com.qs.mybatis_plus.mapper")
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }
}

3. 配置日志

3.1 YML
## 配置日志(控制台输出)
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

二、CRUD 接口

1. 插入操作


1.1 @TableId

@TableId(type = IdType.AUTO):主键自增
@TableId(type = IdType.NONE):未设置主键
@TableId(type = IdType.INPUT):手动输入
@TableId(type = IdType.ID_WORKER):雪花算法
@TableId(type = IdType.UUID):UUID
@TableId(type = IdType.ID_WORKER_STR):ID_WORKER 字符串表示法


1.2 主键生成策略
  1. snowflake 是 Twitter 开源的 分布式 ID 生成算法,结果是一个 long 型的 ID。
  2. 其核心思想是:
  1. 使用 41bit 作为毫秒数。
  2. 10bit 作为机器的 ID(5个bit 是数据中心,5个bit 的机器ID)。
  3. 12bit 作为毫秒内的流水号(意味着每个节点,在每毫秒可以产生 4096 个ID)。
  4. 最后还有一个符号位,永远是0。

2. 自动填充

2.1 数据库加字段
  • gmt_created:自动填充
  • gmt_create_time:自动填充
  • gmt_modified
  • gmt_update_time
    在这里插入图片描述

2.2 User
// 字段添加填充内容
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;

2.3 MyMetaObjectHandler
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    // 更新时的填充策略
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

3. 乐观锁

  • 乐观锁:
    故名思意 十分乐观,它总是认为不会出现问题。
    无论干什么不去上锁,如果出现了问题,再次更新值测试。
  • 悲观锁:
    故名思意 十分悲观,它总是认为总是出现问题。
    无论干什么都会上锁,再去操作。

3.1 数据库加字段
  • version:版本
    在这里插入图片描述

3.2 User
// 乐观锁
@Version
private Integer version;

3.3 MybatisPlusConfig
// 配置类
@Configuration
// 开启事务管理(默认自动开启)
@EnableTransactionManagement
// 扫描 mapper 文件夹
@MapperScan("com.qs.mybatis_plus.mapper")
public class MybatisPlusConfig {

    // 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

4. 分页查询

4.1 MybatisPlusConfig
// 分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
    return  new PaginationInterceptor();
}

5. 逻辑删除

  • 物理删除:从数据库中直接移除。
  • 逻辑删除:数据库中没有被移除,而是通过一个变量来让他失效。
    deleted = 0 => deleted = 1。

5.1 数据库加字段

在这里插入图片描述


5.2 User
// 逻辑删除
@TableLogic
private Integer deleted;

5.3 MybatisPlusConfig
// 逻辑删除插件
@Bean
public ISqlInjector sqlInjector() {
    return new LogicSqlInjector();
}

5.4 YML
## 配置逻辑删除
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

6. 性能分析


6.1 MybatisPlusConfig
// SQL执行效率插件
@Bean
// 设置 dev test 环境开启,保证我们的效率
@Profile({"dev", "test"})
public PerformanceInterceptor performanceInterceptor() {
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    // 100ms 设置sql执行的最大时间,如果超过了抛出异常
    performanceInterceptor.setMaxTime(500);
    // true SQL格式化
//        performanceInterceptor.setFormat(true);
    return performanceInterceptor;
}

6.2 YML
## 设置开发环境
spring.profiles.active=dev

7. 代码生成器

7.1 POM
<!--mybatis-plus-generator-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.0.5</version>
</dependency>
<!--velocity-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

7.2 CodeAutoGenerator
public class CodeAutoGenerator {

    public static void main(String[] args) {
        // 代码自动生成器对象
        AutoGenerator mpg = new AutoGenerator();

        // 1. 全局配置
        GlobalConfig gc = new GlobalConfig();
        // 获取项目目录
        String projectPath = System.getProperty("user.dir");
        // Code目录
        gc.setOutputDir(projectPath + "/src/main/java");
        // 作者注释
        gc.setAuthor("qs");
        // 是否打开资源管理器
        gc.setOpen(false);
        // 是否覆盖
        gc.setFileOverride(true);
        // 去除IService的前缀I
//        gc.setServiceName("%sService");
        // Id类型
        gc.setIdType(IdType.ID_WORKER);
        // 日期类型
        gc.setDateType(DateType.ONLY_DATE);
        // 是否配置Swagger文档
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        // 2. 设置数据源
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUrl("jdbc:mysql://192.168.91.132:3306/mybatis-plus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 3. 包的配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.qs");
        // 模块名称
        pc.setModuleName("learn");
        pc.setEntity("entity");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setController("controller");
        mpg.setPackageInfo(pc);

        // 4. 策略配置
        StrategyConfig strategy = new StrategyConfig();
        // 设置要映射的表名
        strategy.setInclude("role", "permissions");
        // 下划线转驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 下划线转驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 自动Lombok
        strategy.setEntityLombokModel(true);
        // 逻辑删除
        strategy.setLogicDeleteFieldName("deleted");
        // 自动填充配置
//        strategy.setEntityTableFieldAnnotationEnable(true);
        TableFill gmtCreated = new TableFill("gmt_created", FieldFill.INSERT);
        TableFill gmtCreateTime = new TableFill("gmt_create_time", FieldFill.INSERT);
        TableFill gmtModified = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
        TableFill gmtUpdateTime = new TableFill("gmt_update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> tableFills = new ArrayList<>();
        tableFills.add(gmtCreated);
        tableFills.add(gmtCreated);
        tableFills.add(gmtCreateTime);
        tableFills.add(gmtModified);
        tableFills.add(gmtUpdateTime);
        strategy.setTableFillList(tableFills);
        // 乐观锁
        strategy.setVersionFieldName("version");
        // 开启RestControllerS驼峰命名
        strategy.setRestControllerStyle(true);
        // 开启下划线URL:localhost:8080/hello_id_2
        strategy.setControllerMappingHyphenStyle(true);
        mpg.setStrategy(strategy);

        // 执行
        mpg.execute();
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑士梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值