mysql 存储过程视图触发器及springboot+mybatis调用(有点过时了,不是需要不建议)

本文介绍了MySQL的存储过程、视图和触发器,包括它们的创建、使用及优缺点。示例展示了如何在SpringBoot+MyBatis中调用存储过程,提醒读者这些知识已过时,非必要情况下不建议使用。
摘要由CSDN通过智能技术生成

已经过时了,写在这里给需要的朋友,入门使用

1.创建数据库、创建表、测试数据

创建数据库

在这里插入图片描述

创建表:

在这里插入图片描述

这儿没有使用外键

#班级表
CREATE TABLE xmcc_class(
c_id INT PRIMARY KEY  AUTO_INCREMENT COMMENT '班级编号',
c_name VARCHAR(10) NOT NULL COMMENT '班级名称'
)ENGINE=INNODB DEFAULT CHARSET=utf8;
#学生表
CREATE TABLE xmcc_student(
s_id INT PRIMARY KEY  AUTO_INCREMENT COMMENT '学生学号',
s_name VARCHAR(10) NOT NULL COMMENT '学生姓名',
s_phone VARCHAR(11) NOT NULL UNIQUE COMMENT '学生电话',
s_cid INT COMMENT '班级id'
)ENGINE=INNODB DEFAULT CHARSET=utf8;

测试数据

在这里插入图片描述

#测试数据
INSERT INTO xmcc_class(c_name) VALUES('java'),('.net'),('php'),('python')
#三个java班 一个.net 班 2个php 没有python
INSERT INTO xmcc_student(s_name,s_phone,s_cid) VALUES
('小a','11111111111',1),
('小b','22222222222',1),
('小c','33333333333',1),
('小d','44444444444',2),
('小e','55555555555',3),
('小f','66666666666',3)

2.视图

1.什么是视图

通俗的讲,视图就是一条SELECT语句执行后返回的结果集。就是为了隐藏一部分数据或者减少联表查询而创建的一张虚拟表

2.视图的特性

视图是对若干张基本表的引用,一张虚表,查询语句执行的结果,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变);

可以跟基本表一样,进行增删改查操作(ps:增删改操作有条件限制);

3.视图的作用

方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性;

更加安全,数据库授权命令不能限定到特定行和特定列,但是通过合理创建视图,可以把权限限定到行列级别;

4.使用场合

权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary…

关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;

以例子来学习,首先看看语句:

创建视图:

CREATE VIEW 视图名(列1,列2…)

AS SELECT (列1,列2…)

FROM 表名;

删除视图:

Drop view if exists 视图名

一般不太会去修改视图

2.1隐藏字段

场景:现在项目中有一个学生推荐系统,需要避免企业得知学生的联系方式,不然学生直接就跟企业联系了

分析:这样就不能把学生表直接给学生推荐系统,可以创建视图隐藏学生的电话字段

在这里插入图片描述

2.2将表的关联数据,存储于视图中简化查询

场景:实际中有很多查询,需要对多张表联合操作,有一定的复杂度,完成需要一定的sql能力,可以通过视图简化查询的难度

这儿的查询比较简单,但是也能说明问题,比如查询学生的信息及所在班级名字,需要联表查询,就可以创建视图来简化以后的查询

在这里插入图片描述

大家只需要理解、记住这两个优点就可以了

2.3缺点

性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。

表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。(视图是虚拟的 跟随基本表变化)

3.触发器

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

3.1触发器语句

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt

trigger_name:触发器的名称

tirgger_time:触发时机,为BEFORE或者AFTER

trigger_event:触发事件,为INSERT、DELETE或者UPDATE

tb_name:表示建立触发器的表名,就是在哪张表上建立触发器

trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句

删除触发器:

Drop trigger 触发器名称

3.2案例

为student的班级id列增加外键约束

在这里插入图片描述

ALTER TABLE xmcc_student ADD CONSTRAINT cid_key FOREIGN KEY(s_cid)
REFERENCES xmcc_class(c_id);

现在有了外键约束,如果我们删除其中.net班级

在这里插入图片描述

这个时候就可以使用触发器,当删除某个班级的时候触发修改当前班级学生的班级id为null,当然这儿不需要去深究逻辑

创建触发器

在这里插入图片描述

#创建触发器来保证数据的完整性
CREATE TRIGGER trigger_test  #触发器名称为trigger_test
BEFORE DELETE  #在删除前
ON xmcc_class FOR EACH ROW  #对xmcc_class每一行
UPDATE xmcc_student SET  #修改xmcc_student
#old表示删除前的行数据 如果是修改的old表示修改前 new表示修改后
s_cid=NULL WHERE s_cid=old.c_id

测试:

在这里插入图片描述

查看xmcc_student表

在这里插入图片描述

3.3说明及缺点

这儿只是以一个简单的例子来理解触发器,大家需要记住语句的使用,需要看得懂触发器,也需要能写触发器,实际的中的触发器可能逻辑会难一点,但是语法基本都是这样了,会加一定plsql我们在存储过程中再去学习.

Spring Boot + MyBatis调用MySQL 8的存储过程需要遵循以下步骤: 1. 在MySQL 8中创建存储过程。例如: ```sql CREATE PROCEDURE example_procedure(IN param1 VARCHAR(20), OUT result INT) BEGIN -- 存储过程主体 END; ``` 2. 在Spring Boot项目中引入MySQL 8的JDBC驱动和MyBatis框架的相关依赖。 3. 编写MyBatis的Mapper接口,用于调用存储过程。例如: ```java @Mapper public interface ExampleProcedureMapper { @Options(statementType = StatementType.CALLABLE) @Select("{CALL example_procedure(#{param1, mode=IN, jdbcType=VARCHAR}, #{result, mode=OUT, jdbcType=INTEGER})}") void exampleProcedure(@Param("param1") String param1, @Param("result") Integer result); } ``` 其中,@Mapper注解用于标识该接口为MyBatis的Mapper接口,@Options注解用于设置SQL语句的类型为存储过程调用,@Select注解用于定义调用存储过程名称和参数列表。 4. 在Spring Boot的配置文件中配置数据源和MyBatis的相关配置。例如: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/example_db?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver # MyBatis相关配置 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity ``` 其中,url、username、password和driver-class-name分别为MySQL 8的连接信息,mapper-locations用于指定Mapper接口和SQL语句的XML文件位置,type-aliases-package用于指定实体类的包名。 5. 在代码中调用Mapper接口的方法,即可执行存储过程并获取返回。例如: ```java @Service public class ExampleService { @Autowired private ExampleProcedureMapper exampleProcedureMapper; public Integer exampleProcedure(String param1) { Integer result = null; exampleProcedureMapper.exampleProcedure(param1, result); return result; } } ``` 其中,ExampleService为业务逻辑层的类,ExampleProcedureMapper为MyBatis的Mapper接口,exampleProcedure方法用于调用存储过程并返回结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说重点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值