了解ORM

简介: MyBatis与MyBatis-Plus区别在于:MyBatis是半自动ORM框架,需手动编写SQL,适合复杂查询场景;而MyBatis-Plus是其增强工具,提供零SQL的CRUD操作,简化开发流程,适用于简单增删改查场景,提升开发效率。

mybatias和mybatias-plus区别

特性

MyBatis

MyBatis-Plus (MP)

基础定位

半自动 ORM 框架(需手动编写 SQL)

MyBatis 的增强工具(简化 CRUD 操作)

设计哲学

强调 SQL 的灵活性和可控性

强调零 XML极简 CRUD开发

适用场景

复杂 SQL 场景(如多表联查、自定义分页)

简单 CRUD 场景(如管理系统、快速开发)

场景

推荐方案

原因

快速开发 CRUD 应用

MyBatis-Plus

减少 90% 的 CRUD 代码,专注业务逻辑

复杂 SQL 查询(如报表系统)

MyBatis

支持自定义 SQL,灵活控制查询逻辑

已有 MyBatis 项目

MyBatis-Plus

可平滑集成,逐步替换简单 CRUD,保留复杂 SQL

微服务架构

MyBatis-Plus + 代码生成器

快速生成各服务的基础 CRUD 代码,提高开发效率

总结:mybatis 适用于多表,复杂的sql查询(手动编写),mybatis-plus则是零sql,针对大部分的简单crud(增删改查)

mybatis-plus用法

mybatis-plus的依赖包中包含了mybatis,导入mybatis-plus可以不用重复导入mbatis

  1. @Mapper注解
  • 作用于单个 Mapper 接口,用于告诉 MyBatis:“这是一个 Mapper 接口,需要为它生成代理实现类”。
  • 仅能标识单个接口,若项目中有多个 Mapper(通常是这样),每个接口都需要添加该注解,否则 Spring 无法识别。
  1. @MapperScan注解(优先推荐使用)
  • 作用于Spring Boot 引导类(或配置类),用于指定Mapper 接口所在的包路径,Spring 会自动扫描该路径下的所有接口,并将它们注册为 Bean。
  • 无需在每个 Mapper 接口上添加@Mapper,简化了代码(尤其在 Mapper 数量较多时)。
  • 可同时存在

mybatis使用步骤

  1. Mapper 层:继承BaseMapper<Entity>,直接使用内置 CRUD 方法。
  2. Service 层
  • 接口继承IService<Entity>,获得高级方法(分页、批量操作)。
  • 实现类继承ServiceImpl<Mapper, Entity>,简化实现。

不使用sql

通过service调用mapper 层(mp)的方法或者调用service层方法(mp提供的)

关系 1:

mapper 必须继承 BaseMapper<实体属性>,

关系2:

service(自定义的)要继承 service(mp) 同时实现类也要继承

例如:DeptService  extends IService<Dept>   service层继承

DeptServiceImpl extends ServiceImpl<DeptMapp,Dept> implements DeptService

(泛型:mapper(已经继承关系1),实体类)

后面就可以调用原生方法(mp)进行基础的crud

理解mybatis-plus 的映射关系和一些注解

原理:通过解析实体类的成员变量,自动映射为数据库表的字段,并生成对应的 SQL 片段

MyBatis-Plus 会默认将实体类名直接映射为表名不区分大小写,数据库表名通常为小写)。驼峰未设置默认自动开启

  1. 表映射
  • 优先使用 @TableName 注解指定的表名。
  • 无注解时,默认用实体类名作为表名。
  1. 字段映射
  • 优先使用 @TableField(value = "...") 指定的列名。
  • 无注解时,若开启驼峰命名(默认开启),则驼峰变量名(如 userName)映射到下划线列名(如 user_name)。
  • 若未开启驼峰,直接用变量名作为列名。

默认实行的是一实体类一张表(不跨表关联)

综上因此:

  • @TableField(exist = false) 的核心作用是告诉 MyBatis-Plus:该成员变量不是数据库表字段,生成 SQL 时忽略它
  • 若不添加此注解,非表字段会被误判为表字段,导致 SQL 执行错误。
相关文章
Layui 内置方法 - layer.confirm(询问框)
Layui 内置方法 - layer.confirm(询问框)
1888 0
|
消息中间件 NoSQL Java
【RabbitMQ】RabbitMQ如何做到保证消息100%不丢失?
【RabbitMQ】RabbitMQ如何做到保证消息100%不丢失?
863 0
|
Android开发
【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task(一)
【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task(一)
1321 0
【Android 返回堆栈管理】打印 Android 中当前运行的 Activity 任务栈信息 | Activity 任务栈信息分析 | Activity 在相同 Stack 中的不同 Task(一)
|
关系型数据库 MySQL Docker
Docker - 数据卷挂载与目录挂载的区别
Docker中数据卷挂载与目录挂载的区别,包括它们的定义、使用场景和命令差异。
1361 0
|
Java
【异常解决】Java运行时发生 java.lang.NoClassDefFoundError: Could not initialize class com.iot.alarm.ProcAlar
【异常解决】Java运行时发生 java.lang.NoClassDefFoundError: Could not initialize class com.iot.alarm.ProcAlar
2082 0
什么是快照读和当前读
*快照读(一致性非锁定读)读取的是当前数据的可见版本,可能是会过期数据,不加锁的select就是快照读 *当前读(一致性锁定读)读取的是数据的最新版本,并且当前读返回的记录都会上锁,保证其他事务不会并发修改这条记录。如update、insert、delete、select for undate(排他锁)、select lockin share mode(共享锁) 都是当前读
|
资源调度 前端开发 数据安全/隐私保护
react 动态路由使用
【8月更文挑战第30天】react 动态路由使用
484 0
|
Linux Docker 容器
docker 容器大小查看及清理docker磁盘空间
docker 容器大小查看及清理docker磁盘空间
2042 0
|
消息中间件 Java
SpringBoot基于RabbitMQ实现死信队列 (SpringBoot整合RabbitMQ实战篇)
SpringBoot基于RabbitMQ实现死信队列 (SpringBoot整合RabbitMQ实战篇)
350 1
|
SQL 关系型数据库 MySQL
分布式事物【 认识事物、脏写、脏读、不可重复读、幻读】(一)-全面详解(学习总结---从入门到深化)
分布式事物【 认识事物、脏写、脏读、不可重复读、幻读】(一)-全面详解(学习总结---从入门到深化)
355 1
分布式事物【 认识事物、脏写、脏读、不可重复读、幻读】(一)-全面详解(学习总结---从入门到深化)