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
@Mapper注解
- 作用于单个 Mapper 接口,用于告诉 MyBatis:“这是一个 Mapper 接口,需要为它生成代理实现类”。
- 仅能标识单个接口,若项目中有多个 Mapper(通常是这样),每个接口都需要添加该注解,否则 Spring 无法识别。
@MapperScan注解(优先推荐使用)
- 作用于Spring Boot 引导类(或配置类),用于指定Mapper 接口所在的包路径,Spring 会自动扫描该路径下的所有接口,并将它们注册为 Bean。
- 无需在每个 Mapper 接口上添加
@Mapper,简化了代码(尤其在 Mapper 数量较多时)。
- 可同时存在
mybatis使用步骤
- Mapper 层:继承
BaseMapper<Entity>,直接使用内置 CRUD 方法。 - 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 会默认将实体类名直接映射为表名(不区分大小写,数据库表名通常为小写)。驼峰未设置默认自动开启
- 表映射:
- 优先使用
@TableName注解指定的表名。 - 无注解时,默认用实体类名作为表名。
- 字段映射:
- 优先使用
@TableField(value = "...")指定的列名。 - 无注解时,若开启驼峰命名(默认开启),则驼峰变量名(如
userName)映射到下划线列名(如user_name)。 - 若未开启驼峰,直接用变量名作为列名。
默认实行的是一实体类一张表(不跨表关联)
综上因此:
@TableField(exist = false)的核心作用是告诉 MyBatis-Plus:该成员变量不是数据库表字段,生成 SQL 时忽略它。- 若不添加此注解,非表字段会被误判为表字段,导致 SQL 执行错误。