java中的某一步出错了之前的内容不执行回滚_初级java知识点(13)

d9ddbc19f3a671820dde2d5c445eaa5a.png

第十三节 -视图、事物、索引、存储过程、触发器

东西比较多比较杂,笔记当时学的时候记得也是东一榔头,西一棒槌的

视图:

为什么要用视图?

语法:

create view  视图名字(列名1,列名2) as 一条select语句

1、可以简化查询

查询每个栏目下面商品的平均价格,并按照平均价格排序,查询平均价前三高的栏目。

SELECT cat_id,AVG(market_price) AS price
FROM goods
GROUP BY cat_id ORDER BY price DESC LIMIT 3;

96ced049c2bcb85ad7a36cd48bb5c9a8.png


视图情况:

CREATE VIEW v_top3_avg_by_cat AS
SELECT cat_id,AVG(market_price) AS price 
FROM goods
GROUP BY cat_id ORDER BY price DESC LIMIT 0,3;

查询操作返回结果集,这个查询结果就可以当成一张表来使用。

视图就是将这个查询返回的结果集起了一个名字保存起来,视图就是

临时存储数据构成的一张表。

不是一个真正的表,但是我们使用时候可以当成一张表来使用。

2、可以进行权限控制

把表的增删改查的权限封闭,但是只开放相应的视图权限,视图里面只是有我们想开放的数据。


-- 班级名称 学生人数

-- 通过查询视图实现,班级人数>1

588ec6d26a57158405c284d4a317a162.png

1、视图的数据来源于数据表,修改视图的时候也会修改数据表。

2、但是我们建议使用视图主要用于查询数据,不建议用视图去修改数据。


索引:书的目录

什么是索引:

索引是一个“内置表”,该表的数据是对某个真实表的某个(些)字段的数据做了“排序”之后的存储形式。

其作用是:极大提高表查找数据的速度!——其效率(速度)可以匹敌二分查找(非常著名的算法)。

注意:索引在提高查找速度的同时,降低增删改的速度。

对创建(设计)表来说,建立索引是非常简单的事,形式如下:

索引类型 (字段名1,字段名2, .... ) //可以使用多个字段建立索引,但通常是一个

有以下几种索引:

1、普通索引:key(字段名1,字段名2, .... ):它只具有索引的基本功能——提速(其他索引不但有提速还有额外功能)

2、唯一索引:unique key (字段名1,字段名2, .... )

3、主键索引:primary key (字段名1,字段名2, .... )


事务:

事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部执行成功,要么全部实行失败。

例如:张三--李四转账


数据库开启事务的命令:

Connection接口下面的方法:

void setAutoCommit(boolean autoCommit);autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式(默认情况下就是true)

void commit();手动提交事物。

void rollback();回滚(出现异常的时候,所有已经执行成功的代码需要回退到事务开始前的状态)


默认情况下,Connetion对象处于自动提交模式下,这意味着他在执行每个语句后都会自动提交更改。

如果禁用自动提交模式,那么提交更改就必须显示调用commit方法,否则就无法保存数据库的更改。

结束事务:COMMIT 或 ROLLBACK

COMMIT 表示提交,即事务中的多条 SQL 语句所更改的数据会持久化到数据库中。或者 ROLLBACK 表示回滚,即回滚到事务的起点,将之前所做的所有操作撤销。

ROLLBACK 可以结束事务,但不代表会将数据持久化到数据库中,而只有 COMMIT提交才可以将数据持久化到数据库中。

为什么JDBC事务里面要使用 rollback() ?​segmentfault.com
3bc4d2788d6973ea71b229902ac5aeeb.png

书写结构:

private Connection conn = null;
private PreparedStatement ps = null;
try {
    conn.setAutoCommit(false); //将自动提交设置为false
    ps.executeUpdate("修改SQL"); //执行修改操作
    ps.executeQuery("查询SQL"); //执行查询操作
    conn.commit(); //当两个操作成功后手动提交
} catch (Exception e) {
    conn.rollback(); //一旦其中一个操作出错都将回滚,使两个操作都不成功
    e.printStackTrace();
}

c08673a3669accb5f1715b497bb37488.png

存储过程:

包含一系列sql语句的集合,完成一个复杂的功能,存储过程可以被反复使用,执行效率高。

存储过程功能上类似于Java里面封装的函数。


DELIMITER:定界符

MYSQL的默认结束符为";",其实就是告诉mysql解释器,该段命令是否已经结束了,mysql可以执行了。

在命令行客户端中,如果有一行命令以分号结束,如输入下面的语句:

mysql> select * from test_table;

回车后,mysql将会执行该命令。

但有时候,不希望MySQL这么做,可能输入较多的sql语句,且语句中包含有分号,那么我们就可以重新定义定界符。

-- 存储过程  类似于java中函数
delimiter $$ -- 将原来";"这个定界符替换为"$$"
CREATE PROCEDURE show_student()
BEGIN
    UPDATE goods SET goods_number=goods_number+1;
   SELECT * FROM goods;
END $$
delimiter ; -- 存储过程定义完了之后恢复原来的定界符";"
 
CALL show_student; -- 调用存储过程

826f953b6ad21230b6c5c9e132b069c3.png

触发器(Trigger):

是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件触发。

触发器经常用于加强数据的完整性约束和业务规则等。

在MySQL中,触发器可以在你执行INSERT、UPDATE或DELETE的时候,执行一些特定的操作。在创建触发器时,可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器,你可以实现一些业务逻辑或一些数据限制,在简化应用程序逻辑,优化系统性能时非常有用。

实现一个触发器:在student表里面插入一条记录的时候在student_total表里面的total字段加1

c11f5e6c087db2ee0e803fafd2add8d0.png

文末 over~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值