MyBatisPlus的使用--十数个案例足以让你步入mybatisplus
文章目录
- 1. MybatisPlus
- 1.1 业务需求
- 1.2ORM
- 1.3ORM实现单表操作原理
- 1.4 MybatisPlus介绍(MP)
- 1.5 MybatisPlus特性
- 1.6 MybatisPlus的实际入门操作
- 1.6.1导入jar包
- 6.2 编辑POJO文件
- 6.3 继承共同的API接口
- 编辑YML配置
- 6.5 入门案例测试
- 1.7Mybatis案例
- 1.selectBatchIds
- 2. selectByMap
- 3. 条件构造器查询
- 4. Between-and
- 5. order by
- 6. like练习
- 7.inSql
- 8.select
- 9.condition
- 10. 根据对象查询
- 11. selectObjs
- 12.selectMaps
- 13. 新增用户
- 14.删除用户
- 15. 修改操作
- 完结!希望打开了页面就耐心的看完吧,你一定会有收获de
1. MybatisPlus
1.1 业务需求
Mybatis缺点:
- 1.Mybatis操作数据库的过程中,需要编辑大量的sql语句.无论该sql是否复杂或者简单.
- Mybatis操作时在xml配置文件中需要额外记忆单独的标签.
需求:能否实现单表操作的CRUD的全自动的实现.能否实现真正的ORM映射?
1.2ORM
要求:利用面向对象的方式操作数据库
特点:
1.操作数据库的面向对象.
userMapper.insert(user对象); ------->自己编辑sql语句
2.查询数据库的面向对象.
userMapper.selectByWhere(user对象); ------>动态的生成Sql------>自动实现结果集封装.
1.3ORM实现单表操作原理
要求:实现单表的自动的CRUD操作
例子:
User user = new Uesr();
• user.setId(xx).setName(xx).setAge(xx).setSex(xx);
• userMapper.insertUser(user);
框架内部实现过程:
核心:数据库只能识别sql语句.框架需要将对象转化为sql.
核心配置:
1.User对象与数据库的表 一一映射!
解决方法: 自定义注解标识表与对象的关系
2.User对象的属性与数据表中的字段一一映射!
解决方法:自定义注解完成属性与字段的映射
3.将CURD的方法进行统一的定义.形成工具API接口
解决方法:利用公共的mapper接口 BaseMapper,在其中定义几乎所有的单表的CURD操作.
4.将接口方法按照数据库方式转化为特定的sql语句.
1.用户的调用 userMapper.insert(user)
2.拼接特定的sql:
insert into 表名(字段名…) values(属性值…);
一般利用反射技术,可以通过对象或者有关对象的全部信息(注解,属性,属性值)
1.4 MybatisPlus介绍(MP)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.5 MybatisPlus特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 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.6 MybatisPlus的实际入门操作
1.6.1导入jar包
最主要的jar包
<!--spring整合mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>
本次所需的其余jar包
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--添加属性注入依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--引入插件lombok 自动的set/get/构造方法插件 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--支持热部署 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><!--引入数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--springBoot数据库连接 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>
6.2 编辑POJO文件
注意如果没有lombok插件可以在
https://blog.csdn.net/XING_Gou/article/details/104316560中安装Lombok插件
package com.jt.demo.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain=true) //链式加载
@TableName //标识对象与表之间的关联关系
public class User {//简化步骤:如果属性的名称与映射的名称一致,则可以省略不写@TableId(type=IdType.AUTO) //定义主键 主键自增private Integer id;//对象的属性与表中的字段.//@TableField(value="name")private String name;private Integer age;private String sex;}
DROP DATABASE IF EXISTS `jtdb`;
CREATE DATABASE `jtdb` DEFAULT CHARACTER SET utf8;
USE `jtdb`;/*Table structure for table `user` */DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` char(40) DEFAULT NULL,`age` int(11) DEFAULT NULL,`sex` char(40) DEFAULT NULL,PRIMARY KEY (`id`),KEY `cc` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;/*Data for the table `user` */insert into `user`(`id`,`name`,`age`,`sex`) values (1,'黑熊精',4000,'男'),(2,'鲤鱼精',5000,'男'),(3,'金角大王',3000,'男'),(4,'银角大王',4000,'男'),(5,'唐僧',30,'男'),(6,'悟空',501,'男'),(7,'白龙驴',2000,'男'),(8,'八戒',502,'男'),(9,'沙悟净',503,'男'),(11,'小乔',17,'女'),(12,'貂蝉',18,'女'),(16,'黄月英',18,'女'),(17,'孙尚香',18,'女'),(18,'甄姬c',20,'女'),(21,'孙尚香D',18,'女'),(22,'刘备',40,'男'),(23,'陆逊',33,'男'),(24,'陆逊',33,'男'),(25,'关羽',40,'男'),(27,'阿科',20,'女'),(31,'王昭君',19,'女'),(38,'貂蝉',18,'女'),(39,'西施',18,'女'),(40,'严真煌',16,'女'),(41,'白骨精',18,'女'),(43,'小乔',19,'男'),(44,'大乔',19,'女'),(46,'不知火舞',18,'女'),(49,'小兰兰',18,'男'),(50,'柳鹏林',18,'男'),(51,'妲己',18,'男'),(52,'如花',17,'男');
6.3 继承共同的API接口
public interface UserMapper extends BaseMapper<User>{...}
编辑YML配置
server:port: 8090 #标识端口号信息servlet:context-path: /
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: root#SpringBoot整合Mybatis-plus配置信息
mybatis-plus:#定义别名包 只要定义了别名包,则程序中resultType可以省略包路径type-aliases-package: com.jt.demo.pojo#配置文件的资源加载路径mapper-locations: classpath:/mybatis/mappers/*.xml#开启驼峰映射configuration:map-underscore-to-camel-case: true
6.5 入门案例测试
@RunWith(SpringRunner.class) //注意测试文件的位置 必须在主文件加载包路径下
@SpringBootTest
public class TestMP {//注入mapper接口@Autowiredprivate UserMapper userMapper;/*** 1.入门案例* 要求:查询全部的用户信息 不需要写where条件* 注意事项:利用MP的方法和自己的接口方法 名称不能重复.* * 参数说明:queryWrapper 动态生成sql语句中的where条件*/@Testpublic void test01() {List<User> userList = userMapper.selectList(null);System.out.println(userList);}
}
1.7Mybatis案例
1.selectBatchIds
/*** 练习1: 查询id信息为1,3,4,5,6用户数据* sql: select * from user where id in (1,2,3,4,5,6);* 思考:id可以利用数组进行接收 利用数组查询数据*/@Testpublic void test02() {List<Integer> idList = new ArrayList<Integer>();idList.add(1);idList.add(3);idList.add(4);idList.add(5);idList.add(6);//以对象的方式进行数据库操作List<User> userList = userMapper.selectBatchIds(idList);System.out.println(userList);}
2. selectByMap
说明:根据字段查询用户信息
/*** 练习2: 根据name="黑熊精" age="3000"查询数据信息* SelectByMap:根据具体的字段查询用户信息.* sql语句: select * from user where name="黑熊精" and age=3000* 规则:默认使用and连接符.*/@Testpublic void test03() {Map<String,Object> map = new HashMap<>();//key="字段名称" value="字段值"map.put("name", "黑熊精");map.put("age", 3000);List<User> userList = userMapper.selectByMap(map);System.out.println(userList);}
3. 条件构造器查询
/*** 4.name属性中包含"精"的数据,并且为女性* sql: SELECT * FROM USER WHERE NAME LIKE "%精%" AND sex = "女"* queryWrapper: 条件构造器* 作用 动态拼接sql的where条件* 逻辑运算符: >gt , <lt, =eq, >=ge, <= le*/@Testpublic void test04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", "精").eq("sex", "女");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
4. Between-and
/*** 查询年龄在18-35之间的女性用户.* sql: SELECT * FROM USER WHERE age BETWEEN 18 AND 35 AND sex ="女";*/@Testpublic void test05() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.between("age", 18, 35).eq("sex", "女");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
5. order by
/*** 条件: 查询年龄大于100岁的,并且按照年龄降序排列,* 如果年龄相同按照Id降序排列. * sql:SELECT * FROM USER WHERE age > 100 ORDER BY age DESC,id DESC;*/@Testpublic void test06() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", 100).orderByDesc("age","id");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
6. like练习
/*** 条件: 查询名称以"乔"结尾的,并且性别为女,并且age小于30岁.按照年龄降序排列.* SQL:* SELECT * FROM USER WHERE (NAME LIKE "%乔" AND sex="女"
AND age < 30) ORDER BY age DESC;*/@Testpublic void test07(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.likeLeft("name","乔").eq("sex", "女").lt("age", 30).orderByDesc("age");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
7.inSql
说明:适用于子查询
/*** 查询age < 100岁的用户,并且性别与name="孙尚香"的性别相同的的用户数据.* 分析: age<100 sex=男/女* sql:SELECT * FROM USER WHERE age < 100 AND sex in(SELECT sex FROM USER WHERE NAME = "孙尚香")*/@Testpublic void test08(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.lt("age",100).inSql("sex", "select sex from user where name ='孙尚香'");List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
8.select
/*** 需求: 有时可能不需要查询全部的数据库的表字段* 查询age为18岁的用户的名称和id.* select:挑选字段的属性.* 查询结果:User(id=12, name=貂蝉, age=null, sex=null)*/@Testpublic void test09() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name","id").eq("age", 18);List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
9.condition
/*** 条件判断* 以name和sex不为null的数据当做where条件.* condition作用:* 判断参数是否拼接为where条件* 结果true, 动态拼接参数* 结果false, 参数不会动态拼接* 应用场景:* 接收前台的参数时,参数可能为null或者其他的数值类型时* 需要添加判断.* 业务需求:* 如果age>18时,才能查询年龄*/@Testpublic void test10() {String name = null;int age = 18;QueryWrapper<User> queryWrapper = new QueryWrapper<>();//name属性的值,不为null时,才会拼接where条件queryWrapper.eq(!StringUtils.isEmpty(name), "name", name);queryWrapper.eq(age>18, "age", age);List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
10. 根据对象查询
/*** 根据对象查询数据库* 条件:根据对象中不为null的属性充当where条件* 需求:查询age=18的用户信息 性别=女* 说明:利用对象的方式查询时,逻辑运算符都是"="号*/@Testpublic void test11() {User user = new User();user.setAge(18).setSex("女");QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);List<User> userList = userMapper.selectList(queryWrapper);System.out.println(userList);}
11. selectObjs
说明:只查询主键信息(第一列)数据
/*** 需求:只查询主键的信息. * 类比: select * sql: SELECT id FROM USER where age >18*/@Testpublic void test12() {QueryWrapper<User> queryWrapper2 = new QueryWrapper<User>();queryWrapper2.select("id");//查询的List<User>对象信息userMapper.selectList(queryWrapper2);QueryWrapper<User> queryWrapper = new QueryWrapper<User>();queryWrapper.gt("age", 18);//只查询主键信息List<Object> idList = userMapper.selectObjs(queryWrapper);System.out.println(idList);}
12.selectMaps
说明:获取任意字段的数据信息
/*** 获取任意的字段信息* 需求:查询用户信息 只想获取id和name的值.不想获取age/sex* sql: select id,name from user where age > 18;*/@Testpublic void test13() {QueryWrapper<User> queryWrapper = new QueryWrapper<User>();queryWrapper.select("id","name").gt("age", 18);//获取全部的对象信息List<User> userList = userMapper.selectList(queryWrapper);//获取字段的信息List<Map<String,Object>> listMap = userMapper.selectMaps(queryWrapper);System.out.println(userList);System.out.println(listMap);}
13. 新增用户
@Testpublic void test14() {User user = new User();user.setName("外国人永久居住权").setSex("男").setAge(30);userMapper.insert(user);}
14.删除用户
/*** 删除用户信息*/@Testpublic void test15() {QueryWrapper<User> queryWrapper = new QueryWrapper<User>();queryWrapper.eq("name", "外国人永久居住权");//根据多个条件 删除用户数据.userMapper.delete(queryWrapper);//根据集合中的数据.批量删除用户信息Integer[] ids = {2000,2001};List<Integer> idList = Arrays.asList(ids);userMapper.deleteBatchIds(idList);//id 代表主键信息 根据主键进行删除.userMapper.deleteById(2000);//挑选字段和属性进行删除.Map<String,Object> columnMap = new HashMap<String, Object>();columnMap.put("name", "疫情");userMapper.deleteByMap(columnMap);}
15. 修改操作
/*** 更新操作* updateById: 根据主键信息修改数据.* 主键信息必须添加充当where条件, * 根据对象中不为null的数据,充当set条件.* sql: update user set name="xx",age=xxx,sex=xx where id=23* * update方法说明:* 参数1:entity 修改后的数据结果* 参数2:updateWrapper 修改的条件构造器* 案例:* 将杨颖改为范冰冰 修改年龄/性别* sql : update user set name="xxxx",age=xxx,sex=xxx* where name = "杨颖";* */@Testpublic void test16() {User user = new User();user.setId(23).setName("潘凤").setAge(35).setSex("男");userMapper.updateById(user);User user2 = new User();user2.setName("范冰冰").setAge(40).setSex("女");UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("name", "杨颖");userMapper.update(user2, updateWrapper);}
完结!希望打开了页面就耐心的看完吧,你一定会有收获de
MyBatisPlus的使用--十数个案例足以让你步入mybatisplus相关推荐
- 【数智化案例展】浙江电信——数据中台与BI技术助力通信行业驱动高质量数据价值的流通闭环...
网易数帆案例 本项目由网易数帆投递并参与"数据猿行业盘点季大型主题策划活动--<2022中国企业数智化转型升级创新服务企业>榜单/奖项"评选. 数据智能产业创新服务媒体 ...
- 【喜讯】美的5G+蓝牙AOA融合精准定位项目,入选国家工业和信息化部,创新十大场景应用案例
[喜讯]美的5G+蓝牙AOA融合精准定位项目,入选国家工业和信息化部,创新十大场景应用案例 核芯物联岳毅恒 https://www.miit.gov.cn/jgsj/xgj/wjfb/art/2021 ...
- 如何实践AI深度学习的十大惊艳案例
https://www.toutiao.com/i6641746367272190477/ 2019-01-02 12:08:01 你可能已经听说过深度学习并认为它是骇人的数据科学里的一个领域.怎么可 ...
- 大数据谋定农业发展路径-丰收节贸易会:全球十大经典案例
大数据谋定农业发展路径-丰收节贸易会:全球十大经典案例 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 哲商对话 万权采编:"基于物联网等技术的应用,农业领 ...
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5136035 转载请标明出处,原文地址:http://blog.csdn.net/mo ...
- react优秀项目案例_2020中国5G+工业互联网大会:鄂州2项目现场签约,2项目入选十大优秀案例...
11月19日-21日,2020中国5G+工业互联网大会在武汉市中国光谷科技会展中心成功举行. 2020中国5G+工业互联网大会是我国5G+工业互联网领域首次国家级大会.鄂州市作为"双千兆宽带 ...
- 应用网易轻舟,德邦快递核心系统入选云原生应用十大优秀案例
近日,在由中国通信标准化协会云计算标准和开源推进委员会(TC608)主办的OSCAR开源先锋日云原生专场活动上,"云原生应用十大优秀案例"评选结果正式公布,采用网易轻舟云原生平台建 ...
- 翻转课堂十大精彩案例
秦陇纪2010信息数据精简的微博http://weibo.com/INXCN欢迎大家粉我,跟帖,点赞,互粉(100以上才可以申请V,打扰大家了请多包涵).秦陇大田地信息数据方面的思考研究者.程序设计员 ...
- 使用 SAP UI5 Smart Chart 控件轻松绘制十数种不同类型的专业图表试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 本专栏计划的文章数在 300 篇左右,到 2022年11月19日为止,目前已经更新了 149 篇,专栏完成度为 49.6%. 作者简介 Jerry ...
- 阿里云数加案例-美柚
阿里云数加案例-美柚 美柚以让女人更美更健康为己任,致力成为最懂女人的互联网企业;美柚很早就将大数据作为了解女人.读懂女人.服务女人的最重要利器.大数据在美柚的应用非常广泛,然而在美柚大数据之路的初期 ...
最新文章
- JS点击显示隐藏内容
- 机器学习——正则化-L2
- mysql数据库引擎调优
- openjdk怎么执行java命令_Ubuntu 18.04 上使用 OpenJDK 安装并运行 Tomcat
- HTTP 视频怎么在 MIP 页面中使用?
- Mail.Ru Cup 2018 Round 1 virtual participate记
- t–sql pl–sql_SQL View –完整的介绍和演练
- 更新导致Svchost CPU100%(转)
- 70 行 Python 代码写春联,行书隶书楷书随你选
- 用python一条命令解决多个ts转换成MP4(就一条),备用两选一
- epoch如何设置_最易懂的方式介绍 神经网络模型中的Epoch、Iteration、Batchsize
- Word2019 未找到 MathPage.wll 文件的解决方法
- 支配节点树及其构建算法 Dominator-tree and its Construction Algorithms
- ruby--数值类(Numeric)
- sharding-jdbc系列之常见问题(十四)
- 快速搭建简单图床 - 远程访问本地搭建的EasyImage图床【内网穿透】
- 如何设置word的默认输入法——搜狗输入法
- HTML期末大作业: 学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做...
- 报错:NoSuchAlgorithmException: Algorithm HmacSHA1 not available
- 探讨企业即时通讯软件的价值
热门文章
- 职场技巧:高效实用的四象限法则
- 你可能不知道的iOS性能优化建议(来自前Apple工程师)
- ORA-28003和ORA-20001解决办法
- GCD深入学习之GCD的初识
- 曾经决心永不做游戏 但为何阿里巴巴的游戏之心一直死不了?
- DICOM世界观·第二章:[2]像素操作
- python c语言实现_使用C语言为python编写动态模块(3)--在C中实现python中的类
- Content是什么?Android中的Content、Activity、Application 有什么区别?
- seo模拟点击软件_浅谈百度SEO快排是什么、原理、如何判断及应对
- Git版本管理工具使用知识汇总