mybatis-plus保姆级入门教程,手把手教你轻松实现增删改查
通过前几期的基础教学,想必大家都已经掌握springboot项目的创建及项目启动等基本内容了吧(如果还没掌握,请去复习我上几期的内容,好伐?)。
今个儿我要来整点高级的,使用组件的方式来轻松实现数据库交互,大家想不想学?好的,看到大家的积极性如日中天啊,老夫深感欣慰。那bug菌将不遗余力地传授给大家,同时也希望大家在学习的过程中,打好基础,认真听哦。
上一期我们是通过注入jdbc模板类进行数据库查询对吧,虽然这种交互方式可以,但是面对不常用数据类型,就不好使了,所以我要教大家一种最省事最方便的,那就是mybatis-plus,超级好用的一个组件,省去大量手写sql的体力活,让你一切查询变得简单而又透彻。这期我的目的就是引领你们入门。 具有很好的教学价值,希望小伙伴们根据这篇文章可以有所收获,建议小伙伴们先收藏后阅读哦。
首先,我们先来了解一下,mybatis-plus为何物?与mybatis有何不同?最关键也是最重要的部分,它如何使用?
好的,别着急,咱们接着往下看。
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
愿景:
我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
任何能使用 mybatis 进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下,如果不在下列表查看分页部分教程 PR 您的支持。
- mysql,oracle,db2,h2,hsql,sqlite,postgresql,sqlserver,Phoenix,Gauss ,clickhouse,Sybase,OceanBase,Firebird,cubrid,goldilocks,csiidb
- 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库
1、老规矩,使用前先引入pom依赖;添加如下:
ps:如果有小伙伴图省事,可以使用代码生成器,超级方便,但由于此篇是入门级教学,那我就手把手带着大家手动创建控制器,分发器等文件吧,日后再带大家熟悉使用自动生成器,行吧?感兴趣的小伙伴也可以参考bug菌写的这篇《mybatis-plus代码生成器入门教学》,自己动手实战一下,很简单的。
2、引入完依赖之后,结合阿里开发规范,对业务逻辑进行分层,本着低耦合高内聚的目的而去。
3、由于我前几期已经创建了一个 UserController 对吧,接着来创建实体类,UserService接口层,UserServiceImpl接口实现层,及最后的UserMapper 持久层。
UserEntity
- **@TableName(“table_name”):**指定数据库表名。
- **@TableId :**指定type = IdType.AUTO 表示数据库id为自增型。
- **@TableField(value = \”name\”) :**指定数据库字段名。
- 添加get set方法即可。 package com.example.demo.Entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; /** 用户基本信息实体 */ @TableName(\”user\”) public class UserEntity {
- @TableId(value = \”id\”, type = IdType.AUTO) //表示该id为自增,新增时候不需要手动设置id。
**
然后再多添加几条数据吧!方便后续查询接口浏览查询。
UserService
编写两个接口!分别为不带参数与带一个参数,作为演示:具体代码如下
UserServiceImpl
继承接口实现上方两方法。
由于是使用了该mybatis-plus的查询方式,顾语法有些不一样。这个后续给大家详细讲讲。
UserMapper
以上 添加就大功告成了;
最后是controller类,调用刚才我们写的那两接口进行访问,看看结果如何
分发器代码如下:
接下来,不用我说大家也知道了吧!接口访问,一切从简,那就直接打开浏览器访问咯
奥对了在访问之前,咱们再做一件事,添加一下控制台sql打印输出,方便我们查看到底执行了什么?对吧。做法只需在application-dev.yaml 中配置如下即可。
ok~咱们先来访问第一个接口;浏览器直接访问。
http://localhost:8080/user/get-users
ps:如果中途报错,找不到basemapper
那你请在启动类 DemoApplication 中添加如下这行,表示指定扫描 dao。
然后我们再看下控制台,看看执行了什么sql语句?请看如下:
第一个查询语句,成功输出,也打印并返回五条数据值。
接下来我们来访问第二个接口,带性格参数。看看能否成功?
http://localhost:8080/user/get-users-by-sex?sex=男
结果如下:
结果上看,明显是进行了条件查询,只查询出了性别为男的数据!证明带参也是没问题。
我们来确认一下,回到idea控制台,请看下边,朋友们,sql语句已经告诉了我们一切,很显然,是把sex = \’男\’ 作为了where 条件 进行了数据过滤!
把参数换成 \’女\’ 试试,能否数据过滤
结果如下:
也是根据性别参数成功过筛数据。
好啦!接下来你们就随便玩随便造啦。想怎么玩就怎么玩,反正就是引领入门,修行靠个人啦~
脚本化修改Oracle用户的密码以及执行sql(增删改查等)
EOF是(END Of File)的缩写,表示自定义终止符。既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d 就代表EOF。
EOF一般会配合cat能够多行文本输出。
其用法如下:
<<EOF #开始
…. #输入内容
EOF #结束
还可以自定义,比如自定义:
<<ABC #开始
….
ABC #结束
本小结(四)引自php中文网:https://www.php.cn/faq/514880.html
Windows下对Oracle数据库最简单的增删改查,零基础
本次试验依然在windows 2016下进行。
一、以默认普通用户scott/tiger连接数据库
安装Oracle时,若没有为下列用户重设密码,则其默认密码如下:
以普通用户scott连接,默认密码为tiger
格式:conn 用户名/密码(conn scott/tiger)
口令更改为cat
二、检查Oracle的服务
点击开始—运行,输入services.msc ,打开windows的服务选项,
回车
找到Oracle数据库服务是否启动的两个服务,一个是Oracle服务,一个是Oracle监听服务。
其中ORCL为数据库的名称
下面是oracle的监听程序,专门用来负责数据库用户远程访问数据库。
三、最简单的增删改查
3.1查询(select)
3.1.1查询用户SCOTT状态
SQL> select username,account_status from dba_users where username=\’SCOTT\’;
EXPIRED表示数据库用户处于到期状态,不能正常连接上数据库。
&是并且的意思
LOCKED表示用户处于锁住状态,不能使用该数据库用户。
解锁数据库用户语法
alter user 数据库用户名 account unlock;
解锁SCOTT用户
SQL> alter user scott account unlock;
验证SCOTT用户的状态
SQL> select username,account_status from dba_users where username=\’SCOTT\’;
上图显示SCOTT用户已经解锁,但是目前处于到期状态。在EXPIRED状态下,Oracle数据库默认SCOTT用户需要使用原来的密码重新登录,并设置新密码,即可解除到期状态。
SQL> conn scott/tiger
conn是connect的缩写,scott为oracle数据库的用户,tiger为scott用户的初始密码。
图中显示:\”the password has expired\”,说明scott用户密码到期,输入新口令cat
验证查询soctt用户是open状态
SQL> select username,account_status from dba_users where username=\’SCOTT\’;
用scott/cat的用户名和密码连接数据库
C:\\Users\\Administrator>sqlplus scott/cat
验证连接用户
SQL> show user
3.1.2查询SCOTT用户拥有那些表
SQL> select table_name from user_tables;
上图中可以看到有4个表,
DEPT(Department 部门)
EMP(Employee 雇员)
BONUS(奖金)
SALGRADE(Salary Grade薪水等级)
上图中SQL语句解释
select 是SQL语句查询表数据必须的关键字,并且在查询SQL语句的开头,后面跟的是表中的列,如果查询多个列值,可以使用逗号隔开。
table_name 是user_tables表的一个用来存储表名的字段;而(*)则表示表中的所有字段。
from 是SQL语句查询表中必需的关键字,表示这些列数据\”来自\”那个表中,后面必须是表名。
user_tables,这是指表名,即把该表的列数据全部查询出来,它是Oracle数据库内部的表(也是)数据字典,专门用来查询用户自己拥有那些表。
分号(;)这是英文字符的符号,是表示这条查询SQL语句结束的符号。
3.1.3查看有哪些部门
SQL> select * from dept;
上图知,虚线上面有三个英文单词,这表示dept表有三列,
DEPTNO(部门号)
DNAME(部门名称)
LOC(工作地点)
可见该公司有4个部门,部门分别为10,20,30,40
可以看到部门为10的部门名称为ACCOUNTING(财务部),工作地点在NEW YORK(纽约)。
*表示所有字段
3.1.4查询dept表有哪些列
SQL> desc dept
由上图可知该表有三列
DEPTNO(部门号)
DNAME(部门名)
LOG(部门工作地点)。
3.2增加(insert into)
3.2.1增加一个Development(开发)部门
SQL> insert into dept(deptno,dname,loc) values (50,\’Development\’,\’Beijing\’);
Insert into 插入SQL语句,而且必须是在开头,在其后跟随的是表名。
把刚才插入的数据提交到数据库中,如果没有commit,则插入的SQL语句在计算机的内存中。
SQL> commit;
3.2.2查看dept部门表中是否存在刚插入的数据,已经在dept部门表中增加了Development开发部门。
SQL> select * from dept;
3.3修改(update)
把开发部门的办公地点更改为上海。
SQL> update dept set loc=\’Shanghai\’ where deptno=50;
查询结果
SQL> select * from dept;
update 是SQL更新语句的关键字,并且在语句的开头,后面跟随的是需要更新的dept表。
set 是SQL更新语句的关键字,该关键字跟随在表名的后面,是\”设置\”的意思。在后面跟随所要更新的列值。比如这里loc为dept表的字段,把该值更改为\”Shanghai\”。
where 是SQL语句中的条件限制关键字,即操作的数据需要满足的条件,这个关键字可以在增删改查SQL语句中使用,一般用在SQL语句的后面来表示条件。条件可由列名、字符串、算数表达式等组成。
deptno=50 是SQL条件语句的一部分,表示在dept表中把部门号等于50的数据查询出来。
3.4删除(delete)
删除Development开发部门
SQL> delete from dept where deptno=50;
delete from 是SQL语句中删除数据必不可少的关键字,并且位于SQL语句的开始位置。后面跟随的是要删除的dept表,表名后面则是where条件限制语句。
四、综合运用
4.1 查询出公司每个员工的号码、名字、薪水。
SQL> select empno ,ename,sal, from emp;
select关键字后可以选择查询任意列,列与列之间用逗号隔开。后面跟随的empno、ename、sal均为emp表的列。
4.2调整查询结果表的列次序,可以把最关心的重点列放到最前面。
SQL> select ename,sal,empno from emp;
4.3在oracle的sqlplus中,英文字符默认是左对齐,而数字则默认是右对齐。
查看员工的姓名和入职时间,其中hiredate的时间格式与我国习惯不符,毕竟Oracle数据不是中国人开发的。
SQL> select ename,hiredate from emp;
把时间设置为我们习惯的时间格式,仅仅是设置为当前会话场景。
SQL> alter session set nls_date_format=\’YYYY-MM-DD\’;
alter 更改数据库参数的SQL语句关键字。
session 只更改当前会话的时间格式
nls_date_format 数据库的日期参数,日期虽然一样,但可以有不一样的时间日期格式
4.4查询当前数据库时间
SQL> select sysdate from dual;
dual是oracle数据库的一个虚表,即不是真实存在的表,在查询用到计算、常量、表达式等时可以使用的dual虚表。
4.5查询在公司服务时间的员工信息,使用当前时间减去员工的入职时间,就可以得到在公司服务时间,这里需要引入round函数。
SQL> select ename,round((sysdate-hiredate)/365,0) from emp;
round(x,y) 是Oracle数据库的一个四舍五入的函数
x 表示这个数字需要进行四舍五入
y 则表示在哪位数进行四舍五入,如果y=0,表示在个位进行四舍五入,y=2表示在小数点后两位进行四舍五入。
4.6根据入职时间求出工作年限并且按照年限(第二列)升序排列
SQL> select ename,round((sysdate – hiredate)/365,0) from emp order by 2;
Order by 2中,order by 是排序的关键字,2表示按照第二列排序,默认排序是升序。
4.7按照工作年限倒序查询出每个员工的年数
SQL> select ename,round((sysdate-hiredate)/365,0) from emp order by round((sysdate-hiredate)/365,0) desc;
desc 表示排序使用降序来输出数据,即从大到小进行排序。
4.8 Oracle数据库查询入职时间。
SQL> select ename,round((sysdate-hiredate)/365,0) from emp order by hiredate;
把查询出来的表列名变成中文,方便显示。
SQL> select ename as \”姓名\” ,round((sysdate-hiredate)/365,0) as \”工作(年)\” from emp order by \”工作(年)\” desc;
as 是列别名的关键字,可以用英文双引号\”\”里面的字符来表示该列的别名。如\”姓名\”是ename列的别名,查询输出数据时以\”姓名\”代替了ename列名。
工作年数的列名则变成了\”工作(年)\”,在Oracle数据库中,同时允许用列的别名进行排序。
4.9查询工资
SQL> select ename,sal from emp order by sal;
4.10 每个人增加1500元进行显示
SQL> select ename,sal+1500 from emp order by sal;
4.11对查询出来的员工薪水进行文字说明
SQL> select ename||\’员工本月工资为:¥\’|| (sal+1500) as \”公司员工本月工资表\” from emp order by sal;
|| 两个竖杠是oracle的连接符,可以把查询出来的数据和其他字符串连接起来,可以对多个字符串、多个表的列值相连接。
\’ \’ 两个单引号\’\’里面的字符串,可以把里面的字符串输出。即表的列数据和字符串连接在一起输出结果。
4.12查询到部门表中部门有重复的
SQL> select ename,deptno from emp;
为了清晰显示有哪些部门,可以过滤掉重复的部门值
SQL> select distinct deptno from emp;
distinct是去掉重复数据的SQL关键字,这个去掉重复数据的关键字经常用到。
4.13查询工资少于2000元的员工,并按照薪水排序。
SQL> select ename,sal from emp where sal<=2000 order by sal;
Order by需要在where的后面,常用运算符如下
\”>\”大于
\”>=\”大于等于
\”<\”小于
\”<=\”小于等于
\”<>\”和\”!=\”都是不等于
\”=\”等于
4.14查看薪水在1500到2500元之间的员工信息并且按照薪水排序
SQL> select ename,sal from emp where sal between 1500 and 2500 order by sal;
between…and…用于条件where之中,表示数值介于两个数值之间,这里表示是工资在1500-2500之间。
4.15查询拿保底工资的销售人员
SQL> select empno,ename,job,sal from emp where job=\’SALESMAN\’ and sal=1250;
where条件中的and表示\”而且\”的意思,即条件既要是销售人员,而且工资也是1250元的员工。
4.16查看没有奖金及工资少于1500元的员工
SQL> select empno,ename,job,sal,comm from emp where comm is null or sal<=1500;
or 是或者的意思,这里表示没有奖金或者工资少于等于1500元的员工;
null 在oracle数据库中是一个很特殊的值,它即不表示0,也不表示空,是一个不能确定的未知数。
4.17员工的工资加上提成,那个员工的工资是最少的
SQL> select empno,ename,job,sal,comm,sal+nvl(comm,0) from emp where comm is null or sal<=1500 order by sal+nvl(comm,0);
Nvl(X,Y)是数据库的一个内部函数,表示如果X有值,则返回X的值,如果X的值为null,则默认为Y。
这里则是用comm(提成)替代X,\”0\”代表Y,如果有提成,则工资加上提成;如果没有提成,则表示提成是\”0\”,只有工资。把员工的薪水加上提成作为排序,可以明显看出来员工的收入多少。
4.20查看姓名中\”M\”开头的员工
SQL> select ename,job,sal from emp where ename like \’M%\’;
Like 是条件where中模糊查询的关键字,后面的字符串需用双单引号括起来,%在SQL语句中表示字符后面的所有字符,其中M%表示以M开头的所有字符。
4.21查询哪些员工属于销售人员、分析师、管理人员。
SQL> select ename,job from emp where job in (\’SALESMAN\’,\’ANALYST\’,\’MANAGER\’);
in 表示在某个列中存在多个值均符合,或者使用or代替也可。
下面用or来代替上面的SQL语句,同时看看有哪些不一样。在oracle数据库的命令窗口输入下面的SQL语句:
SQL> select ename,job from emp where job=\’SALESMAN\’ or job=\’ANALYST\’ or job=\’MANAGER\’;
4.22统计公司每个岗位都有多少个员工
SQL> select job,count(*) from emp group by job;
group by 是oracle数据库中的分组函数,可以这样理解,按照工作职位进行分组,然后统计每个职位的人数。
Count(*)是统计数量的函数,这里统计公司每个岗位都有多少人。
4.23统计公司每个岗位都有多少个员工,并按数量进行排序。
SQL> select job,count(*) from emp group by job order by count(*);
4.24统计公司每个部门有哪些员工,并按照部门号进行排序。
SQL> select deptno,count(*) from emp group by deptno order by deptno;
从图中可以看到,10号部门有3人,20号部门有5人,而30号部门有6人。
4.25求公司总共支付员工的薪水
SQL> select sum(sal)+sum(nvl(comm,0)) from emp;
sum 是Oracle数据库内部的一个函数,即所有数值之和。
4.26求公司员工的平均工资
SQL> select round(avg(sal),2) from emp;
avg是oracle数据库的求平均值函数。
4.27统计公司所有员工中最高、最低、工资及相差多少
SQL> select max(sal),min(sal),max(sal)-min(sal) from emp;
max 是Oracle数据库内部的函数,专门统计最大的数值
min 是Oracle数据库的内部函数,专门统计最小的数值
4.28列出平均工资大于2500的岗位
SQL> select job,avg(sal) from emp having avg(sal)>2500 group by job;
having 在使用group by分组时,如有条件限制需要使用having,而不能使用where.即在group by中所对应的条件限制为having,上面的例子中数据库首先使用group by进行岗位分组,再使用avg(sal)求出每个岗位的平均工资,最后平均工资大于2500元由having进行限制。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。