Mybatis-Plus学习

一、简介

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

润物无声

只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑。

效率至上

只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。

丰富功能

热加载、代码生成、分页、性能分析等功能一应俱全。

二、创建并初始化数据库

2.1、创建数据库

mybatis_plus

2.2、创建user表

其对应的数据库 Schema 脚本如下:

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)``);

其对应的数据库 Data 脚本如下:

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.1、引入依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--lombok用来简化实体类--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

3.2、编写配置

在 application.properties 配置文件中添加 MySQL 数据库的相关配置:

spring boot 2.0(内置jdbc5驱动)

#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

spring boot 2.1及以上(内置jdbc8驱动)

注意:driver和url的变化

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

注意:

1、这里的 url 使用了 ?serverTimezone=GMT%2B8 后缀,因为8.0版本的jdbc驱动需要添加这个后缀,否则运行测试用例报告如下错误:

java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more

2、这里的 driver-class-name 使用了 com.mysql.cj.jdbc.Driver ,在 jdbc 8 中 建议使用这个驱动,否则运行测试用例的时候会有 WARN 信息

3.3、启动类

在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹

@SpringBootApplication
@MapperScan("com.atguigu.demomptest.mapper")
public class DemomptestApplication {public static void main(String[] args) {SpringApplication.run(DemomptestApplication.class, args);}}

3.4、编写实体类

创建包 entity 编写实体类 User.java(此处使用了 Lombok 简化代码)

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

3.5、 添加mapper

@Repository
public interface UserMapper extends BaseMapper<User> {}

3.6、测试

添加测试类,进行功能测试:

@SpringBootTest
class DemomptestApplicationTests {@Autowiredprivate UserMapper userMapper;/*** 查询全部用户*/@Testvoid findAll() {// 查询全部用户(里面的参数是筛选条件,可不选)List<User> users = userMapper.selectList(null);System.out.println(users);}
}

注意:

IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。

为了避免报错,可以在 dao 层 的接口上添加 @Repository 注

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

查看控制台输出:

3.7、查看sql日志输出

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

四、主键策略

1、插入操作

//添加
@Test
public void testAdd() {User user = new User();user.setName("lucy");user.setAge(20);user.setEmail("1243@qq.com");int insert = userMapper.insert(user);System.out.println(insert);
}

注意:数据库插入id值默认为:全局唯一id

2、MP的主键策略

2.1、ASSIGN_ID

MyBatis-Plus默认的主键策略是:ASSIGN_ID (使用了雪花算法)

@TableId(type = IdType.ASSIGN_ID)
private Long id;

雪花算法:分布式ID生成器

雪花算法是由Twitter公布的分布式主键生成算法,它能够保证不同表的主键的不重复性,以及相同表的主键的有序性。

核心思想:

长度共64bit(一个long型)。

首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。

41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。

10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。

12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。

2.2、AUTO自增策略

需要在创建数据表的时候设置主键自增

实体字段中配置 @TableId(type = IdType.AUTO)

@TableId(type = IdType.AUTO)
private Long id;

要想影响所有实体的配置,可以设置全局主键配置

#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

五、自动填充和乐观锁

1、更新操作

注意:update时生成的sql自动是动态sql:UPDATE user SET age=? WHERE id=?

//修改
@Test
public void testUpdate() {User user = new User();user.setId(1340868235401764865L);user.setName("lucymary");int count = userMapper.updateById(user);System.out.println(count);
}

2、自动填充

需求描述:

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作

2.1、数据库修改

在User表中添加datetime类型的新的字段 create_time、update_time

2.2、实体类修改

实体上增加字段并添加自动填充注解

@TableField(fill = FieldFill.INSERT)
private Date createTime;  //create_time@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime; //update_time

1.3实现元对象处理器接口

注意:不要忘记添加 @Component 注解

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {//mp执行添加操作,这个方法执行@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime",new Date(),metaObject);this.setFieldValByName("updateTime",new Date(),metaObject);}//mp执行修改操作,这个方法执行@Overridepublic void updateFill(MetaObject metaObject) {this.setFieldValByName("updateTime",new Date(),metaObject);}
}

3、乐观锁

适用场景

**主要适用场景:**当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式:

取出记录时,获取当前version

更新时,带上这个version

执行更新时, set version = newVersion where version = oldVersion

如果version不对,就更新失败

接下来介绍如何在Mybatis-Plus项目中,使用乐观锁:

4、乐观锁实现流程

4.1、修改实体类

/*** 乐观锁version* 更新时version会自动加一*/
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

4.2、创建配置文件

创建包config,创建文件MybatisPlusConfig.java

此时可以删除主类中的 @MapperScan 扫描注解

@Configuration
@MapperScan("com.atguigu.demomptest.mapper")
public class MpConfig {/*** 乐观锁插件*/@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
}

六、查询与分页

1、查询

1.1、通过多个id批量查询

完成了动态sql的foreach的功能

//多个id批量查询
@Test
public void testSelect1() {List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));System.out.println(users);
}

1.2、简单的条件查询

通过map封装查询条件

注意:map中的key对应数据库中的列名。如:数据库user_id,实体类是userId,这时map的key需要填写user_id

//简单条件查询
@Test
public void testSelect2() {Map<String, Object> columnMap = new HashMap<>();columnMap.put("name","Jack");columnMap.put("age",20);List<User> users = userMapper.selectByMap(columnMap);System.out.println(users);
}

2、分页

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能

添加分页插件

配置类中添加@Bean配置

/*** 分页插件*/
@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}

测试分页功能

//分页查询
@Test
public void testSelectPage() {Page<User> page = new Page(1,3);Page<User> userPage = userMapper.selectPage(page, null);//返回对象得到分页所有数据long pages = userPage.getPages(); //总页数long current = userPage.getCurrent(); //当前页List<User> records = userPage.getRecords(); //查询数据集合long total = userPage.getTotal(); //总记录数boolean hasNext = userPage.hasNext();  //下一页boolean hasPrevious = userPage.hasPrevious(); //上一页System.out.println(pages);System.out.println(current);System.out.println(records);System.out.println(total);System.out.println(hasNext);System.out.println(hasPrevious);
}

七、删除与逻辑删除

1、删除

/*** 根据id删除用户(物理删除)*/
@Test
public void testDeleteById(){int result = userMapper.deleteById(5L);System.out.println(result);
}/*** 批量删除*/
@Test
public void testMultipleDelete(){int i = userMapper.deleteBatchIds(Arrays.asList(1, 2, 3));System.out.println(i);
}/*** 简单的条件删除*/
@Test
public void testDeleteByMap(){// 第二个参数要用对象Map<String, Object> map = new HashMap<>();map.put("age",20);map.put("name","可爱发");int i = userMapper.deleteByMap(map);System.out.println(i);
}

2、逻辑删除

2.1、物理删除与逻辑删除

物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除数据

逻辑删除:假删除,将对应数据中代表是否被删除字段状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

逻辑删除的使用场景:

可以进行数据恢复

有关联数据,不便删除

2.2、逻辑删除实现流程

数据库修改

实体类修改

@TableLogic
private Integer deleted;

配置(可选)

application.properties 加入以下配置,此为默认值,如果你的默认值和mp默认的一样,该配置可无

mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

测试

测试后发现,数据并没有被删除,deleted字段的值由0变成了1

测试后分析打印的sql语句,是一条update

注意:被删除前,数据的deleted 字段的值必须是 0,才能被选取出来执行逻辑删除的操作

@Test
public void testLogicDelete() {int result = userMapper.deleteById(1L);system.out.println(result);
}

MyBatis Plus中查询操作也会自动添加逻辑删除字段的判断

八、条件构造器和常用接口

1、Wrapper介绍

Wrapper : 条件构造抽象类,最顶端父类

AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

QueryWrapper(主要用的) : 查询条件封装

UpdateWrapper : Update 条件封装

AbstractLambdaWrapper : 使用Lambda 语法

LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

LambdaUpdateWrapper : Lambda 更新封装Wrapper

2、查询方式

1、查询方式

查询方式 说明
setSqlSelect 设置 SELECT 查询字段
where WHERE 语句,拼接 + WHERE 条件
and AND 语句,拼接 + AND 字段=值
andNew AND 语句,拼接 + AND (字段=值)
or OR 语句,拼接 + OR 字段=值
orNew OR 语句,拼接 + OR (字段=值)
eq 等于=
allEq 基于 map 内容等于=
ne 不等于<>
gt 大于>
ge 大于等于>=
lt 小于<
le 小于等于<=
like 模糊查询 LIKE
notLike 模糊查询 NOT LIKE
in IN 查询
notIn NOT IN 查询
isNull NULL 值查询
isNotNull IS NOT NULL
groupBy 分组 GROUP BY
having HAVING 关键词
orderBy 排序 ORDER BY
orderAsc ASC 排序 ORDER BY
orderDesc DESC 排序 ORDER BY
exists EXISTS 条件语句
notExists NOT EXISTS 条件语句
between BETWEEN 条件语句
notBetween NOT BETWEEN 条件语句
addFilter 自由拼接 SQL
last 拼接在最后,例如:last(“LIMIT 1”)

3、测试

ge、gt、le、lt、isNull、isNotNull

@Test
public void testQuery() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("name").ge("age", 12).isNotNull("email");int result = userMapper.delete(queryWrapper);System.out.println("delete return count = " + result);
}

eq、ne

注意:seletOne()返回的是一条实体记录,当出现多条时会报错

@Test
public void testSelectOne() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "Tom");Useruser = userMapper.selectOne(queryWrapper);//只能返回一条记录,多余一条则抛出异常System.out.println(user);
}

between、notBetween

包含大小边界

@Test
public void testSelectCount() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.between("age", 20, 30);Integer count = userMapper.selectCount(queryWrapper); //返回数据数量System.out.println(count);
}

like、notLike、likeLeft、likeRight

selectMaps()返回Map集合列表,通常配合select()使用

@Test
public void testSelectMaps() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name", "age").like("name", "e").likeRight("email", "5");List<Map<String, Object>>maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表maps.forEach(System.out::println);
}

orderBy、orderByDesc、orderByAsc

@Test
public void testSelectListOrderBy() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("age", "id");List<User>users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

Mybatis-Plus入门学习相关推荐

  1. 1、MyBatis框架入门学习CRUD

    文章目录 框架前言 名词辨析 JavaWeb阶段回顾 框架介绍 ORM框架 MyBatis简介 MyBatis入门案例 1.环境准备 2.新建普通Maven项目,导入依赖 3.MyBatis核心配置文 ...

  2. (转)MyBatis框架的学习(二)——MyBatis架构与入门

    http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图:  下面作简要概述: ...

  3. mybatis入门学习之环境的搭建——helloworld

    Mybatis框架环境的搭建 首先,我是一名走java后端的大二菜鸟,我写博客一方面是用来记录我学习中遇到的问题,另一方面是希望和更多的人分享经验.如果我写的内容有不严谨的地方,还请大佬们纠正一下. ...

  4. MyBatis入门学习(二)

    在MyBatis入门学习(一)中我们完成了对MyBatis简要的介绍以及简单的入门小项目测试,主要完成对一个用户信息的查询.这一节我们主要来简要的介绍MyBatis框架的增删改查操作,加深对该框架的了 ...

  5. MyBatis入门学习教程

    MyBatis入门学习教程 1. MyBatis 原生使用入门篇 1.1 什么是MyBatis? 1.2 原生使用安装方法 1.3 使用示例 1.3.1 创建一个学习项目 1.3.1 添加依赖 1.3 ...

  6. MyBatis学习总结(1)——MyBatis快速入门

    2019独角兽企业重金招聘Python工程师标准>>> 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所 ...

  7. MyBatis学习笔记(一)——MyBatis快速入门

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4261895.html 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优 ...

  8. c++框架有哪些_Java Mybatis框架入门教程_v20200726

    MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...

  9. Java入门学习注意事项有哪些?

    想要学好java技术,做好学习规划路线和注意事项是非常重要的,尤其是零基础学员,Java涉及到的知识点非常多,我们需要制定合理的Java学习路线图,这样会事半功倍,下面小编和大家总结一下Java入门学 ...

  10. Mybatis底层原理学习(二):从源码角度分析一次查询操作过程

    在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...

最新文章

  1. CentOS7之新建用户与SSH登陆
  2. 【网页前端设计Front end】JavaScript教程.下(看不懂你来打我)
  3. 通过案例对 spark streaming 透彻理解三板斧之一: spark streaming 另类实验
  4. 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类
  5. python旅游推荐系统_如何用Python搭建一个简单的推荐系统?
  6. Python 2.x 与Python 3.x的差别总结
  7. 基于 Webpack2、Vue2、iView2 的可视化脚手架 iView Cli 发布 2.0 版本
  8. zz backgroundworker C#
  9. 海阔凭鲲跃 天高任鹏飞——从一场大赛看华为云的鲲鹏之“智”
  10. 前端开发常用网站整理
  11. 使用JAVA开发连连看游戏
  12. Java 中国大陆身份证处理
  13. ansys安装注意事项
  14. C++:乱码之字符串编码
  15. 【职场心路】一个老DBA的自白
  16. ipv6 dns修改方法
  17. PADS学习之路09-PADS LOGIC创建原理图工程文件
  18. Nginx到底能干嘛?!Nginx是做什么用的?通俗易懂,前端必看!
  19. Redis的Java客户端之Jedis(Jedis)
  20. css学习笔记-盒子的样式

热门文章

  1. 从苏宁电器到卡巴斯基(第二部)第27篇:我当高校教师的这几年 III
  2. 从技术走向管理(李元芳履职记)--摘抄总结
  3. C++11 新特性。
  4. HGOI11.1集训题解
  5. Windows平板真机调试
  6. FFmpeg 添加 提取mkv视频字幕
  7. scrapy 爬取苏宁图书
  8. gitbook 安装
  9. android网页离线保存
  10. 标准化和归一化 超全详解