将一个Mybatis技术升级成MybatisPlus

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引入依赖

引入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

""

指定小数点后保留的位数

### 同时集和使用 MyBatisMyBatis-Plus 的可行性及最佳实践 #### 1. **MyBatisMyBatis-Plus 的关系** MyBatis-PlusMyBatis 的增强工具集,它在保留 MyBatis 核心功能的基础上提供了更多便捷的功能,例如通用 CRUD、分页插件以及代码生器等。理论上,MyBatis-Plus 并不会完全取代 MyBatis,而是作为其补充[^1]。 这意味着在同一项目中同时引入两者是可行的,但在实际应用过程中需要注意一些兼容性问题。 --- #### 2. **依赖冲突与版本管理** 为了确保两者的正常工作,需注意以下几点: - 添加 MyBatis-Plus 依赖的同时应移除可能存在的旧版 MyBatis 依赖,防止因版本冲突而导致运行错误。 ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> <!-- 版本号根据实际情况调整 --> </dependency> ``` - 若某些模块仍需单独使用原生 MyBatis 功能,则可以通过自定义 Mapper 接口继承 `org.apache.ibatis.annotations.Mapper` 而非 `com.baomidou.mybatisplus.core.mapper.BaseMapper` 来区分不同类型的 DAO 层实现[^4]。 --- #### 3. **配置分离** 为了避免混淆,建议将 MyBatisMyBatis-Plus 的相关配置分开管理。例如,在 Spring Boot 配置文件中分别指定各自的扫描路径: ```yaml # MyBatis 配置 mybatis: mapper-locations: classpath:mapper/mybatis/*.xml type-aliases-package: com.example.domain.mybatis # MyBatis-Plus 配置 mybatis-plus: mapper-locations: classpath:mapper/mybatis-plus/*.xml type-aliases-package: com.example.domain.myplus ``` 这样可以清晰地区分传统 MyBatis 映射文件与 MyBatis-Plus 自动生的内容[^1]。 --- #### 4. **事务一致性** 当两个框架共存时,必须保证事务的一致性和隔离级别。通常推荐在整个项目范围内统一声明事务管理器(Transaction Manager),并通过 AOP 或者注解形式控制具体方法的行为。 示例: ```java @Service public class UserService { @Autowired private UserMapper userMapper; // 原生 MyBatis Mapper @Autowired private PlusUserMapper plusUserMapper; // MyBatis-Plus Mapper @Transactional(rollbackFor = Exception.class) public void saveUser(User user) { try { userMapper.insert(user); plusUserMapper.insert(user); } catch (Exception e) { throw new RuntimeException("保存失败", e); } } } ``` 此处的关键在于确保两个操作均处于同一事务上下文中[^5]。 --- #### 5. **性能优化与监控** 随着业务规模扩大,混合使用的架构可能导致查询效率下降或者缓存命中率降低等问题。为此,应当定期审查 SQL 执行计划并启用慢日志分析机制以便及时发现瓶颈所在。 另外,借助第三方工具如 Arthas 或 Pinpoint 对线上环境进行全面诊断也是不错的选择[^2]。 --- #### 6. **注意事项** 尽管技术上允许同时部署这两种解决方案,但从长远来看并不提倡这样做。原因如下: - 维护本增加:团队员需要熟悉两种风格迥异的技术栈; - 学习曲线陡峭:新人入职后难以快速掌握全部知识点; - 升级困难:未来一旦决定全面切换到某一方则面临巨大改动压力; 因此除非确实存在无法规避的历史遗留因素外,一般还是鼓励尽早完向单一方向过渡的过程[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乄bluefox

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

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

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

打赏作者

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

抵扣说明:

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

余额充值