MyBatis-Plus简介

顾名思义,MyBatis-Plus是一个MyBatis的增强工具,是用来简化JDBC操作的,它可以大量节省我们的工作时间,因为所有的CRUD代码它都可以自动化完成,与MyBatis-Plus类似的组件还有JPA、tk-mapper

官网:https://mp.baomidou.com

参考教程:https://mp.baomidou.com/guide


MyBatis-Plus快速入门

参考教程:https://mp.baomidou.com/guide/quick-start.html

步骤:

1、使用MySQL创建数据库mybatis_plus

2、创建user表并加些数据

注:在真实开发中,一般表设计还得有version(乐观锁)、deleted(逻辑删除)、create_time、update_time字段

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)
);
DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

3、编写项目,初始化一个SpringBoot项目

4、往项目里加入以下依赖

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
<!-- 数据库驱动 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
<!-- mybatis-plus -->
<!-- mybatis-plus 是自己开发,并非官方的! -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency>

5、在application.properties文件里配置数据库连接信息

spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

注:如果spring.datasource.url后面不加“&serverTimezone=GMT%2B8”会出现如下异常

6、编写相关测试代码

pojo层:

package com.ue.pojo;import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Long id;private String name;private Integer age;private String email;
}

mapper接口层:

package com.ue.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ue.pojo.User;
import org.springframework.stereotype.Repository;/*** 在对应的Mapper上面继承基本的类BaseMapper,* 继承后所有的CRUD操作都已经编写完成了,不需要像以前一样写一大堆配置文件* @Author LiJun* @Date 2020/07/21* @Time 16:23*/
@Repository
public interface UserMapper extends BaseMapper<User> {}
注:需要在主启动类上去扫描mapper包下的所有接口

然后在测试类里进行测试:

package com.ue;import com.ue.mapper.UserMapper;
import com.ue.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MybatisPlusApplication.class)
public class MybatisPlusApplicationTests {//继承了BaseMapper后所有的方法都来自父类,但也可以编写自己的扩展方法@Autowiredprivate UserMapper userMapper;@Testpublic void queryAll(){//查询全部用户,参数是一个Wrapper(条件构造器)List<User> users = userMapper.selectList(null);users.forEach(System.out::println);}
}

测试结果如下:


MyBatis-Plus日志配置

目前所有的SQL是不可见的,如果希望知道它是怎么执行的,需要配置日志输出:

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


对MyBatis-Plus新增操作的分析

  • 测试代码如下:
@Test
public void testInsert(){User user = new User();user.setAge(18);user.setEmail("635275@qq.com");user.setName("哈利油");System.out.println(userMapper.insert(user));System.out.println(user);
}

测试结果如下:

  • MyBatis-Plus的主键生成策略

注:使用AUTO策略时需要在数据库设置主键自增

附:什么是雪花算法?
snowflake(雪花算法)是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0,可以保证几乎全球唯一。

分布式系统唯一id生成方案

对Mybatis-Plus修改操作的分析

  • 测试代码如下:
@Test
public void testUpdate(){User user = new User();user.setAge(18);user.setEmail("635275@qq.com");user.setId(1L);System.out.println(userMapper.updateById(user));
}

测试结果如下:

  • MyBatis-Plus的自动填充策略

使用场景:对表里创建时间、修改时间字段的维护一般都是自动化完成的,我们不希望手动去更新

自动填充方式一:数据库级别的操作(不推荐)

在表里给创建时间、修改时间加上默认值,使之自动填充:

自动填充方式二:代码级别的操作

先在实体类的属性上加上以下注解:

然后编写处理器来处理这个注解:

package com.ue.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;/*** 处理自动填充的处理器* @author LiJun* @Date 2020年07月22日* @Time 17:42*/
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill.....");this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill.....");this.setFieldValByName("updateTime",new Date(),metaObject);}
}

最后测试插入跟更新,观察数据库里的时间字段即可

  • MyBatis-Plus的乐观锁机制
在面试的过程中,经常会被问到乐观锁、悲观锁,这个其实非常简单:
乐观锁:顾名思义十分乐观,它总是认为不会出现问题,无论干什么都不会上锁,如果出现问题,则再次更新值
悲观锁:顾名思义十分悲观,它总是认为会出现问题,无论干什么都会上锁,然后再操作

Mybatis-Plus里面就用到了乐观锁机制,其实现方式如下:

  1. 更新前取出记录,获取当前version(版本号)
  2. 更新时,带上这个version
  3. 执行更新时,set version = newVersion where version = oldVersion
  4. 如果version不对,就更新失败

测试Mybatis-Plus乐观锁机制步骤如下:

给数据库中增加version字段

在实体类加上对应的字段以及注解

写配置类注册乐观锁组件

package com.ue.config;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** @author LiJun* @Date 2020年07月22日* @Time 18:58*/
@MapperScan("com.ue.mapper")
@EnableTransactionManagement
@Configuration
public class MyBatisPlusConfig {//注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor(){return new OptimisticLockerInterceptor();}
}

进行测试

//测试乐观锁成功
@Test
public void testOptimisticLocker(){//1、查询用户信息User user = userMapper.selectById(2L);//2、修改用户信息user.setName("TOM");user.setEmail("145736525@qq.com");//3、执行更新操作userMapper.updateById(user);
}//测试乐观锁失败(多线程下)
@Test
public void testOptimisticLocker2(){//线程1User user = userMapper.selectById(3L);user.setName("刘备111");user.setEmail("746382455@qq.com");//模拟另外一个线程2执行插队操作User user2 = userMapper.selectById(3L);user2.setName("刘备222");user2.setEmail("9458473345@qq.com");userMapper.updateById(user2);//如果没有乐观锁就会覆盖插队线程的值userMapper.updateById(user);
}

测试结果如下:

MyBatis-Plus之简介、快速入门、insert、update相关推荐

  1. MyBatis从入门到精通(一)—MyBatis基础知识和快速入门

    Mybatis简介 原始jdbc操作(查询数据) Connection connection = null;PreparedStatement preparedStatement = null;Res ...

  2. 【MyBatis】第一章 快速入门

    第一章 快速入门 文章目录 第一章 快速入门 一.介绍 1.使用 JDBC 的缺陷 2.MyBatis 框架解决的主要问题 二.入门案例 1.准备数据库 2.创建实体类 3.创建持久层 DAO 接口 ...

  3. mybatis学习笔记——mybatis-plus快速入门

    一.快速入门 MyBatis-plus (简称mp)是一款 Mybatis 增强工具,用来简化开发.增强效率.本文结合Spring Boot来实现mp的快速入门. 注:本文演示mp版本为当前最新的3. ...

  4. javaee互联网轻量级框架整合开发_整合MyBatis的关键点及快速入门

    对于从事Web应用开发人员,Java EE平台如今已经成为电信.金融.电子商务.保险.证券等各行业的大型应用系统的首选开发平台.在企业级应用的开发选择上,.NET已趋式微,PHP通常只用于开发一些企业 ...

  5. Zookeeper简介/快速入门——特别详细

    ZooKeeper是一个集中的服务,用于维护配置信息.命名.提供分布式同步和提供组服务.所有这些类型的服务都以某种形式被分布式应用程序使用.每次它们被实现时,都会有大量的工作来修复不可避免的错误和竞争 ...

  6. 运动控制器编程_快速入门 | 篇二十一:运动控制器ZHMI组态编程简介一

    点击上方"正运动小助手",随时关注新动态! 运动控制器ZHMI组态编程简介一  今天我们来学习一下,运动控制器的ZHMI组态编程简介.本文主要从产品概述.控制器连接触摸屏使用.HM ...

  7. Html与CSS快速入门01-基础概念

    Web前端技术一直是自己的薄弱环节,经常为了调节一个简单的样式花费大量的时间.最近趁着在做前端部分的开发,果断把这部分知识成体系的恶补一下.内容相对都比较简单,很类似工具手册的学习,但目标是熟练掌握. ...

  8. 联邦学习框架 FederatedScope(1)快速入门

    新鲜出炉的框架--两个月,暂时没什么教程,全程跟着官方文档走. 框架与文档可能存在一点小问题,以后肯定会改进,一切以当下事实为准. 文章目录 简介 快速入门 下载安装 文档的坑 安装依赖时 独立模式运 ...

  9. MyBatis 01 快速入门

    MyBatis 01 快速入门 文章目录 MyBatis 01 快速入门 一.学习目标 二.为什么需要框架技术 三.框架技术介绍 四.主流框架介绍 五.持久化与ORM 六.MyBatis简介 七.搭建 ...

最新文章

  1. 容器使用之vector
  2. mxnet统计运算量
  3. GridView如何设置View的初始样式
  4. 腾讯开源软件镜像站上线
  5. P2114-[NOI2014]起床困难综合症【位运算】
  6. 解决:-bash: unzip: command not found (Linux 中 unZip/Zip 的安装及使用)
  7. 和与余数的和同余理解_余数与同余解析
  8. pythonmysqlconnector_python操作mysql——mysql.connector
  9. bzoj 1059: [ZJOI2007]矩阵游戏(二分匹配)
  10. python双向链表以及双向循环链表
  11. 在ASP.NET中获取参数POST和GET方式提交的参数
  12. js去掉url中的域名
  13. java+poodle漏洞修复_SSLv3 Poodle攻击漏洞检测工具
  14. 1034-乘积小于 K 的子数组
  15. JS-函数进阶笔记二次总结
  16. android rom包修改工具,自己修改安卓的ROM包(非官方) | 寒山烟雨
  17. Python中rect属性
  18. modelzoo,WDSR模型训练脚本问题
  19. java snakeyaml_JAVA使用SnakeYAML解析与序列化YAML
  20. 在github/gitlab上下载单个文件

热门文章

  1. 剪辑软件怎么加声音?
  2. 梅西百货将VR技术更融入生活 加入App功能中提升用户体验
  3. 完美国际真数苹果_预告| 绿萌再创苹果、桃、梨品质分选风向标!
  4. CSS-- 精灵图和字体图标
  5. SQLITE sql 快速搜索
  6. C++_五子棋(注释版)
  7. 【C语言】——C语言实现科赫雪花及科赫曲线
  8. NLP强者!小i机器人再入“AI最佳掘金案例年度榜单”
  9. 【050】Free Video Clips-高质量视频素材
  10. 在家中搭建网站服务器可行吗?