MyBatis-Plus
1、MyBatis-Plus
1.1 介绍
MyBaits-Plus(简称MP),是一个MyBatis的增强工具包,只做增强不做改变。为简化开发工作、提高生产率而生。
1.2代码及文档地址
Github: https://github.com/baomidou/mybatis-plus
Gitee: https://gitee.com/baomidou/mybatis-plus
2、集成MP
2.1 创建测试表
-- 创建库
create database mp;
-- 使用库
use mp;
-- 创建表
create table tbl_employee(
id int(11) primary key auto_increment,
last_name varchar(50),
email varchar(50),
gender char(1),
age int
);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','Tom@atguigu.com',1,22)
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Jerry','Jerry@atguigu.com',0,25)
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','Black@atguigu.com',1,30)
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','white@atguigu.com',0,35)
2.2 创建JavaBean
@Data
@ToString
public class Employee{
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Integer age;
}
2.3 依赖配置
① 在pom.xml中加入对MP、Spring、连接池、Junit、Mysql驱动等依赖
<!-- mp依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
特别说明:MyBatis及MyBatis-Spring依赖请勿加入项目配置,以免引起版本冲突!MyBatis-Plus会自动帮你维护!
② 加入MyBatis的全局配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
③ 加入db.properties连接信息配置
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mp
jdbc.username=root
jdbc.password=xzh
④ 加入spring的配置文件 applicationContext.xml
<!-- 数据源 -->
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 事务管理器 -->
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 基于注解的事务管理 -->
<tx:annotation-driven
transaction-manager="dataSourceTransactionManager"/>
<!-- 配置 SqlSessionFactoryBean -->
<bean id="sqlSessionFactoryBean"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 别名处理 -->
<property name="typeAliasesPackage"
value="com.atguigu.mp.beans"></property>
</bean>
<!--
配置 mybatis 扫描 mapper 接口的路径
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="com.atguigu.mp.mapper">
</property>
</bean>
2.4 集成MP
- MyBaits-Plus的集成非常简答,对于Spring,我们仅仅需要把MyBatis自带的MybatisSqlSessionFactoryBean替换为MP自带的即可。
注:mapperLocations自动配置好的,有默认值。classpath*:/mapper//*.xml;任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。建议以后sql映射文件,放在类路径的mapper下。**
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
3、使用MP
实现方式:
-
基于Mybatis
需要编写EmployeeMapper接口,并手动编写CRUD方法
提供EmployeeMapper.xml映射文件,并手动编写每个方法对应的SQL语句
-
基于MP
只需要创建EmployeeMapper接口,并继承BaseMapper接口,这就是使用MP需要完成的所有操作,甚至不需要创建SQL映射文件。
插入方式:
-
Integer insert(T entity);
-
@TableName
指定JavaBean对应的哪张表的表名
-
全局的MP配置:
-
@TableField
- 使用示例
//当我们定义JavaBean和数据库表时可能并没有建立起一一对应的关系,比如JavaBean中的属性表中没有
//我们需要查询数据库的数据封装到Javabean中,这时查询要求所有的属性都应该在数据库中能一一对应
//可以使用@TableField注解来说明这个属性不是表中的字段
@TableField(exist = false)
private String userName;
@TableField(exist = false)
private String password;
//以下是数据库存在的字段
private Long id;
private String name;
private Integer age;
private String email;
-
全局的MP配置:
-
@TableId
-
全局的MP配置:
-
支持主键自增的数据库插入数据获取主键值
Mybatis:需要通过userGeneratedKeys以及keyProperty来设置
MP:自动将主键值写到实体类中
-
Integer insertAllColumn(T entity);
更新操作
Integer updateById(@Param("et")T entity);
Integer updateAllColumnById(@Param("et")T entity);
查询操作
T selectById(Serializable id);
T selectOne(@Param("ew")T entity);
List<T> selectBatchIds("List<? extends Serializable> idList");
List<T> selectByMap(@Param("cm")Map<String,Object> columnMap);
List<T> selectPage(RowBounds rowBounds, @Param("ew")Wrapper<T> wrapper);
4、MP启动注入SQL原理
xxxMapper继承了BaseMapper
, BaseMapper中提供了通用的CRUD方法,方法来源于BaseMapper,有方法就必须有SQL,因为Mybatis最终还是需要通过SQL语句操作数据。
通过现象看到本质
-
employeeMapper的本质 org.apache.ibatis.binding.MapperProxy
-
MapperProxy中sqlSession → SqlSessionFactory
-
SqlSessionFactory中 → Configuration → MappedStatements
MP在启动就会挨个分析xxxMapper中的方法,并且将对应的SQL语句处理好,保存到configuration对象中的mappedStatements中。
-
本质
Configuration: MyBatis 或者 MP 全局配置对象
MappedStatement:一个 MappedStatement 对象对应 Mapper 配置文件中的一个
select/update/insert/delete 节点,主要描述的是一条 SQL 语句
SqlMethod : 枚举对象 ,MP 支持的 SQL 方法
TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息
SqlSource: SQL 语句处理对象
MapperBuilderAssistant: 用于缓存、SQL 参数、查询方剂结果集处理等.
通过 MapperBuilderAssistant 将每一个 mappedStatement添加到 configuration 中的 mappedstatements 中
通用CRUD小结
-
以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担,难道这就是 MP 的强大之处了吗?
-
提出需求:现有一个需求,我们需要分页查询 tbl_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?
MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并基于 PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。普通的 Mapper能够解决这类痛点吗?
MP: 依旧不用编写 SQL 语句, MP 提供了功能强大的条件构造器 EntityWrapper