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映射文件。

插入方式:

  1. Integer insert(T entity);

  2. @TableName

    指定JavaBean对应的哪张表的表名

  3. 全局的MP配置:

  4. @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;
  1. 全局的MP配置:

  2. @TableId

  3. 全局的MP配置:

  4. 支持主键自增的数据库插入数据获取主键值

    Mybatis:需要通过userGeneratedKeys以及keyProperty来设置

    MP:自动将主键值写到实体类中

  5. Integer insertAllColumn(T entity);

更新操作

  1. Integer updateById(@Param("et")T entity);
  2. Integer updateAllColumnById(@Param("et")T entity);

查询操作

  1. T selectById(Serializable id);
  2. T selectOne(@Param("ew")T entity);
  3. List<T> selectBatchIds("List<? extends Serializable> idList");
  4. List<T> selectByMap(@Param("cm")Map<String,Object> columnMap);
  5. 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小结

  1. 以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方便的实现单一、批量、分页等操作。极大的减少开发负担,难道这就是 MP 的强大之处了吗?

  2. 提出需求:现有一个需求,我们需要分页查询 tbl_employee 表中,年龄在 18~50 之间性别为男且姓名为 xx 的所有用户,这时候我们该如何实现上述需求呢?
    MyBatis : 需要在 SQL 映射文件中编写带条件查询的 SQL,并基于 PageHelper 插件完成分页. 实现以上一个简单的需求,往往需要我们做很多重复单调的工作。普通的 Mapper能够解决这类痛点吗?
    MP: 依旧不用编写 SQL 语句, MP 提供了功能强大的条件构造器 EntityWrapper


posted @ 2022-01-21 15:26  ArosyCat  阅读(36)  评论(0)    收藏  举报