将一个Mybatis技术升级成MybatisPlus

本文介绍了如何在SpringBoot项目中引入MybatisPlus依赖,配置application.yml文件,扫描Mapper接口,以及如何使用CRUD接口和定制表名、主键策略。详细讲解了如何在实体类上添加注解以匹配数据库表结构。
摘要由CSDN通过智能技术生成

一、引入依赖

引入MybatisPlus依赖,将Mybatis依赖注释,因为MybatisPlus依赖覆盖Mybatis依赖

引用官方的一句话:

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>

适当还能添加一些工具包依赖

<!-- Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。  -->
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.25</version>
</dependency>

<!-- 代码生成器 -->
<!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.5</version>
</dependency>

二、配置application.yml

将原本的mybatis的配置注释,替换新配置

注意:type-aliases-package里面是项目实体类的路径,对应mapper的操作对象

#mybatis:
#  #mapper配置文件
#  mapper-locations: classpath:mapper/*.xml
#  type-aliases-package: com.sky.entity
#  configuration:
#    #开启驼峰命名
#    map-underscore-to-camel-case: true

mybatis-plus:
  type-aliases-package: com.sky.entity
  global-config:
    db-config:
      id-type: auto #配置实体类中id默认自增
      logic-delete-field: deleted # 配置逻辑删除字段
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
 

mybatis-plus: mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,当前这个是默认值。

可以看到默认值是classpath*:/mapper/**/*.xml,也就是说我们只要把mapper.xml文件放置这个目录下就一定会被加载。

 在之前数据库的配置项里面加上&rewriteBatchedStatements=true 实现mp的批处理

  datasource:
#    &rewriteBatchedStatements=true 批处理,在下面的url里面添加
    url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    driver-class-name: com.mysql.cj.jdbc.Driver

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

@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching//开启缓存注解功能
@EnableScheduling//开启任务调度
@MapperScan("com.sky.mapper")
public class QupaiServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(QupaiServerApplication.class, args);
        log.info("server started");
    }

}

 三、在需要使用mp的mapper接口上继承BaseMapper<xxx>

上面xxx表示该接口操作对应的实体类

@Mapper
public interface OrderMapper extends BaseMapper<Orders> {}

 四、CRUD接口

先说service和serviceImpl应该继承什么

//service
public interface OrderService extends IService<Orders> {}


//serviceImpl
@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper,Orders> implements OrderService {}

extends IService<Orders>里面的Orders指的是对应操作的对象

extends ServiceImpl<OrderMapper,Orders>里面的指的是该对象对应的mapper和该对象

 五、有需要的话还有必要的注解加在对象的类里面

MybatisPlus就是根据PO实体的信息来推断出表的信息,从而生成SQL的。默认情况下:

  • MybatisPlus会把PO实体的类名驼峰转下划线作为表名

  • MybatisPlus会把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型

  • MybatisPlus会把名为id的字段作为主键

 但很多情况下,默认的实现与实际场景不符,因此MybatisPlus提供了一些注解便于我们声明表信息

@TableName

  • 描述:表名注解,标识实体类对应的表

  • 使用位置:实体类

@TableName("user")
public class User {
    private Long id;
    private String name;
}

TableName注解除了指定表名以外,还可以指定很多其它属性:

属性

类型

必须指定

默认值

描述

value

String

""

表名

schema

String

""

schema

keepGlobalPrefix

boolean

false

是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时)

resultMap

String

""

xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定)

autoResultMap

boolean

false

是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)

excludeProperty

St

ring[]

{}

需要排除的属性名 @since 3.3.1

@TableId

  • 描述:主键注解,标识实体类中的主键字段

  • 使用位置:实体类的主键字段

@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
}

TableId注解支持两个属性:

属性

类型

必须指定

默认值

描述

value

String

""

表名

type

Enum

IdType.NONE

指定主键类型

IdType支持的类型有:

描述

AUTO

数据库 ID 自增

NONE

无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

INPUT

insert 前自行 set 主键值

ASSIGN_ID

分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)

ASSIGN_UUID

分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

ID_WORKER

分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)

UUID

32 位 UUID 字符串(please use ASSIGN_UUID)

ID_WORKER_STR

分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)

这里比较常见的有三种:

  • AUTO:利用数据库的id自增长

  • INPUT:手动生成id

  • ASSIGN_ID:雪花算法生成Long类型的全局唯一id,这是默认的ID策略

@TableField 

描述:普通字段注解

@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    @TableField("isMarried")
    private Boolean isMarried;
    @TableField("concat")
    private String concat;
}

一般情况下我们并不需要给字段添加@TableField注解,一些特殊情况除外:

  • 成员变量名与数据库字段名不一致

  • 成员变量是以isXXX命名,按照JavaBean的规范,MybatisPlus识别字段时会把is去除,这就导致与数据库不符。

  • 成员变量名与数据库一致,但是与数据库的关键字冲突。使用@TableField注解给字段名添加转义字符:``

支持的其它属性如下:

属性

类型

必填

默认值

描述

value

String

""

数据库字段名

exist

boolean

true

是否为数据库表字段

condition

String

""

字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window)

update

String

""

字段 update set 部分注入,例如:当在version字段上注解update="%s+1" 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)

insertStrategy

Enum

FieldStrategy.DEFAULT

举例:NOT_NULL insert into table_a(<if test="columnProperty != null">column</if>) values (<if test="columnProperty != null">#{columnProperty}</if>)

updateStrategy

Enum

FieldStrategy.DEFAULT

举例:IGNORED update table_a set column=#{columnProperty}

whereStrategy

Enum

FieldStrategy.DEFAULT

举例:NOT_EMPTY where <if test="columnProperty != null and columnProperty!=''">column=#{columnProperty}</if>

fill

Enum

FieldFill.DEFAULT

字段自动填充策略

select

boolean

true

是否进行 select 查询

keepGlobalFormat

boolean

false

是否保持使用全局的 format 进行处理

jdbcType

JdbcType

JdbcType.UNDEFINED

JDBC 类型 (该默认值不代表会按照该值生效)

typeHandler

TypeHander

类型处理器 (该默认值不代表会按照该值生效)

numericScale

String

""

指定小数点后保留的位数

MyBatis Plus 是基于 MyBatis 的增强工具,提供了更加便捷的开发方式。如果你想将项目中的 MyBatis 升级MyBatis Plus,可以按照以下步骤进行操作: 1. 添加 MyBatis Plus 依赖:在项目的 `pom.xml`(如果是 Maven 项目)或者 `build.gradle`(如果是 Gradle 项目)文件中添加 MyBatis Plus 的依赖。 2. 修改 MyBatis 的配置文件:将原先的 MyBatis 配置文件中的相关配置修改为 MyBatis Plus 的配置方式。具体的修改内容可以参考 MyBatis Plus 的官方文档。 3. 重新生代码:如果你使用了 MyBatis Generator 来自动生代码,需要重新运行生器来生基于 MyBatis Plus 的代码。这样可以确保生的实体类、Mapper 接口等与 MyBatis Plus 的使用方式保持一致。 4. 修改业务代码:对于已经编写好的业务代码,你可能需要进行一些修改以适应 MyBatis Plus 的使用方式。例如,替换原先使用的 MyBatis 接口和注解为 MyBatis Plus 提供的对应接口和注解。 5. 测试和调试:在修改完代码后,建议进行全面的测试和调试,确保升级后的项目正常运行,并且功能正常。 6. 学习和使用新特性:MyBatis Plus 提供了很多便捷的特性和功能,可以节省开发时间和提高开发效率。你可以花些时间学习和使用这些新特性,以充分发挥 MyBatis Plus 的优势。 需要注意的是,升级 MyBatisMyBatis Plus 并不会改变原有的 MyBatis 逻辑和使用方式,而是在其基础上提供更多的便利功能。因此,升级过程中需要仔细检查和修改相关代码,确保没有遗漏或者冲突的地方。另外,建议先在一个小规模的项目上进行升级测试,再应用到大型项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乄bluefox

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

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

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

打赏作者

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

抵扣说明:

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

余额充值