MyBatis Plus

第一节 MyBatis Plus 的简介

[1] 为什么使用MyBatis Plus?

A、再之前学习的Mybatis中 我们对单表的增删改查的操作,都是自己再mapper.xml中进行代码的书写,这样一来我们书写的代码比较的麻烦。
B、我们目前封装数据库的实体的时候,每一表都需要自己的书写实体类,这样一来,我们书写的代码就比较的麻烦。

[2] 解决的方案

MyBatis Plus:其实就是对MyBatis的进一步的封装。

[3]MyBatis Plus 的简介

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官方文档说的愿景是成为 Mybatis 最好的搭档,就像魂斗罗中的1P、2P,基友搭配,效率翻倍。


2,特性


3,架构原理
在这里插入图片描述

第二节 MyBatis Plus 的框架搭建
[1] 第一步:导包
在原有SSM的jar包的基础上增加MybatisPlus的jar即可。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d072c2e3efd749cfbd60a2cdcec004b1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzNjA5Njgz,size_16,color_FFFFFF,t_70)
[2] 搭建SSM开发环境
  1. 在Src下创建MVC的包结构

  2. 在src下创建和配置SSM相关配置文件
    注意:
    其他配置和原有SSM流程不变,在applicationcontext.xml文件中
    将Mybatis的工厂bean替换为MybatisPlus的工厂bean即可。
    在这里插入图片描述

  3. 在web.xml中配置SSM相关信息

[3] 在数据库中创建测试表

创建t_student表并添加测试数据
在这里插入图片描述

[4] 在pojo层下创建Student表的实体类

在这里插入图片描述

[5] 在mapper层创建StudentMapper接口并继承BaseMapper接口

在这里插入图片描述

[6] 创建测试类,并从Spring容器中获取StudentMapper的接口的实例化对象并使用对象完成数据的查询操作,查询所有的学生信息

在这里插入图片描述

[7] MyBatis和Mybatis Plus的使用比较

1、MybatisPlus包含了Mybatis的所有功能,也就说在MybatisPlus中我们仍然可以按照Mybatis的方式来完成数据库的操作(无侵入)。
2、MybatisPlus的数据库操作的Mapper层的接口只需要继承BaseMapper接口,就自动的拥有了当前对应的表的基本的CRUE操作,无需声明接口方法及其xml文件,极大的提升了开发效率(MybatisPlus是通过实体类来逆向动态生成对应的表的基本的Sql语句)

第三节MyBatis Plus 中的CRUD
[1] 添加操作

在这里插入图片描述

[2] 修改操作

在这里插入图片描述

[3] 删除操作

在这里插入图片描述

[4] 查询操作

在这里插入图片描述

第四节MyBatis Plus 条件构造器Wrapper的使用
[1] Wrapper条件构造器的介绍

问题:

目前我们可以使用mp完成基本的增删改查操作,但是我们在进行数据操作
时,很多时候Sql语句中的筛选条件是非常复杂的,比如or关键,>,<,模
糊查询等,怎么办?

解决:

mp提供了功能非常强大的Wrapper条件构造器

本质:

条件构造器其实就是一个对象,以方法的形式提供了数据库操作的筛选关键字
我们调用该对象,来拼接我们的筛选条件即可。

实现:
QueryWrapper
使用:

创建QueryWrapper对象,使用该对象中提供的对应的数据库操作的方法,来
完成条件的拼接,QueryWrapper对象最终存储拼接好的Sql片段,将片段
拼接在Sql语句中。

[2] QueryWrapper常用的方法说明

在这里插入图片描述

[3] 带条件的查询的代码示例

在这里插入图片描述

第五节:MybatisPlus的分页查询
[1] MybatisPlus的分页查询介绍

问题:

对于传统的分页Sql语句,需要我们自己在Sql语句中
使用limit关键字来实现分页查询。但是呢,在MybatisPlus
中,Sql语句是动态生成的,那么如何完成数据的分页查询呢?

解决:

使用分页插件。

使用:

  1. 在配置文件中配置分页插件
  2. 在代码中调用分页效果
[2] MybatisPlus的分页查询的配置

在这里插入图片描述

[3] MybatisPlus分页查询的使用

在这里插入图片描述

第六节 MybatisPlus的常用注解
[1] MybatisPlus的注解的介绍

问题:

在使用MybatisPlus后,我们不用再声明Sql语句了,只需要我们的Mapper
接口继承BaseMapper接口即可拥有对应的CRUD操作。通过我们之前的学习
我们发现,MyBatisPlus其实在根据我们的实体类来动态的生成对象的Sql语句
默认会按照类名即是对应的表的表名,属性名即是对应的表的字段名。但是如果
实体类名和表名不一致,或者属性名和字段名不一致怎么办?

解决:

在实体类上使用注解表名对应的映射关系。

注意:

建议大家在开发时尽量保证实体类和表之间的对应关系是相同的。这样就不用
声明注解。

[2] 常用注解及其作用
  1. @TableName注解
    作用:表明实体类对应的数据库表
    使用:在类名上使用,值为对应的表的表名
    示例:
    在这里插入图片描述

官方说明:
在这里插入图片描述

  1. @TableId
    作用:表明类中的某个属性为主键字段对应的属性
    使用:在为主键的属性上使用
    示例:
    在这里插入图片描述

官方说明:
在这里插入图片描述

  1. @TableField
    作用:表明普通属性映射的表中的字段,值为字段名
    使用:在普通属性上使用
    示例:
    在这里插入图片描述

    官方说明:
    在这里插入图片描述

[3] MybatisPlus中获取自增的主键值

在Mybatis中需要使用 useGeneratedKeys,keyProperty,keyColumn 设置自增主键值的回返,在实体类对象中获取即可。在MybatisPlus中在进行数据新增时,在新增成功后,会自动的将自增的主键值返回到实体类对象中,前提是需要在实体类中使用@TableId表明主键字段,并且为自增类型。
在这里插入图片描述

第七节 MybatisPlus的全局配置策略
[1] 全局配置策略介绍

问题:

假如我们每个实体类和数据库中的表名都不一致,表的格式都是t_表名
类名呢没有t_字符,比如t_student表和Student类。这样每个实体类
上我们都要使用@TableName注解来表名类和表的映射关系,过于麻烦
怎么办?

解决:

使用MP的全局配置策略。GlobalConfig

作用:

配置表和类名映射关系的前缀。
配置全局主键自增

[2] 全局配置策略示例

在这里插入图片描述

第八节 Active Record

支持 ActiveRecord 模式:

支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

[1] AR模式和MP的Mapper模式的比较
  1. 原有MP的Mapper模式
    ① 创建项目完成Spring和MP的集成
    ② 创建数据库表对应的实体类
    ③ 创建mapper接口并继承BaseMapper接口
    ④ 从Spring容器中获取Mapper接口的实例化对象完成数据库操作
    描述:
    通过以上流程,MP的操作模式较于原有Mybatis的数据库操作流程
    没有任何变化,只是我们在编写代码的时候不用在mapper层声明
    Sql语句或者XML文件了,提升开发效率。
  2. MP的AR模式
    ① 创建项目完成Spring和MP的集成
    ② 创建数据库表对应的实体类,继承Model类
    ③ 在实体类中覆写pkVal方法.
    ④ 创建Mapper接口并继承BaseMapper接口
    ⑤ 创建Spring对象,让Spring容器完成对Mapper层的实例化扫描
    ⑥ 创建实体类对象,直接调用实体类从Model中继承的数据库方法完成
    数据库操作。
  3. 流程比较分析
    MP的AR模式其实底层仍然使用的是Mapper层在完成数据库操作。
    只不过由我们自己调用Mappe对象操作数据库,变成了通过
    实体类对象来调用Mapper完成数据库操作。从代码的物理视图上
    我们是看不到实体类调用Mapper的过程的。也就说,本质上仍然
    是Mapper层在操作数据库
[2] AR模式的特点

AR模式较于传统的MP模式操作数据库,在代码体系中,我们不用在获取Mapper对象,然后再将实体类传入给mapper层完成数据库操作,直接使用实体类即可完成操作。
提升开发效率。

[3] AR模式的使用代码示例
  1. 创建一个集成了MP的SSM项目

  2. 在pojo层创建实体类,并继承Model类,覆写pkVal的方法
    在这里插入图片描述

  3. 使用AR模式完成数据库操作

在这里插入图片描述

第九节 AutoGenerator代码生成器

[1] MP的代码生成器介绍

问题:

目前我们在开发SSM项目的时候,会先搭建一个SSM的开发环境。我们会根据数据库的表在pojo包中创建对应的实体类,而且可以不关心项目功能的同时,在mapper层对数据库的表的基础增删改查功能提前实现,同理,在service层可以将基础的业务代码提前声明。然后再根据项目功能完成对应的复杂操作。而整个过程需要程序员手动
完成搭建,效率低下。

解决:

创建一个代码生成类,调用该类的对象,并将对应的数据库表作为参数传递进入
以及一些生成代码的其他要求也传递给该对象,让该对象帮助我们生成基础的开发
代码。

实现:

MP的代码生成器

作用:

根据数据库中的表动态的生成表对应的mapper,service,pojo,controller层的基础代码,提升开发效率。

[2] MP代码生成器的使用
  1. 导入代码生成器相关jar包
    在这里插入图片描述

  2. 使用代码生成器生成代码

package com.bjsxt.test;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

public class TestCode {
    public static void main(String[] args) {
        // 代码生成器
             AutoGenerator mpg = new AutoGenerator();
        //全局配置策略
            GlobalConfig gc = new GlobalConfig();
            String path = System.getProperty("user.dir");//动态获取当前项目的路径
            System.out.println(path);
            gc.setFileOverride(false);// 是否覆盖同名文件,默认是false
            gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
            gc.setEnableCache(false);// XML 二级缓存
            gc.setBaseResultMap(true);// XML ResultMap
            gc.setBaseColumnList(false);// XML columList
            gc.setOutputDir(path+"/09-mp-code/src");
            gc.setIdType(IdType.AUTO);//设置主键策略

        //数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://localhost:3306/mp?useUnicode=true&useSSL=false&characterEncoding=utf8");
            // dsc.setSchemaName("public");
            dsc.setDriverName("com.mysql.jdbc.Driver");
            dsc.setUsername("root");
            dsc.setPassword("1234");

        // 包配置
            PackageConfig pc = new PackageConfig();
            pc.setParent("com.bjsxt")
                    .setMapper("mapper")
                    .setService("service")
                    .setController("controller")
                    .setEntity("pojo")
                    .setXml("mapper");
        //策略配置
            StrategyConfig stConfig = new StrategyConfig();
            stConfig.setCapitalMode(true) //全局大写命名
                    .setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
                    .setTablePrefix("t_")
                    .setInclude("t_student"); // 生成的表,多个表继续传递即可,String类型的可变参数

        //将策略配置对象集成到代码生成器中
            mpg.setGlobalConfig(gc);
            mpg.setDataSource(dsc);
            mpg.setPackageInfo(pc);
            mpg.setStrategy(stConfig);
            //执行生成
            mpg.execute();
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AloneDrifters

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值