欢迎光临散文网 会员登陆 & 注册

Java二十六篇:数据库编程

2023-03-06 00:20 作者:小刘Java之路  | 我要投稿

视图

  • 概念

    将有关联的表创建成一张视图表,生成的视图表是一张虚拟表,只能完成数据的查询和修改,不能完成数据的删除和新增。

  • 优缺点:

    优点:可以将有关联的表,创建成视图,供下一次查询的时候,可以当成单表查询,提高程序员编写代码的速度。

    缺点:

    1、只能做查询和修改操作,不能做删除和新增操作

    2、视图并不是越多越好,因为视图一旦创建,要求原数据库表中的字段不能做任何的修改,如果做了修改,那么视图崩溃。

变量和控制语句

变量

  • 系统变量

定义:在数据库管理系统里面,在设计的时候,就已经规定好了的变量,一般用来控制整个数据库管理系        统, 比如mysql数据库管理系统。

系统变量的语法:@@变量名

查询系统变量:show variables;(查询所有的系统变量)

show variables like "%名称%"(查询部分系统变量)

  • 会话变量(用户变量/全局变量)

    程序员根据编程需要,在数据库的本次会话中创建一个变量,供下面代码使用。

    会话变量语法:@变量名

    添加一个会话变量:set @变量名 = 值;

    查询一个会话变量:select @变量名;

    每一次修改会话变量的值,必须加set关键字

  • 局部变量

    作用在部分代码片段中的变量,一般是在函数、存储过程、触发器中的变量,在begin和end代码之间存在,必须还要用declare定义声明

    定义局部变量:declare  变量名 数据类型   default 值;

控制语句

  • 分支语句

-- 第一种情况
IF 判断语句 THEN
当判断语句为真的时候,执行的代码
ENDIF;
-- 第二种情况
IF 判断语句1 THEN
当判断语句1位真的时候,执行的代码;
ELSEIF 判断语句2 THEN
当判断语句2位真的时候,执行代码;
ELSE
如果上面情况都不满足,执行的代码;
ENDIF;
-- 分支语句的嵌套
IF 判断语句 THEN
IF 判断语句 THEN
执行语句
ENDIF;
ENDIF;

  • 循环语句

WHILE 判断语句 DO
循环的代码;
ENDWHILE;

-- 数据库中跳出循环的方法:
leave:终止循环的代码,和java中的break作用一致。
iterate:结束本次循环,继续下一次循环,和java中的continue作用一致。

当有多层循环的时候,要跳出指定层次的循环,需要使用跳出循环的标记。
-- 举例:
WHILE 判断语句1 DO
log:WHILE 判断语句2DO
WHILE 判断语句3DO
循环的代码;
IF 判断语句 THEN
leave log;
ENDIF;
ENDWHILE;
ENDWHILE;
ENDWHILE;

函数

概念:将实现特定功能的代码片段进行封装,需要使用的时候,调用函数即可,提高代码的复用性,是封装的最小体现单元。

系统函数

-- 聚合函数
count();
max();
min();
avg();
sum();
-- 其他聚合函数
now();获取当前的瞬时时间戳
year();获取字段中的年份
UUID();生成一个36位不重复的字符串,后续数据库要使用UUID生成主键。
LAST_INSERT_ID();最后一次新增数据的主键值(必须是主键自增)。

新增函数

-- 语法:
CREATEfunction 函数名(参数列表) RETURNS 返回值数据类型
BEGIN
实现特定功能的函数代码片段
END

-- 举例:计算两个数和
-- 修改数据库结束标识符
delimiter &
createfunction add1() returnsint
begin
-- 定义一个局部变量,记录两个数的和
declare res intdefault0;
set res = 10 + 20;
return res;
end &

查询函数

-- 查询语法:查询所有的函数
showfunctionstatus;
-- 使用模糊查询到程序员自定义的函数
showfunctionstatuslike"%add1%";

调用函数

-- 语法
select 函数名();

删除函数

-- 语法
dropfunction 函数名;

案例:

-- 计算1-100之间的所有能被3和7同时整除的数之和
createfunction add4() returnsint
begin
-- 定义一个局部变量,来记录两个数的和
declare res intdefault0;
-- 定义一个局部变量,来记录循环判断
declare i intdefault1;
-- 循环的代码
while i <= 100 do
if i % 3 = 0and i % 7 = 0then
set res = res + i;
endif;
set i = i + 1;
endwhile;
-- 返回值
return res;
end
-- 定义一个函数,计算x的y次方。x和y的值由参数传入。
create function fun(x int,y int) returns double
begin
-- 定义一个变量,用于记录最终的结果
declare res double default 1.0;
declare i int default 0;
declare j int default 0;
-- 判断指数的大小(大于0?小于0?等于0)
if y > 0 then
while i < y do
set res = res * x;
set i = i + 1;
end while;
elseif y < 0 then

set y = y * (-1);
while j < y do
set res = res * x;
set j = j +1;
end while;
set res = 1 / res;
else
set res = 1.0;
end if;
return res;
end

存储过程

概念:和函数的概念一致,将实现特定功能的代码片段封装起来,放在一个存储过程中,需要使用的时候调用即可。关键字为:procedure

和函数的区别

1、函数存在返回值,存储过程没有返回值。

2、函数的参数,只有参数名和数据类型;存储过程参数,有参数名,数据类型,参数类型。

创建过程

-- 语法:
createprocedure 过程名称(参数列表)
begin
实现存储过程的代码片段;
end

-- 举例:
createprocedure pro1()
begin
-- 定义变量,记录两个数的和
declare res intdefault0;
-- 定义一个变量,用于判断
declare i intdefault1;
while i <= 100 do
set res = res + i;
set i = i + 1;
endwhile;
select res;
end

查询过程

-- 查询所有的存储过程
show procedure status;
-- 模糊查询存储过程
show procedure status like "%pro%";

调用过程

call 存储过程名称();

删除过程

drop procedure 存储过程名称;

参数列表

参数列表:参数类型 参数名 数据类型
重点:参数类型
in:将存储过程外面的变量可以传入到存储过程里面使用。外面的变量:会话变量。
out:可以把存储过程里面操作过的会话变量的值传到存储过程外面。
inout:既可以将存储过程外面的值传入到里面使用,也可以将里面修改过后的值,作用到存储过程外面。

案例:

-- 定义三个会话变量
set @num1 = 1;
set @num2 = 2;
set @num3 = 3;

-- 查询三个会话变量
select @num1,@num2,@num3;

-- 定义一个存储过程,三个形式参数,参数类型分别为in,out,inout
create procedure pro3(in a int,out b int,inout c int)
begin
-- 查询三个形式参数的值
select a,b,c;    -- 1,2,3
-- 查询三个会话变量
select @num1,@num2,@num3;    -- 1,2,3
-- 修改形式参数的值(局部变量)
set a = 10;
set b = 20;
set c = 30;
-- 查询一遍a,b,c的值
select a,b,c;     -- 10,20,30

-- 查询三个会话变量
select @num1,@num2,@num3;  -- 1,2,3
end

-- 调用存储过程
call pro3(@num1,@num2,@num3);

-- 再次查询会话变量
select @num1,@num2,@num3;

  • 如果参数类型为out类型,那么在实际参数传递给形式参数的时候,形式参数将抛弃实际参数的值,先将其置为null(形式参数)

  • 当整个存储过程执行结束之后,返回去检测每个形式参数的参数类型,如果是out或者inout,那么将形式参数修改过后的值,作用到实际参数上。

触发器

概念:封装一段代码片段(一般都是对数据的增、删、改的操作),当达到了触发器的条件的时候,自动调用并执行。不需要程序员主动用代码进行调用。

创建触发器

create trigger 触发器名称 触发时机 触发事件 on 表名 for each row
begin
封装的代码片段;
end

触发时机:after和before
触发事件:insert、update、delete

-- 创建触发器
CREATE TRIGGER tri1 AFTER INSERT ON t_order FOR EACH ROW
BEGIN
-- 修改商品表中的数据
UPDATE t_product SET p_number = p_number - new.o_number where p_id = new.p_id;
END

-- 说明:
new.o_number:刚刚新增数据中字段的数据
new.p_id:刚刚新增数据中字段的数据

查询触发器

-- 查询触发器
show triggers;

删除触发器

drop trigger 触发器名称

索引

概念:索引的作用就是增加数据库的查询效率,索引本质上就是将一个字段有顺序的生成为一个数据结构(树结构),在mysql中存在主键默认加索引。

优缺点

  • 优点:索引会增加查询效率

  • 缺点:会增加维护成本,主要维护成本是在新增数据、删除数据和修改数据的时候维护,所以会降低这三个操作的效率;索引的本质是数据结构,会占用一定的内存空间。

注意:索引只是一种技术,索引是存在引擎里面的,数据库管理系统可能是不一样引擎,因此数据库会因为引擎的不一样而对索引类型的支持不一样。

索引的类型

  • BTREE索引:B树索引(B+树),基本上大部分引擎都支持B数索引

  • Hash索引:只有在menory引擎才会支持该索引

  • Full-text索引:全文索引,一般在搜索功能里面会用到。

  • 唯一索引:主键用的就是唯一索引

  • 空间索引:

B树索引:多路平衡搜索树,不一定是二叉树,可以是M叉树。

举例说明一下B树的生成过程,以5叉树为例

25、19、23、21、18、27、16、13、29、28、26、31、24、17、33、15

我也知道的比较少,像这种数据结构的东西,所以我在学习Java方面的数据结构和算法,加油吧!

总结:

  • 1、一般数据库编程中,在企业中存储过程还有些老的企业还在使用

  • 2、索引是这里面的重中之重,学好索引你的查询效率会有所提升

    优缺点

    • 优点:索引会增加查询效率

    • 缺点:会增加维护成本,主要维护成本是在新增数据、删除数据和修改数据的时候维护,所以会降低这三个操作的效率;索引的本质是数据结构,会占用一定的内存空间。

  • 3、在不同的需求面前,都是先用最容易的方式实现功能等后期才优化代码、代码扩展和并发

  • 4、技术是为需求服务的


图片


Java二十六篇:数据库编程的评论 (共 条)

分享到微博请遵守国家法律