最新要闻
- 百事通!河南安阳一楼盘推出0首付0月供购房,这是什么操作?
- 交个朋友陷恶意裁员风波 没有了罗永浩还能走多远
- 世界快资讯丨口碑又崩了 漫威大片《蚁人3》豆瓣开分6.4:量子力学也带不动
- 【世界快播报】红旗接入百度AI文心一言 打造国产豪车品牌标杆
- 【当前独家】物理老师用《塞尔达传说:荒野之息》讲解小船过河原理:林克听了都说好!
- 世界头条:144MB缓存游戏神U!锐龙9 7950X3D跑分首曝:果然不出所料
- 每日热门:小米13 Ultra渲染图曝光:中分造型四摄
- 千万小心二手RTX 20显卡!新套路出现:黑片秒变白片
- 日本MRJ刚失败 印度也要自研国产飞机:可载100人
- 女子第一次打到无人驾驶网约车:十分激动
- 每日热门:支持30+种中外语言!搜狗输入法力挺麒麟OS
- 世界微头条丨网站设计师招聘_网站设计师
- 每片5.5元!绿联苹果钢化膜促销:适用iPhone 14/13/12系列
- 每日视讯:河南发布电动车佩戴头盔规定草案:未戴拒不改正罚20元
- 全球观天下!苦等3年微软终于点头:苹果M1/M2 Mac正式支持运行Win11
- 天天短讯!李荣浩新歌《乌梅子酱》火了!乌梅子酱淘宝搜索量暴涨200倍
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
MyBatis-Plus (SpringBoot2 版) Learning Day01
Day 01 学习任务
了解Mybatis-Plus
整合Mybatis-Plus
通用CRUD Mybatis-Plus的配置
(资料图)
条件构造器
1、了解 Mybatis-plus
1.1、Mybatis-Plus 介绍
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网:https://mybatis.plus/ 或 https://mp.baomidou.com/
MP愿景
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
1.2、代码以及文档
文档地址:https://mybatis.plus/guide/ 源码地址:https://github.com/baomidou/mybatis-plus
1.3、特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
1.4、架构
2、快速上手
对于Mybatis整合MP有常常有三种用法,分别是Mybatis+MP、Spring+Mybatis+MP、Spring Boot+Mybatis+MP。
2.1、创建数据库以及表
-- 创建测试表CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;use `mybatis_plus`;CREATE TABLE `user` (`id` bigint(20) NOT NULL COMMENT "主键ID",`name` varchar(30) DEFAULT NULL COMMENT "姓名",`age` int(11) DEFAULT NULL COMMENT "年龄",`email` varchar(50) DEFAULT NULL COMMENT "邮箱",PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入测试数据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.2、创建 SpringBoot 工程
使用 Spring Initializr 快速初始化一个 Spring Boot 工程
引入依赖
4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.5 com.riotian MyBatis-Plus-Learn 0.0.1-SNAPSHOT 8 8 UTF-8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-web compile com.baomidou mybatis-plus-boot-starter 3.4.2 org.projectlombok lombok 1.18.20 com.alibaba fastjson 1.2.76 commons-lang commons-lang 2.6 mysql mysql-connector-java runtime com.alibaba druid-spring-boot-starter 1.1.23 org.springframework.boot spring-boot-maven-plugin 2.4.5
编写 application.yaml 文件
spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root password: kokoro
启动类设置
在Spring Boot启动类中添加@MapperScan注解,扫描mapper包
@SpringBootApplication@MapperScan("com.riotian.mplearn.mapper") // mapper 包存放的路径public class MyBatisPlusLearnApplication { public static void main(String[] args) { SpringApplication.run(MyBatisPlusLearnApplication.class, args); }}
添加实体
@Datapublic class User { private Long id; private String name; private Integer age; private String email;}
User类编译之后的结果:
添加 mapper
BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型
@Repository // 保障动态注入成功public interface UserMapper extends BaseMapper {}
测试
@SpringBootTestpublic class MP_Test { @Autowired private UserMapper userMapper; // @Repository 保障注入成功 @Test public void testSelectList(){ //selectList()根据MP内置的条件构造器查询一个list集合,null表示没有条件,即查询所有 userMapper.selectList(null).forEach(System.out::println); }}
IDEA若在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。 为了避免报错,可以在mapper接口上添加 @Repository 注解
添加日志
在application.yml中配置日志输出
mybatis-plus: configuration: # 配置MyBatis日志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3、基本 CRUD
3.1、BaseMapper
MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,接口如下:
Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
package com.baomidou.mybatisplus.core.mapper;public interface BaseMapper { //插入一条记录 参数:实体 返回:int Integer insert(T entity); //根据 ID 删除 参数:主键ID 返回:int Integer deleteById(Serializable id); //根据 columnMap 条件,删除记录 参数:表字段 map 对象 返回:int Integer deleteByMap(@Param("cm") Map columnMap); //根据 entity 条件,删除记录 参数:实体对象封装操作类(可以为 null) 返回:int Integer delete(@Param("ew") Wrapper wrapper); //删除(根据ID 批量删除) 参数:主键ID列表 返回:int Integer deleteBatchIds(List extends Serializable> idList); //根据 ID 修改 参数:实体对象 返回:int Integer updateById(T entity); //根据 whereEntity 条件,更新记录 参数:实体对象,实体对象封装操作类(可以为 null) 返回:int Integer update(@Param("et") T entity, @Param("ew") Wrapper wrapper); //根据 ID 查询 参数:主键ID 返回:T T selectById(Serializable id); //查询(根据ID 批量查询) 参数:主键ID列表 返回:List List selectBatchIds(List extends Serializable> idList); //查询(根据 columnMap 条件) 参数:表字段 map 对象 返回:List List selectByMap(@Param("cm") Map columnMap); //根据 entity 条件,查询一条记录 参数:实体对象 返回:T T selectOne(@Param("ew") T entity); //根据 Wrapper 条件,查询总记录数 参数:实体对象 返回:int Integer selectCount(@Param("ew") Wrapper wrapper); //根据 entity 条件,查询全部记录 参数:实体对象封装操作类(可以为 null) 返回:List List selectList(@Param("ew") Wrapper wrapper); //根据 Wrapper 条件,查询全部记录 参数:实体对象封装操作类(可以为 null) 返回:List List
// 用法举例// 接口:public interface UserDao extends BaseMapper {//这里面不用做任何操作}//具体实现方法中:QueryWrapper queryWrapper=new QueryWrapper<>();queryWrapper.lambda().eq(User::getName,"zhangsan");List userList = UserDao.selectList(queryWrapper); //调用UserDao中的方法
3.2、插入
@Testpublic void Insert() { User user = new User(); user.setAge(23); user.setName("zhangsan"); user.setEmail("zhangsan@gmail.com"); // insert into user(id,name,age,email) values (?,?,?,?) int count = userMapper.insert(user); System.out.println("受影响的行数"+count); // 1626576039783362562 System.out.println("ID 自动获取: " + user.getId());}
最终执行的结果,所获取的id为 1626576039783362562
这是因为MyBatis-Plus在实现插入数据时,会默认基于雪花算法的策略生成id
3.3、删除
3.3.1 by ID 删除
@Testpublic void testDeleteById() { // 通过 id 删除用户信息 // Delete from user where id = ? int count = userMapper.deleteById(1626576039783362562L); System.out.println("受影响的行数"+count);}
3.3.2 by ID 批量删除记录
@Testpublic void testDeleteBatchIds() { // 通过多个 id 批量删除 // Delete from user where id in (?, ?, ?) List idLists = Arrays.asList(1L, 2L, 3L); int count = userMapper.deleteBatchIds(idLists); System.out.println("受影响的行数"+count);}
3.3.3 by map 条件删除记录
@Testpublic void testDeleteByMap(){ //根据map集合中所设置的条件删除记录 //DELETE FROM user WHERE name = ? AND age = ? Map map = new HashMap<>(); map.put("age",23); map.put("name","zhangsan"); int count = userMapper.deleteByMap(map); System.out.println("受影响的行数"+count);}
3.4、修改
@Testpublic void testUpdateById(){ User user = new User(); user.setId(4L); user.setAge(10); user.setEmail(null); int count = userMapper.updateById(user); System.out.println("受影响的行数"+count);}
3.5、查询
3.5.1 根据id查询用户信息
@Testpublic void testSelectById(){ //根据id查询用户信息 //SELECT id,name,age,email FROM user WHERE id=? User user = userMapper.selectById(4L); System.out.println(user);}
3.5.2 根据多个id查询多个用户信息
@Testpublic void testSelectBatchIds(){ //根据多个id查询多个用户信息 //SELECT id,name,age,email FROM user WHERE id IN ( ? , ? ) List idList = Arrays.asList(4L, 5L); List list = userMapper.selectBatchIds(idList); list.forEach(System.out::println);}
3.5.3 通过map条件查询用户信息
@Testpublic void testSelectByMap(){ //通过map条件查询用户信息 //SELECT id,name,age,email FROM user WHERE name = ? AND age = ? Map map = new HashMap<>(); map.put("age", 22); map.put("name", "admin"); List list = userMapper.selectByMap(map); list.forEach(System.out::println);}
3.5.3 查询所有数据
@Testpublic void testSelectList(){ //selectList()根据MP内置的条件构造器查询一个list集合,null表示没有条件,即查询所有 userMapper.selectList(null).forEach(System.out::println);}
通过观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,此为条件构造器,可针对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据
3.6、通用Service
说明:
- 通用 Service CRUD 封装IService (opens new window)接口,进一步封装 CRUD 采用
get 查询单行
remove 删除
list 查询集合
page 分页
前缀命名方式区分Mapper
层避免混淆,- 泛型
T
为任意实体对象- 建议如果存在自定义通用 Service 方法的可能,请创建自己的
IBaseService
继承Mybatis-Plus
提供的基类- 对象
Wrapper
为 条件构造器
3.7、创建Service接口和实现类
// UserService.java/** * UserService继承IService模板提供的基础功能 */public interface UserService extends IService {}
// UserServiceImpl.java/** * ServiceImpl实现了IService,提供了IService中基础功能的实现 * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现 */@Servicepublic class UserServiceImpl extends ServiceImpl implements UserService { }
3.8、测试查询记录数
@Autowiredprivate UserService userService;@Testpublic void testGetCount(){ System.out.println("总记录数:" + userService.count());}
3.9、测试批量插入
@Testpublic void testSaveBatch(){ // SQL长度有限制,海量数据插入单条SQL无法实行, // 因此MP将批量插入放在了通用Service中实现,而不是通用Mapper ArrayList users = new ArrayList<>(); for(int i = 0;i < 5;i ++ ) { User user = new User(); user.setName("demo-0"+i); user.setAge(20 + i); users.add(user); } //SQL:INSERT INTO t_user ( username, age ) VALUES ( ?, ? ) userService.saveBatch(users);}
4、常用注解
4.1、@TableName
经过以上的测试,在使用MyBatis-Plus实现基本的CRUD时,我们并没有指定要操作的表,
只是在 Mapper接口继承BaseMapper时,设置了泛型User,而操作的表为user表
由此得出结论,MyBatis-Plus在确定操作的表时,
由BaseMapper的泛型决定,即实体类型决 定,且默认操作的表名和实体类型的类名一致
4.1.1、Question
若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?
我们将表user更名为t_user,测试查询功能
程序抛出异常,Table "mybatis_plus.user" doesn"t exist,因为现在的表名为 t_user,而默认操作的表名和实体类型的类名一致,即user表
4.1.2、通过@TableName解决问题
在实体类类型上添加@TableName("t_user"),标识实体类对应的表,即可成功执行SQL语句
4.1.3、通过全局配置解决问题
在开发的过程中,我们经常遇到以上的问题,即实体类所对应的表都有固定的前缀,例如
t_
或tbl_
此时,可以使用 MP 提供的全局配置,为实体类所对应的表名设置默认的前缀,那么就 不需要在每个实体类上通过@TableName标识实体类对应的表
mybatis-plus: configuration: # ??MyBatis?? log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: # 配置MyBatis-Plus操作表的默认前缀 table-prefix: t_
4.2、@Tabled
经过以上的测试,MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认基于雪花算法的策略生成id
-
MyBatis-Plus (SpringBoot2 版) Learning Day01
Day01学习任务了解Mybatis-Plus整合Mybatis-Plus通用CRUDMybatis-Plus的配置条件构造器1、了解Mybatis-plus1 1、Mybatis
来源: MyBatis-Plus (SpringBoot2 版) Learning Day01
百事通!河南安阳一楼盘推出0首付0月供购房,这是什么操作?
交个朋友陷恶意裁员风波 没有了罗永浩还能走多远
世界快资讯丨口碑又崩了 漫威大片《蚁人3》豆瓣开分6.4:量子力学也带不动
【世界快播报】红旗接入百度AI文心一言 打造国产豪车品牌标杆
【当前独家】物理老师用《塞尔达传说:荒野之息》讲解小船过河原理:林克听了都说好!
世界头条:144MB缓存游戏神U!锐龙9 7950X3D跑分首曝:果然不出所料
每日热门:小米13 Ultra渲染图曝光:中分造型四摄
世界观热点:剪绳子问题 之动态规划 及 大数越界情况下的求余问题
千万小心二手RTX 20显卡!新套路出现:黑片秒变白片
日本MRJ刚失败 印度也要自研国产飞机:可载100人
女子第一次打到无人驾驶网约车:十分激动
每日热门:支持30+种中外语言!搜狗输入法力挺麒麟OS
世界微头条丨网站设计师招聘_网站设计师
世界热点!3、TreeMap源码解析
每片5.5元!绿联苹果钢化膜促销:适用iPhone 14/13/12系列
每日视讯:河南发布电动车佩戴头盔规定草案:未戴拒不改正罚20元
全球观天下!苦等3年微软终于点头:苹果M1/M2 Mac正式支持运行Win11
天天短讯!李荣浩新歌《乌梅子酱》火了!乌梅子酱淘宝搜索量暴涨200倍
新资讯:1999元!小米米家智能除湿机50L发布:100平除湿 梅雨季不怕了
当前信息:阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由
看热讯:关于ChatGPT,我们到底在担心什么?
【世界新要闻】在centos stream 9上搭建k8s最新版本(当前:v1.26.1)集群环境
【环球热闻】云原生学习作业8
天天新消息丨本周盘点(2.13-2.17):永吉股份周跌2.30%,主力资金合计净流出1796.91万元
每日看点!三年之期已到 不换APP享受自由音乐的理想国还有多远?
诗与远方
天天快消息!男子初到上海见转弯扶梯被震撼 网友看呆:同没见过
6999元!爱玛联名雷神发布HERO限量款机车:2500W电机 一键弹射
张纪中回应张颂文沙漠捡垃圾被剧组丢下:请理性看待
ESXi Args勒索病毒来袭,VMware ESXi用户需提高警惕
2、HashMap源码分析
观热点:使用springboot cache + redis缓存时使用gzip压缩以提升性能
天天最新:微凸铜底设计!微星CORELIQUID M360散热器图赏
当前视讯!美俄亥俄州居民嘴唇变色脸上起红斑 官方称空气水质安全:小溪全是死鱼 污染超百公里
全球快资讯丨iPhone 15 Pro外观无悬念了!关键是价格会更贵
《生化危机4:重制版》新细节:艾达王将扮演重要角色
蚌埠住了!iPhone 18 Pro背面设计来了 堪称行星发动机
世界今日报丨2023湖南新能源汽车置换促销补贴怎么领取
如何用chatGPT、代理IP和网络爬虫,打造一个智能有趣的聊天机器人?
环球新动态:数据结构刷题2023.02.17小记
分享7个刺激的老司机网站,别轻易点开
天天观察:乐维百科:什么是IT监控?为什么运维需要监控?
今日最新!正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!
环球速看:2023年保定住房贷款利息个税专项附加扣除政策
《中国乒乓之绝地反击》今日正式上映:邓超、吴京演绎男乒至暗时刻
【世界聚看点】0脂无糖 舌里全麦面包14.9元2斤40片大促
你还会吃吗?女子用1元成本做出即食燕窝:呼吁别被智商税
今日热搜:车厂突然破产 几十万车主有点慌:修车配件全国找
真我GT Neo5 1TB版秒罄!徐起否认饥饿营销:需求量太大
天天微速讯:常见的个人博客搭建部署方案
焦点速递!SpringBoot
2023年跳槽,.NET工程师们,准备好了吗?
徐鸿平
快看点丨努比亚首款AR眼镜官宣:将亮相MWC 2023
全球动态:更耐摔?苹果上架iPhone 14 Pro屏幕保护膜:348元买吗
焦点快播:女车主买奇瑞QQ冰淇淋电动车一天坏3次!4S店承认故障 退车
天天速读:3月见!魅族20系列宣布首发无界生态系统Flyme 10
Reno时隔4年再度回归潜望长焦!OPPO Reno 10系列曝光
有个n字的鞋子是什么牌子?国产运动品牌有哪些?
贡菜是什么菜?贡菜的功效与作用是什么?
四王下山管天下是哪四个王?四王下山管天下是什么生肖?
春雨贵如油是什么节气?密密的春雨像什么比喻?
二十不惑人物关系是什么?二十不惑2演员表
iphone屏幕分辨率是多少?iphone屏幕分辨率怎么调?
天天热推荐:[django]钩子函数的一些细节(clean)
环球短讯!火山引擎入选《2022 爱分析 · DataOps 厂商全景报告》,旗下 DataLeap 产品能力获认可
快播:ETL的系统核心特征
环球热议:SQL Server创建Oracle链接服务器
电脑自动重启是什么原因?电脑自动重启频繁怎么解决?
CAD布局怎么使用?cad布局背景怎么调成黑色?
gta5怎么切换角色?GTA5怎么刷钱?
deb是什么意思?deb怎么安装?
世界热讯:BBA直呼内行!吉利“仰望银河”出圈:多家国产品牌跟风“望天”
天天时讯:首发1399元!小米小顽智能全自动猫砂盆开售:14天不用管
苹果iOS 16.4首个测试版发布 新增15个表情符号被吐槽太丑
今日热文:网传杭州取消限行 官方辟谣:假的、Chatgpt撰写生成
《狂野之心》IGN 8分:足以媲美《怪猎》狩猎大作
天天视讯!银河麒麟V10系统安装步骤
Java 文件上传
世界新动态:机器学习-集成学习GBDT
如何压缩图片大小?简单的图片压缩方法分享
世界视点!一降再降!一汽丰田首款纯电SUV大促:优惠6万到手13.98万起
祈福者放生2.5万斤鲇鱼被追责:属外来物种 危害极大
合资燃油车危险了!比亚迪秦PLUS DM-i冠军版上市7天订单超3.2万
当前动态:促销“狂飙”结束 特斯拉Model Y全系已上涨2000元
微软进一步拥抱AI:Win11新功能“记住”用户常用窗口布局
世界热点!《分布式技术原理与算法解析》学习笔记Day14
环球最新:Django Cannot assign "A1": "B1" must be a "C1" instance.
把选择语句和重复语句视为块
营收创6年最大跌幅!苹果被曝裁员外包员工 库克最后手段?
时隔3年半漫威重返内地!《蚁人与黄蜂女:量子狂潮》今日上映
天天热头条丨《星际争霸2》世界冠军李培楠回国:黄旭东等为其接风
当前视讯!三亚3米长搁浅抹香鲸救治无效不幸死亡:或被鲨鱼咬伤
全球看热讯:干货分享丨店长管理的五大核心你抓住了吗!
当前要闻:没买车的等等党们:赢了
每日看点!男子购买1200元年货32天快递仍未送达 邮政客服:车还在路上
每日动态!注意!特斯拉宣布召回超36万辆车 会突然停车发生车祸:马斯克火速回应
环球新动态:iPadOS 16:拖后腿了
读Java实战(第二版)笔记12_重构、测试和调试