MyBatis-Plus 简称 MP,是由国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上简化开发、提高效率。
MyBatis-Plus 不能单独使用,必须配合 MyBatis 一起使用,就像 魂斗罗 中的 1P、2P 一样
Mybatis-Plus 是由 baomidou(苞米豆)组织开发并且开源的。Mybatis-Plus 只是 苞米豆 组织开发了其中一个插件。
MyBatis-Plus 的优点:
因为 MyBatis-Plus 不能单独使用,必须配合 MyBatis 一起使用,而 MyBatis 也很少单独使用,所以对于 Mybatis 整合 MP 有常常有三种用法,分别是Mybatis+MP、Spring+Mybatis+MP、Spring Boot+Mybatis+MP。
在进行如下整合时,需要自行准备数据库、java实体类。
在学习 MyBatis 的时候,需要定义 Mapper 接口、定义映射文件和配置文件。而 MyBatis-Plus 则是在它们的基础上改进的,首先引入 MyBatis-Plus 坐标,如果使用 MyBatis-Plus ,那么 MyBatis 的坐标最好省略,避免造成版本冲突:
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plusartifactId>
<version>3.1.0version>
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 类进行实例化。
使用 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>
SpringBoot 整合 MP 就与上面两种有所差别了, Mapper 接口还是继承BaseMapper<实体类名称>
接口。
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.1.0version>
dependency>
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
其实在使用 MP 的过程中,最主要的还是Mapper 接口还是继承BaseMapper<实体类名称>
接口。BaseMapper 接口中定义了很多方法:
这些方法都对应了一种 SQL 语句,这些方法 MyBatis-Plus 已经帮我们实现了。在这些方法中,形参部分都有一个 T ,这个 T 表示当前需要对那个实体类进行 CURD 操作,实体又与数据库表映射。这些具体方法在后面再去深入了解。
虽然整合方法很多,但是具体的使用都是通过 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;
}
}
因为 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
:字段逻辑处理注解,具体详解见(传送门)