文章目录
1、什么是 MyBatis-Plus
MyBatis-Plus 简称 MP,是由国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上简化开发、提高效率。
MyBatis-Plus 不能单独使用,必须配合 MyBatis 一起使用,就像 魂斗罗 中的 1P、2P 一样
Mybatis-Plus 是由 baomidou(苞米豆)组织开发并且开源的。Mybatis-Plus 只是 苞米豆 组织开发了其中一个插件。
2、MyBatis-Plus 的优点
MyBatis-Plus 的优点:
- 无侵入:只在 MyBatis 的基础上使用,但是不会对 MyBatis 产生任何影响
- 损耗小 :内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用 :通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 内置代码生成器 :采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎
- 内置多种插件 :内置了分页插件、性能分析插件和全局拦截插件 等多种插件
- 支持多种数据库 :支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
3、快速入门
因为 MyBatis-Plus 不能单独使用,必须配合 MyBatis 一起使用,而 MyBatis 也很少单独使用,所以对于 Mybatis 整合 MP 有常常有三种用法,分别是Mybatis+MP、Spring+Mybatis+MP、Spring Boot+Mybatis+MP。
在进行如下整合时,需要自行准备数据库、java实体类。
3.1、Mybatis + MP
在学习 MyBatis 的时候,需要定义 Mapper 接口、定义映射文件和配置文件。而 MyBatis-Plus 则是在它们的基础上改进的,首先引入 MyBatis-Plus 坐标,如果使用 MyBatis-Plus ,那么 MyBatis 的坐标最好省略,避免造成版本冲突:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.1.0</version>
</dependency>
具体的使用方式 Mapper 接口继承BaseMapper<实体类名称>
接口:
public interface OrderMapper extends BaseMapper<Order> {
//根据 id 查询订单信息
Order selectByID(int id);
//根据 时间 查询订单信息
List<Order> selectByDate(String date);
//根据 uid 查询订单信息
List<Order> selectByUid(int uid);
//根据 id 查询订单且查询出该订单对应的用户信息
Order selectOrderAndUser(int id);
//添加订单信息
int insert(Order order);
//修改订单信息
int update(Order order);
//删除订单信息
int delete(int id);
}
在实例化 SqlSessionFactory 对象的方式有所差别:
//MyBatis 实例化方式
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//MyBatis-Plus 实例化方式
SqlSessionFactory sqlSessionFactory = new MybatisSqlSessionFactoryBuilder().build(resourceAsStream);
MyBatis-Plus 使用的是有自身定义的 MybatisSqlSessionFactoryBuilder 类进行实例化。
3.2、Spring + Mybatis + MP
使用 Spring 进行整合 MP 时与之前的步骤差不多,第一步导入依赖,第二步是继承接口,第三步是修改实例化 SqlSessionFactory 对象。
第三步有点差别,在 Spring 中 Mybatis 的使用的 SqlSessionFactory 对象是通过 XML 实例化的,所以我们要进行如下修改:
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:conf/mybatis.xml"/>
<property name="mapperLocations" value="classpath:com.itlong/Mapper/OrderMapper.xml"/>
</bean>
3.3、SpringBoot + Mybatis + MP
SpringBoot 整合 MP 就与上面两种有所差别了, Mapper 接口还是继承BaseMapper<实体类名称>
接口。
- 导入依赖:因为 SpringBoot 有起步依赖,所以我们直接导入 MP 的起步依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.0</version> </dependency>
- 修改配置文件:在只使用 MyBatis 时配置文件是通过
mybatis
进行设置的,但 MyBatis-Plus 要以mybatis-plus
为前缀#使用 MyBatis-Plus 时的配置方式 mybatis-plus: mapper-locations: classpath:mapper/*Mapper.xml type-aliases-package: com.itlong.spring_boot.domain #使用 MyBatis 时的配置方式,在确定使用 MP 时不用配置 mybatis: mapper-locations: classpath:mapper/*Mapper.xml type-aliases-package: com.itlong.spring_boot.domain
3.4、BaseMapper 接口
其实在使用 MP 的过程中,最主要的还是Mapper 接口还是继承BaseMapper<实体类名称>
接口。BaseMapper 接口中定义了很多方法:
这些方法都对应了一种 SQL 语句,这些方法 MyBatis-Plus 已经帮我们实现了。在这些方法中,形参部分都有一个 T ,这个 T 表示当前需要对那个实体类进行 CURD 操作,实体又与数据库表映射。这些具体方法在后面再去深入了解。
3.5、具体调用
虽然整合方法很多,但是具体的使用都是通过 Mapper 接口:
//省略了接口的定义
@Service("orderService")
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Override
public Order selectByID(int id) throws IOException {
List<Order> orderList = orderMapper.selectList(null);
if (orderList != null && orderList .getId() != 0) {
return orderList ;
}
return null;
}
}
4、注解
因为 BaseMapper 类的方法基本上都要使用实体类,所以实体类的定义不可能想使用 MyBatis 那么不规范了,所以 MP 提供了一些注解在实体类上使用。
-
@TableName
:表名注解,作用在类上。属性 类型 必须指定 默认值 描述 value String 否 " " 定义表名,如果实体类名和数据库表名相同可省略 resultMap String 否 " " 如果没有这省略,如果存在则填写xml 中 resultMap 的 id autoResultMap boolean 否 false 用于自动构建 resultMap,如果 resultMap 舒心指定了 id,那么无论如何都不生效。 -
@TableId
:主键注解,作用在主键映射的字段上。属性 类型 必须指定 默认值 描述 value String 否 " " 主键字段名,如果主键字段和对应的属性名不同时使用 type Enum 否 IdType.NONE 主键类型,可选项有 IdType.AUTO(自增)、IdType.INPUT(insert前自行set主键值)等 -
@TableField
:字段注解,作用在非主键映射的字段上。属性 类型 必须指定 默认值 描述 value String 否 " " 数据库字段名,只在非主键字段和对应的属性名不同时使用 exist boolean 否 true 是否为数据库表字段( 默认 true 存在,false 不存在 ) condition String 否 " " 预处理 WHERE 实体条件自定义运算规则 update String 否 " " 预处理 set 字段自定义注入 select boolean 否 true 是否进行 select 查询(默认 true 进行) fill Enum 否 FieldFill.DEFAULT 具体详解见(传送门) -
@Version
:乐观锁注解,具体详解见(传送门) -
@TableLogic
:字段逻辑处理注解,具体详解见(传送门)