MyBatis-Plus——MyBatis-Plus概述与集成
文章目录
- MyBatis-Plus——MyBatis-Plus概述与集成
- 1、MyBatis-Plus概述
- 2、集成MyBatis-Plus
- 2.2、查询测试
- 2.3、插入测试和雪花算法
- 2.4、修改测试
- 2.5、逻辑删除和物理删除
- 3、配置日志输出
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, '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');
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 {@Autowiredprivate UserMapper userMapper;@Testvoid 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、插入测试和雪花算法
@Testvoid insertTest(){User user = new User();user.setAge(3);user.setId(10L);//如果不指定id,MP会自动帮我们生成iduser.setName("haoming");user.setEmail("123456@qq.com");int insert = userMapper.insert(user);System.out.println(insert);//受影响的行数}
数据插入成功
不指定id插入数据:
@Testvoid insertTest(){User user = new User();user.setAge(4);user.setName("shuhaoming");user.setEmail("123456789@qq.com");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
再启动上面的测试代码,查看控制台的日志输出:
MyBatis-Plus——MyBatis-Plus概述与集成相关推荐
- Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明
Atitit.mybatis的测试 以及spring与mybatis在本项目中的集成配置说明 1.1. Mybatis invoke1 1.2. Spring的数据源配置2 1.3. Mybatis ...
- Mybatis源码之与Spring集成包
这次讲讲Mybatis与Spring的整合,作为两款优秀的开源框架,被大众广泛使用,自然是需要强强联合的. 使用示例 先看一下怎么使用,首先需要引用这两款框架的jar包: <dependency ...
- mybatis注解开发_Spring Boot 中集成 MyBatis
阅读本文约需要5分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了Spring Boot 中的AOP处理,今天给大家分享下 ...
- Mybatis自定义轻量级分页组件(易集成,易拓展)
Mybatis自定义轻量级分页组件(易集成,易拓展) 其实github有一个叫做PageHelper的开源分页组件,我也用过,封装的还可以.只是感觉他的量级偏重,其实很多参数,都是我们开发中不需要的参 ...
- MyBatis(三)MyBatis缓存和工作原理
MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...
- MyBatis(一)MyBatis介绍和配置详解
在Java程序里面去操作数据库,最原始的办法是使用JDBC的API.需要分为六步: 注册驱动 通过DriverManager获取一个Connection 通过Connection创建一个Stateme ...
- MyBatis】MyBatis一级缓存和二级缓存
转载自 MyBatis]MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存.一级缓存的作用域默认是一个SqlSe ...
- MyBatis No MyBatis mapper was found in ‘[xx.mapper]‘ package. Please check your configuration
问题情形 在使用SpringBoot集成MyBatis的过程中,项目正常启动,但控制台打出如下日志: No MyBatis mapper was found in '[com.woxin.itsm.m ...
- (Mybatis)Mybatis简介和初步使用
1. Mybatis简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架 它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参 ...
最新文章
- golang 逐行 读文件
- ubuntu中文文件名乱码
- ArcGIS教程:Iso 聚类非监督分类
- amd为什么还用针脚_为什么AMD不取消cpu上的针脚?
- [转]在Windows server 2012上部署DPM 2012 SP1 RTM之安装配置
- 语言图片渐入代码_这个可能打败Python的编程语言,正在征服科学界
- 对数组操作[:,:4]
- 再次翻看WCF的书籍
- Android Makefile and build system 分析
- win10 更新 英特尔显示器音频 后显示器音箱没有声音
- 【三思笔记】 全面学习Oracle分区表及分区索引
- b站缓存的.blv和.m4s视频文件格式转换
- 苹果CMSv10插件/本地解析播放器-videojs解析 整合苹果cmsV10程序
- requestLayout() improperly called by
- 【网易有数】BI数据分析工具一
- C++ string 转化为LPCTSTR
- 手把手教你搭建SpringCloudAlibaba之Nacos服务配置中心
- 《延续香火的理想与普遍绝嗣的现实》
- android5.1之vibration学习总结
- Ligerui首页的快速搭建