mybatis-plus快速使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mybatis-plus:无需SQL语句,只需mapper接口和实体类

mybatis-plus:无需SQL语句,只需mapper接口和实体类

快速入门

添加依赖

       <dependency>

           <groupId>com.baomidou</groupId>

           <artifactId>mybatis-plus-boot-starter</artifactId>

           <version>3.3.1.tmp</version>

       </dependency>

配置

1. yaml配置

application.yml 配置文件中添加mysql数据库的相关配置:

spring:

 datasource:

   url: jdbc:mysql://127.0.0.1:3306/ems?useUnicode=true&characterEncoding=utf8

   username: ggbond

   password: xxxx

   driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:

 configuration:

   log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #在控制台打印SQL语句

2. 包扫描路径

在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

@SpringBootApplication

@MapperScan("com.example.springboot_mybatis_plus.mapper")

publicclassSpringbootMybatisPlusApplication {

}

编码

1. 实体

entity包下,编写实体类 User.java(此处使用了 Lombok 简化代码)

数据表中字段为question_type,实体类中对应属性可写为questionType。mybatis-plus会自动将下划线转为驼峰

@Data

publicclassUser {

   Stringid;

   Stringusername;

   Stringrealname;

   Stringpassword;

   Stringsex;

}

2. mapper接口

mapper包下,编写Mapper接口 UserMapper.java,继承BaseMapper<T>泛型为要映射的实体类

publicinterfaceUserMapperextendsBaseMapper<User> {

}

在service中调用mapper

@SpringBootTest

classUserMapperTest {

   @Autowired

   privateUserMapperuserMapper;

   @Test

   voidtset01(){

       Useruser=userMapper.selectById(1);

       System.out.println(user);

   }

}

常用注解

@TableName

映射数据库的表名(实体类名与数据表名不同)

@Data

@TableName(value="user")

publicclassAccount {

   privateIntegerid;

   privateStringname;

   privateIntegerage;

}

@TableId

设置主键映射

  • value 映射主键字段名
  • type 设置主键类型,主键的生成策略。默认值 IdType.NONE
    IdType是枚举类

AUTO(0),

NONE(1),

INPUT(2),

ASSIGN_ID(3),

ASSIGN_UUID(4),

/** @deprecated */

@Deprecated

ID_WORKER(3),

/** @deprecated */

@Deprecated

ID_WORKER_STR(3),

/** @deprecated */

@Deprecated

UUID(4);

描述
AUTO 数据库自增
NONE MP set 主键,雪花算法实现
INPUT 需要开发者手动赋值
ASSIGN_ID MP 分配 ID,Long、Integer、String
ASSIGN_UUID 分配 UUID,Strinig
  • INPUT 如果开发者没有手动赋值,则数据库通过自增的方式给主键赋值,如果开发者手动赋值,则存入该值。
    AUTO 默认就是数据库自增,开发者无需赋值。
    ASSIGN_ID MP 自动赋值,雪花算法。
    ASSIGN_UUID 主键的数据类型必须是 String,自动生成 UUID 进行赋值

@TableField

映射非主键字段,

  • value 映射字段名
  • exist 表示是否为数据库字段 false,如果实体类中的成员变量在数据库中没有对应的字段,则可以使用 exist
  • select 表示是否查询该字段
  • fill 表示是否自动填充,将对象存入数据库的时候,由 MyBatis Plus 自动给某些字段赋值。例如创建时间、修改时间等

@Data

@TableName(value = "user")

public class User {

   @TableId

   private String id;

   @TableField(value = "name",select = false) //不查询当前字段

   private String title;

   private Integer age;

   @TableField(exist = false) //数据库无对应字段

   private String gender;

   @TableField(fill = FieldFill.INSERT) //在插入时填充字段

   private Date createTime;

   @TableField(fill = FieldFill.INSERT_UPDATE) //在插入和更新时填充字段

   private Date updateTime;

}

需要创建自动填充处理器,来设置填充内容

package com.southwind.mybatisplus.handler;

@Component

public class MyMetaObjectHandler implements MetaObjectHandler {

   //插入数据时,填充指定字段数据。metaObject就是实体类对象

   @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);

   }

}

@Version 乐观锁

标记乐观锁,通过 version 字段来保证数据的安全性,当修改数据的时候,会以 version 作为条件,当条件成立的时候才会修改成功。

# 保证线程安全,不同线程不能同时修改数据。以下线程只会执行一个

# 当version=1成立时,进行修改version=2

线程1 :update ... set version = 2  where version = 1


线程2 :update ... set version = 2 where version = 1

1、数据库表添加 version 字段,默认值为 1

2、实体类添加 version 成员变量,并且添加 @Version

package com.southwind.mybatisplus.entity;

@Data

@TableName(value = "user")

public class User {

   @TableId

   private String id;

   @TableField(value = "name",select = false)

   private String title;

   private Integer age;

   @TableField(exist = false)

   private String gender;

   @TableField(fill = FieldFill.INSERT)

   private Date createTime;

   @TableField(fill = FieldFill.INSERT_UPDATE)

   private Date updateTime;

   //乐观锁

   @Version

   private Integer version;

}

3、编写配置类。注册OptimisticLockerInterceptor乐观锁拦截器进容器

package com.southwind.mybatisplus.config;


@Configuration

public class MyBatisPlusConfig {

   

   @Bean

   public OptimisticLockerInterceptor optimisticLockerInterceptor(){

       return new OptimisticLockerInterceptor();

   }

}

@EnumValue

作用在枚举类成员变量上,将成员变量与数据库字段映射起来,根据数据库字段值找到枚举对象

1. 通用枚举类注解

例如:数据库status字段属性为1,通过SQL语句获取到的实体对象的status则是WORK

修改时也是通过枚举对象赋值

package com.southwind.mybatisplus.enums;


public enum StatusEnum {

   WORK(1,"上班"),

   REST(0,"休息");


   StatusEnum(Integer code, String msg) {

       this.code = code;

       this.msg = msg;

   }


   @EnumValue

   private Integer code;

   private String msg;

}

@Data

@TableName(value = "user")

public class User {

   ……

   private StatusEnum status;

}

application.yml中配置枚举包扫描:

type-enums-package:

 com.southwind.mybatisplus.enums

2. 实现IEnum接口

package com.southwind.mybatisplus.enums;


public enum AgeEnum implements IEnum<Integer> {

   ONE(1,"一岁"),

   TWO(2,"两岁"),

   THREE(3,"三岁");


   private Integer code;

   private String msg;


   AgeEnum(Integer code, String msg) {

       this.code = code;

       this.msg = msg;

   }


   @Override

   public Integer getValue() {

       return this.code;

   }

}

@TableLogic

逻辑删除(并非真的删除)

1、数据表添加 deleted 字段

2、实体类添加注解

@Data

@TableName(value = "user")

public class User {

   ……

   @TableLogic

   private Integer deleted;

}

3、application.yml 添加配置

global-config:

 db-config:

   logic-not-delete-value: 0

   logic-delete-value: 1

条件构造器

       QueryWrapper wrapper = new QueryWrapper();

//wrapper中可以构造诸多条件。wrapper为null,则为没有条件

       wrapper.eq("id", 1);

       Mayuan mayuan = mayuanMapper.selectOne(wrapper);

       System.out.println(mayuan);

分页

1.在配置类中,将分页拦截器添加进容器

package cn.upeveryday.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;


@Configuration

public class MyBatisPlusConfig {


   @Bean

   public PaginationInterceptor paginationInterceptor(){

       return new PaginationInterceptor();

   }

}

2.分页查询编码

       //分页查询:封装page对象,根据page对象和条件查询;得到的还是page对象,调用getRecords获取数据

       Page<Mayuan>  mayuanPage=new Page<>(page, limit);

       Page<Mayuan> result = mayuanMapper.selectPage(mayuanPage, null);

       List<Mayuan> mayuanList=result.getRecords();

3.4.0以上MP的分页设置有所更新

@Configuration

public class MyBatisPlusConfig {

   

   /*  旧版本配置

   @Bean

   public PaginationInterceptor paginationInterceptor(){

       return new PaginationInterceptor();

   }*/

 

   /**

    * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题

    */

   @Bean

   public MybatisPlusInterceptor mybatisPlusInterceptor() {

       MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

       interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

       return interceptor;

   }

 

   @Bean

   public ConfigurationCustomizer configurationCustomizer() {

       return configuration - configuration.setUseDeprecatedExecutor(false);

   }

}

自定义 SQL(多表连接查询)

将两个表的连接查询结果封装到一个对象中

package com.southwind.mybatisplus.entity;


import lombok.Data;


@Data

public class ProductVO {

   private Integer category;

   private Integer count;

   private String description;

   private Integer userId;

   private String userName;

}

在mapper接口中写自定义SQL语句,在业务层调用方法即可

package com.southwind.mybatisplus.mapper;


public interface UserMapper extends BaseMapper<User> {

   //对name取别名为username,否则映射不到

   @Select("select p.*,u.name userName from product p,user u where p.user_id = u.id and u.id = #{id}")

   List<ProductVO> productList(Integer id);

}

代码自动生成

根据数据表自动生成实体类、Mapper、Service、ServiceImpl、Controller

1. 添加依赖

添加 代码生成器 依赖和 模板引擎 依赖

<dependency>

           <groupId>com.baomidou</groupId>

           <artifactId>mybatis-plus-boot-starter</artifactId>

           <version>3.3.1.tmp</version>

</dependency>

<dependency>

   <groupId>com.baomidou</groupId>

   <artifactId>mybatis-plus-generator</artifactId>

   <version>3.3.1.tmp</version>

</dependency>

<dependency>

   <groupId>org.apache.velocity</groupId>

   <artifactId>velocity</artifactId>

   <version>1.7</version>

</dependency>

自动生成的模板:Velocity(默认)、Freemarker、Beetl

2. 配置类

启动类中的数据库配置只是在生成时起作用,运行代码还是需要配置yaml文件的

直接运行main方法,即可自动生成

package cn.upeveryday;


import com.baomidou.mybatisplus.annotation.DbType;

import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.config.DataSourceConfig;

import com.baomidou.mybatisplus.generator.config.GlobalConfig;

import com.baomidou.mybatisplus.generator.config.PackageConfig;

import com.baomidou.mybatisplus.generator.config.StrategyConfig;

import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;


public class CodeGenerator {

   public static void main(String[] args) {

//创建generator对象,对对象进行操作

       AutoGenerator autoGenerator = new AutoGenerator();

//数据源

       DataSourceConfig dataSourceConfig = new DataSourceConfig();

       dataSourceConfig.setDbType(DbType.MYSQL);

       dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/myblog?useUnicode=true&characterEncoding=UTF-8");

       dataSourceConfig.setUsername("root");

       dataSourceConfig.setPassword("123456");

       dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");

       //将数据源添加进自动生成器

       autoGenerator.setDataSource(dataSourceConfig);

//全局配置

       GlobalConfig globalConfig = new GlobalConfig();

       //生成的位置。System.getProperty("user.dir"):拿到项目的绝对路径

       globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");

       //创建文件后不自动打开

       globalConfig.setOpen(false);

       //作者

       globalConfig.setAuthor("ggbond");

       //设置service接口的名字:不携带I

       globalConfig.setServiceName("%sService");

       autoGenerator.setGlobalConfig(globalConfig);

//包信息

       PackageConfig packageConfig = new PackageConfig();

       //父包

       packageConfig.setParent("cn.upeveryday");

       //在父包下生成文件夹,自动生成的文件都在其中

//        packageConfig.setModuleName("generator");

       packageConfig.setController("controller");

       packageConfig.setService("service");

       packageConfig.setServiceImpl("service.impl");

       packageConfig.setMapper("mapper");

       packageConfig.setEntity("entity");

       autoGenerator.setPackageInfo(packageConfig);

//配置策略

       StrategyConfig strategyConfig = new StrategyConfig();

       //自动配置lombok注解

       strategyConfig.setEntityLombokModel(true);

       //设置列名:下划线转驼峰

       strategyConfig.setNaming(NamingStrategy.underline_to_camel);

       strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);

       //设置表前缀,创建表对应实体时,会自动去掉前缀

       strategyConfig.setTablePrefix("tb_");

       //设置要生成的表

//        strategyConfig.setInclude("t_blog","t_blogger","t_blogtype","t_comment");

       strategyConfig.setExclude("");//都生成

       autoGenerator.setStrategy(strategyConfig);


       autoGenerator.execute();

   }

}

事务

  1. 在springboot中使用事务,首先引入依赖spring-tx,但是mybatis-plus的依赖中已经引入,因此又少了一步
  2. 开启事务,在Springboot的启动类,或者某个@Configuration的类上加上@EnableTransactionManagement开启事务。因为这是数据库相关,所以我加在了mybatis-plus的配置类上
  3. 只要在需要使用事务的方法上加上@Transactional就可以开启事务了,还是很简单的

@Configuration

@EnableTransactionManagement

public class MyBatisPlusConfig {

   //分页插件

   @Bean

   public PaginationInterceptor paginationInterceptor(){

       return new PaginationInterceptor();

   }

}

@Transactional默认回滚的是RuntimeException也就是说如果抛出的不是RuntimeException的异常,数据库是不会回滚的。但是所幸的是,在spring框架下,所有的异常都被org.springframework重写为RuntimeException,因此不需要太担心

VO

当实体类的属性跟前端页面要求的不同,就要用到vo

根据前端要求,再封装一个实体类


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
SQL Java 数据库连接
|
SQL Java 数据库连接
|
SQL Java 数据库连接
|
SQL Java 数据库连接
|
1月前
|
SQL 缓存 Java
MyBatis系列
MyBatis系列
|
11月前
|
Java 数据库连接 数据库
Mybatis及Mybatis-Plus使用
Mybatis及Mybatis-Plus使用
762 2
Mybatis及Mybatis-Plus使用
|
SQL Java 数据库连接
14MyBatis - MyBatis介绍
14MyBatis - MyBatis介绍
41 0
|
XML Java 数据库连接
MyBatis-Plus
MyBatis-Plus
57 0
|
SQL Java 数据库连接
|
SQL 前端开发 安全
Mybatis(一)
Mybatis(一)
167 0
Mybatis(一)