Springboot3 Mybatis-plus 3.5.9

1. Mybatis-plus

官网:链接

1. 依赖

复制代码
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  <version>3.5.9</version>
</dependency>

2. 注解配置表名、字段名

一般情况下,数据库映射为实体类对应关系

  1. 数据库表与实体类类名:下划线转为驼峰
  2. 实体类中的id字段对应数据库中的主键字段id
  3. 表中列名与实体类属性名:下划线转驼峰

如不满足以上条件,需在实体类中使用注解

  1. 表名注解:@TableName:用来指定表名

  2. 指定主键:@TableId 指定表中的主键

  3. 实体类属性注解:@TableField 指定表中的字段信息

    // 指定该实体类对应的表名是t_vip

    @TableName("t_vip")

    public class Vip {

    // 指定该属性为主键,且在数据表中的列名为id,且自增

    @TableId(value = "id", type = IdType.AUTO)

    private Long vid;

    // 指定该属性对应表中的username列

    @TableField(value = "username")

    private String name;

    // 数据表中不存在该属性对应的列

    @TableField(exist = false)

    private String birthday;

    }

@TableId:常见类型

  • 主键最好指定类型,默认是type = IdType.ASSIGN_ID

    复制代码
    @TableId(type = IdType.AUTO)  // 主键自增,数据库自动生成
    @TableId(type = IdType.INPUT) // 通过set方法自行输入,例如uuid作为主键,需要手动赋值
    @TableId( type = IdType.ASSIGN_ID)  // 通过接口生成主键,由mybatis-plus自动生成

@TableField:常见场景

  1. 实体类属性与数据库表中字段不一致,

    复制代码
    // 属性是name,表中是username
    @TableField("username")
    private String name;
  2. 表中以is开头并且是boolean值

    // 表中字段名:is_ban,映射的属性名为ban

    @TableField("is_ban")

    private Boolean name;

  3. 属性名与数据库的关键字一致

    // order在数据库中是关键字,注意使用了 ``

    @TableField("order")

    private String order;

  4. 属性并不属于数据库表中的字段

    复制代码
    // 数据表中不存在该属性对应的列
    @TableField(exist = false)
    private String birthday;

3. yml中的配置

官方:链接

  • 很多默认配置已经足够了

    mybatis-plus:

    type-aliases-package: org.example.learn.domain # 实体类包

    global-config:

    db-config:

    id-type: auto # id生成策略:自增长

    logic-delete-field: deleted # 表中的逻辑删除字段名

    logic-delete-value: 1 # 逻辑已删除值(默认为 1)

    logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

    banner: false # 是否在控制台打印 MyBatis-Plus 的 LOGO

    configuration:

    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler # 枚举类型处理器

4. mapper和service的用法

  1. mapper:继承BaseMapper接口

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;

    import org.apache.ibatis.annotations.Mapper;

    import org.example.learn.bean.User; // 实体类

    @Mapper

    public interface UserMapper extends BaseMapper {

    }

  2. service:继承IService接口

    import com.baomidou.mybatisplus.extension.service.IService;

    import org.example.learn.bean.User; // 实体类

    public interface UserService extends IService {

    }

  3. service的实现类seviceImpl:继承ServiceImpl

ServiceImpl:两个泛型

复制代码
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.learn.bean.User;
import org.example.learn.dao.UserMapper;
import org.example.learn.service.UserService;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}

2. 使用工具生成mapper和service

3. 逻辑删除

  • 在实际应用中很多数据是不能删除的,比如:订单信息,mybatis-plus提供了逻辑删除
  • 逻辑删除:使用数据表中的某一个列,通过列的值表示该数据是否被删除

1. 需要在yml中配置

复制代码
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 表中的逻辑删除字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

2. 代码

代码还是使用正常的删除和查询操作,mybaits-plus在删除时实际使用的是updata操作,查询时总是会把标志位作为条件带入

  1. 使用remove方法删除时,mybatis-plus使用了updata方法更新了逻辑删除的列

    复制代码
    addressService.removeById(59L);
    /*
    * ==>  Preparing: UPDATE address SET deleted=1 WHERE id=? AND deleted=0
    *  ==> Parameters: 59(Long)
    *  <==    Updates: 0
    * */
  2. 查询时也会自动添加逻辑删除标志位为未删除的条件

    复制代码
    Address address = addressService.getById(59L);
    /*
    * ==>  Preparing: SELECT id,user_id,province,city,town,mobile,street,contact,is_default,notes,deleted FROM address WHERE id=? AND deleted=0
    * ==> Parameters: 59(Long)
    * <==      Total: 0
    * */

4. json类型映射对象

在数据表中类型格式为json,在查询、新增、更新等操作时,此数据转为对象形式

1. 定义json类型字段内容对应的类

复制代码
{"age": 20, "intro": "佛系青年", "gender": "male"}

@Data
public class UserInfo {
  private Integer age;
  private String intro;
  private String gender;

}

2. 在数据表对应的类属性和类上加注解

  • 类上注解:@TableName(autoResultMap = true)

  • 属性注解:@TableField(typeHandler = JacksonTypeHandler.class)

    @Data

    //@Accessors(chain = true)

    @TableName(autoResultMap = true)

    public class User implements Serializable {

    /**

    * 详细信息

    */

    @TableField(typeHandler = JacksonTypeHandler.class)

    private UserInfo info;

    }

3. 在查询后返回的结果就是对象形式

5. 自动映射枚举

经常使用数字或布尔值代表一种状态,每次查询或新增时都需要对照状态表来解释状态码。

例如:

复制代码
  //  private Boolean gender; // 男/女
    private Integer status;	// 使用状态(1正常 2冻结)

1. 配置yml

复制代码
mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

2. 创建枚举类映射

复制代码
@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结");

    @EnumValue // 在数据库存/取的值是code的属性值
    private final Integer code;
    @JsonValue  // 在序列化时返回的JSON中显示的属性值
    private final String desc;

    UserStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

}

3. 修改数据表对应的实体类中该属性的类型

复制代码
    /**
     * 使用状态(1正常 2冻结)
     */
    private UserStatus status;

4. 使用

复制代码
    // 1. 查询id是否存在
    User user = this.getById(id);
    if (user == null || user.getStatus() == UserStatus.FREEZE) {
      throw new RuntimeException("用户不存在或已经被禁用");
    }

6. 创建时间和修改时间自动填充

  • 在创建和修改是自动填写时间

    // 实体类中的属性,启用自动填充

    /**

    * 创建时间

    */

    // FieldFill.INSERT:只有在insert操作时才会使用自定义的处理器

    @TableField(fill = FieldFill.INSERT)

    private LocalDateTime createTime;

    复制代码
    /**
     * 更新时间
     */
     // FieldFill.INSERT_UPDATE :插入和更新操作都会使用自定义的处理器
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime
  • 定义处理器

    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

    import org.apache.ibatis.reflection.MetaObject;

    import org.springframework.stereotype.Component;

    import java.time.LocalDateTime;

    @Component

    public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override

    // insert操作时会同时更新createTime 和 updateTime

    public void insertFill(MetaObject metaObject) {

    // 检查create_time字段是否为null,如果是,设置为当前时间

    LocalDateTime createTime = (LocalDateTime) getFieldValByName("createTime", metaObject);

    if (createTime == null) {

    setFieldValByName("createTime", LocalDateTime.now(), metaObject);

    }

    LocalDateTime updateTime = (LocalDateTime) getFieldValByName("updateTime", metaObject);

    if ( updateTime == null) {

    setFieldValByName("updateTime", LocalDateTime.now(), metaObject);

    }

    }

    @Override

    public void updateFill(MetaObject metaObject) {

    // 如果有更新时间字段,如update_time,可以在这里处理填充逻辑

    LocalDateTime updateTime = (LocalDateTime) getFieldValByName("updateTime", metaObject);

    if (updateTime == null) {

    setFieldValByName("updateTime", LocalDateTime.now(), metaObject);

    }

    }

    }

pom中所有的依赖

复制代码
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.11</version>
        </dependency>
        <!--swagger-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
相关推荐
2301_8135995542 分钟前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
NCIN EXPE5 小时前
redis 使用
数据库·redis·缓存
MongoDB 数据平台5 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路5 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家5 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver
lThE ANDE5 小时前
开启mysql的binlog日志
数据库·mysql
yejqvow126 小时前
CSS如何控制placeholder文字的颜色_使用--placeholder伪元素
jvm·数据库·python
oLLI PILO6 小时前
nacos2.3.0 接入pgsql或其他数据库
数据库
m0_743623926 小时前
HTML怎么创建多语言切换器_HTML语言选择下拉结构【指南】
jvm·数据库·python