MyBatis-Plus——MyBatis-Plus概述与集成_mybatisplus gitee-程序员宅基地

技术标签: java  MyBatis Plus  MyBatis-Plus  日志  

MyBatis-Plus——MyBatis-Plus概述与集成

1、MyBatis-Plus概述

MyBatis-Plus 是什么

MyBatis-Plus(简称MP)是一个 MyBatis的增强工具,在 MyBatis的基础上只做增强( 提供了一些高效、有用、开箱即用的功能)不做改变,为简化开发、提高效率而生。

在这里插入图片描述

那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA和 tk-mapper。

特征

  • 与 MyBatis 完全兼容
  • 启动时自动配置
  • 用于操作数据库的开箱即用接口
  • 强大而灵活的 where 条件包装器
  • 多种策略生成主键
  • Lambda 风格的 API
  • 全能且高度可定制的代码生成器
  • 自动分页操作
  • SQL注入防御
  • 支持活动记录
  • 支持可插拔自定义接口
  • 内置许多有用的扩展

代码及文档发布地址

官网:https://baomidou.com/

代码发布地址:

  • GitHub:https://github.com/baomidou/mybatis-plus

  • Gitee:https://gitee.com/baomidou/mybatis-plus

文档地址:https://baomidou.com/pages/24112f/

2、集成MyBatis-Plus

1、准备测试表

建表语句:

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

插入数据:

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

在这里插入图片描述

2、初始化一个Spring Boot项目

在这里插入图片描述

3、导入依赖

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。

4、连接数据库配置文件

spring.datasource.username=root
spring.datasource.password=密码
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useSSl=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

5、编写实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

6、编写 Mapper 类

//Mapper类继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
//这个 Mapper 支持 id 泛型
@Mapper
public interface UserMapper extends BaseMapper<User> {
    
}

7、配置扫描路径

在主启动类上配置mapper的扫描路径

@MapperScan("com.haoming.mapper")
@SpringBootApplication
public class MyBatisPlusApplication {
    

    public static void main(String[] args) {
    
        SpringApplication.run(MyBatisPlusApplication.class, args);
    }

}

2.2、查询测试

单个查询及查询所有

@SpringBootTest
class MyBatisPlusApplicationTests {
    

    @Autowired
    private UserMapper userMapper;

    @Test
    void contextLoads() {
    
        //查询id为1的用户
        System.out.println(userMapper.selectById(1));
        System.out.println();
        //查询所有的用户 selectList()方法的参数为MP内置的条件封装器Wrapper,所以不填写就是无任何条件
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

}

控制台输出:

在这里插入图片描述

通过以上几个简单的步骤,我们就实现了 User 表的 CRUD 功能,甚至连 XML 文件都不用编写!

从以上步骤中,我们可以看到集成 MyBatis-Plus 非常的简单,只需要引入MP的依赖,编写Mapper,并配置 mapper 扫描路径即可。

但 MyBatis-Plus 的强大远不止这些功能。

查询多个用户信息

selectBatchIds(),参数需要一个list集合

@Test
void test2(){
    List<User> userList = userMapper.selectBatchIds(Arrays.asList(11, 12));
    userList.forEach(System.out::println);
}

在这里插入图片描述

条件查询:selectByMap,参数需要一个map集合,更复杂的查询条件会使用Wrapper条件查询器封装。

@Test
void test3(){
    
    HashMap<String, Object> map = new HashMap<>();
    map.put("name","shenming");
    map.put("age","10");
    List<User> users = userMapper.selectByMap(map);
    users.forEach(System.out::println);
}

**分页查询:**MP内置了分页插件 PaginationInnerInterceptor

1、配置文件里面配置分页插件

@Bean
public PaginationInterceptor paginationInnerInterceptor(){
    return new PaginationInterceptor();
}

2、测试分页插件

@Test
void testPage(){
    
    //参数:当前页数,页面大小
    Page<User> userPage = new Page<>(1,5);
    userMapper.selectPage(userPage, null);
    userPage.getRecords().forEach(System.out::println);

    //page对象的其他方法:
    //userPagegetTotal() 获得总数据条数
    //userPage.getCurrent() 获得当前页数
    //userPage.getSize() 当前页显示多少条数据
}

查看控制台的日志输出:

在这里插入图片描述

数据分页成功,本质上还是使用的limit分页实现。

2.3、插入测试和雪花算法

    @Test
    void insertTest(){
    
        User user = new User();
        user.setAge(3);
        user.setId(10L);//如果不指定id,MP会自动帮我们生成id
        user.setName("haoming");
        user.setEmail("[email protected]");
        int insert = userMapper.insert(user);
        System.out.println(insert);//受影响的行数
    }

数据插入成功

在这里插入图片描述

不指定id插入数据:

    @Test
    void insertTest(){
    
        User user = new User();
        user.setAge(4);
        user.setName("shuhaoming");
        user.setEmail("[email protected]");
        int insert = userMapper.insert(user);
        System.out.println(insert);
    }
}

在这里插入图片描述

这里使用的主键生成策略是:雪花算法,还有其他的主键生成策略,比如数据库自增、UUID、UUID的变种 UUID to Int64、Redis生成ID、zookeeper生成唯一ID。

雪花算法是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。雪花算法支持的TPS可以达到419万左右(2^22*1000)。

2.4、修改测试

@Test
void update(){
    
    User user = new User();
    user.setId(10L);
    user.setName("shuhaoming");
    //根据id修改用户,但是参数是一个对象
    userMapper.updateById(user);
}

2.5、逻辑删除和物理删除

基本删除

@Test
void deleteTest(){
    
    //根据id批量删除
    userMapper.deleteBatchIds(Arrays.asList(12,11,14));

    //根据条件删除
    Map<String,Object> map = new HashMap<>();
    map.put("name","wanli");
    userMapper.deleteByMap(map);

    //根据id删除
    userMapper.deleteById(11);
}

逻辑删除和物理删除

物理删除:物理删除就是真正的从数据库中做删除操作了。对应的SQL语句:delete from 表名 where 条件;执行该语句,即为将数据库中该信息进行彻底删除,无法恢复。

逻辑删除:逻辑删除的本质是修改操作,所谓的逻辑删除其实并不是真正的删除,而是在表中将对应的是否删除标识(is_delete)或者说是状态字段(status)做修改操作。比如0是未删除,1是删除。在逻辑上数据是被删除的,但数据本身依然存在库中。对应的SQL语句:update 表名 set is_delete = 1 where id = 1;语句表示,在该表中将id为1的信息进行逻辑删除,那么客户端进行查询id为1的信息,服务器就不会提供信息。倘若想继续为客户端提供该信息,可将 is_delete 更改为 0 。

回收站的原理,其实就是利用了逻辑删除,对于删除文件进入回收站的本质只是在操作系统的帮助下对文件加上了 某个标记,资源管理器中对含有这种标记的文件不会显示。当从回收站恢复的时候只是移除了加上的标记而已,而清空回收站就是进行了物理删除。而商城网站,如淘宝,京东…会大量使用逻辑删除进行操作数据库。

测试逻辑删除

1、user 表中新增 deleted 字段

在这里插入图片描述

2、实体类中维护新添加的字段

@TableLogic 
private Integer deleted;

3、配置逻辑删除

配置类:

@Bean
public ISqlInjector sqlInjector(){
    
    return new LogicSqlInjector();
}

配置文件:

# 逻辑已删除值(默认为 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除值(默认为 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

4、测试

删除user表中id为17的用户:

userMapper.deleteById(17L);

查看控制台日志输出:

在这里插入图片描述

虽然我们执行的是删除语句,但执行的却是修改操作

查看user表:

在这里插入图片描述

id为17的用户数据还在,但是删除标识deleted变为1了,表示被逻辑删除了。

再查询id为17的用户,看是否能查到数据:

System.out.println(userMapper.selectById(17L));

在这里插入图片描述

结果是查不到,因为查询语句自动帮我们拼接了 deleted=0这个条件,过滤了所有deleted=1的用户记录。

3、配置日志输出

配置文件添加:

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

再启动上面的测试代码,查看控制台的日志输出:

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wpc2018/article/details/122089727

智能推荐

(赠源码)Python+django+Mysql公交线路查询系统85021-计算机毕业设计_python查实时公交情况查询-程序员宅基地

文章浏览阅读335次,点赞4次,收藏2次。公交线路查询系统的主要使用者分为管理员、乘客用户,实现功能包括后台首页、轮播图、公告管理、资源管理(新闻列表、新闻分类列表)、交流管理(论坛列表、论坛分类列表)、系统用户(管理员、乘客用户)、模块管理(线路信息、异常通知、投诉建议)等功能。本系统的使用可以实现公交线路查询的信息化,可以方便用户查看公交路线信息等,可以大大提高管理效率。_python查实时公交情况查询

Datax DB2插件开发_datax 接入db2-程序员宅基地

文章浏览阅读1.4k次。对于datax来说, 其实所有的关系型数据库步骤都差不多, 不同的就在于不同的数据库对于SQL的要求:例如开发流程1. 新建module2.DB2配置文件处理1. 新建module2.DB2配置文件处理Datax/db2reader/src/main/resources/{json文件}: 负责生成jar包和json模板Datax/db2reader/pom.xml: 负责maven编译,配置依赖项Datax/db2reader/src/main/assembly/package.xml: _datax 接入db2

计算机专业毕设选题,java毕设选题-程序员宅基地

文章浏览阅读44次。计算机专业毕设选题,java毕设选题

STM32CubeMX使用-程序员宅基地

文章浏览阅读1.4k次。一、新建工程首先,打开,第一次使用的朋友可以点击右侧的和检查一下软件更新并且找到对应芯片的固件库然后下载,软件和固件库都推荐是使用最新版的,这里不多介绍。完毕之后点击来创建一个新的工程。在弹出的界面中找到并选择对应芯片型号,可以在左上角的对话框中搜索,选中后点击来新建工程。_stm32cubemx

repeater里绑定dropdownlist控件各行的值-程序员宅基地

文章浏览阅读111次。//repeater绑定数据事件绑定答案dropdownlist protected void rpQuestionAnswer_ItemDataBound(object sender, RepeaterItemEventArgs e) { DropDownList ddl = e.Item.FindControl("drpRightAnswe..._repeater设置dropdownlist的值

教资科目一如何备考?_教资科目一选择题怎么复习-程序员宅基地

文章浏览阅读233次。科目一的选择题确实有点难,其实每一年的可以选择题都有点偏。给大家分享一下,科目一的一些相关备考知识!Q:都考什么内容?A:考试内容包括职业理念、教师职业道德、教育法律法规、文化素养、基本能力五大模块。各模块所占比重如下:Q:都有什么题型?A:试卷分为单选题、材料分析题和写作题三种题型,满分为150分。五个模块的内容在试卷中题型题量如下表:Q:考试难不难?A:科目一考查考生综合素质,属于规范化考试,命题严格依照考试大纲,难度非常稳定,易于把握规律,便于考生有针对性地复习。反之,如果对考情不了解,_教资科目一选择题怎么复习

随便推点

跑通yolox-s官方源码(可与yolov5s做对比试验)_yolox_s.pth-程序员宅基地

文章浏览阅读3.7k次,点赞8次,收藏37次。跑通yolox-s官方源码(可与yolov5s做对比试验)_yolox_s.pth

适用于渗透测试不同阶段的工具收集整理(转载)-程序员宅基地

文章浏览阅读1.1k次。Red Teaming / Adversary Simulation Toolkit该资源清单列表涵盖了一系列,适用于渗透测试不同阶段的开源/商业工具。如果你想为此列表添加贡献,欢迎你向我发送pull requestGithub:github.com/Snowming04内容侦察武器化交货命令与控制横向运动建立立足点升级特权数据泄露杂项参考侦察主动情报收集Ey..._gophish获取cookie

centos6.8服务器配置之编译安装PHP、配置nginx-程序员宅基地

文章浏览阅读122次。php version 5.6.31、nginx version: nginx/1.10.21、下载:wget http://cn2.php.net/distributions/php-5.6.31.tar.gz2、安装组件yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg li..._centos6 安装 libiconv.so.2

python pip 代理设置-程序员宅基地

文章浏览阅读682次。pip install --proxy="user:password@server:port" packagenameorigin url:http://xiuxixiuxi.blogspot.jp/2013/04/how-to-install-packages-with.htmlThere are two easy way to install packages for python (..._pip install --proxy=

Linux Deploy安装配置Ubuntu使用教程_linuxdeploy安装ubuntu-程序员宅基地

文章浏览阅读1.2w次,点赞6次,收藏44次。记录Linux Deploy使用总结1. 前言最近换了一部新手机,老的手机荣耀play也不能空着。正好平时电脑装了个虚拟机Ubuntu来做开发/运维环境,有点占电脑配置,无法一边开虚拟机一边玩游戏,老是不能放心玩耍。于是萌生起用手机做Linux服务器的想法。安卓是基于Linux内核进行开发的,理论上是可以实现Linux部署的。百度研究了下(研究了2天。。。),特此记录一下,本位以Ubuntu为..._linuxdeploy安装ubuntu

Freemarker使用详解_freemarker使用教程-程序员宅基地

文章浏览阅读9.4k次,点赞5次,收藏57次。1.什么是网页静态化技术随着用户访问量以及数据量的增大,网页静态化技术方案如今越来越流行。 什么是网页静态化技术呢?简单来说就是将网页以纯静态方式的形式展现。2.网页静态化技术与缓存技术的比较共同点:都可以减小数据库的访问压力。区别:(1)缓存技术适用于小规模的数据。以及一些经常变动的数据。(2)网页静态化技术适用于大规模但是变化不太频繁的数据。页面静态化与缓存技术的定义:页面静态化是指通过一些模板技术(如freemarker)将数据模型生成静态html页面并通过.._freemarker使用教程