数据库第五天

一、JDBC中事务处理的步骤:

1、要取消掉JDBC的自动提交:void setAutoCommit(boolean autoCommit)  //false

2、执行各个SQL语句,加入到批处理之中

3、如果所有语句执行成功,则提交事务 commit();如果出现了错误,则回滚:rollback()

查询可以不用事务,其他都需要事务,jdbc默认自动提交事务,如果需要同时执行多条语句则要加事务

try{

con.setAutoCommit(false);//取消jdbc事务的默认提交方式

String sql01="update dept set dname='软件事业部' where did=2";

pre=con.prepareStatement(sql01);

pre.executeUpdate();

String sql02="update dept set dname='共产主义事业部' where did=29";

pre=con.prepareStatement(sql02);

pre.executeUpdate();

String sql03="delete  dept where did=29";

pre=con.prepareStatement(sql03);

pre.executeUpdate();

con.commit();//提交jdbc事务

con.close();

二、创建索引

是用来快速地寻找那些具有特定值的记录。主要是为了检索的方便,是为了加快访问速度, 按一定的规则创建的,一般起到排序作用。

1、创建索引

mysql> create index q1 on springshow(id);

2、查询索引

mysql> show index from springshow;

3、删除索引

mysql> drop index q1 on springshow;

三、视图

1、定义:视图是由查询结果形成的一张虚拟表.

2、视图的创建语法:

      Create view 视图名 as  select 语句;

3、视图的删除语法:

      Drop view;

4、 为什么要视图?

答:(1):可以简化查询

(2) 可以进行权限控制

把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据

(3) 大数据分表时可以用到

比如,表的行数超过200万行时,就会变慢,

以把一张的表的数据拆成4张表来存放.

四、触发器

1、after insert触发器

mysql> delimiter $  //以  $开头

mysql> create trigger tg1  //创建触发器

-> after insert on orders //在orders表插入后

-> for each row  //影响每一行

-> begin //开始

-> update  goods set stock=stock-new.num where id=new.gid; //执行修改操作

-> end$  //以  $结束

新插入的行用new来表示,行中的每一列的值用new.列名来表示

2、before insert触发器

mysql> delimiter$

mysql> create trigger tg2

-> before insert on orders

-> for each row

-> begin

-> if new.num>18 then

-> set new.num=18;

-> end if;

-> update goods set stock=stock-new.num where id=new.gid;

-> end$

新插入的行用new来表示,行中的每一列的值用new.列名来表示

3、after delete触发器

mysql> delimiter$

mysql> create trigger tg4

-> after delete on orders

-> for each row

-> begin

-> update goods set stock=stock+old.num where id=old.gid;

-> end$

4、after update触发器

mysql> delimiter$

mysql> create trigger tg3

-> after update on orders

-> for each row

-> begin

-> update goods set stock=stock+old.num-new.num where id=new.gid;

-> end$

注:old.列名---》原来列的值

new.列名---》现在列的值

5、before 和after的区别

after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;

before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;

6、drop trigger删除触发器

  mysql> drop trigger tg2;

五、存储过程

1、基本查询

(1)1创建存储过程(无参)

mysql> delimiter$

mysql> create procedure p1()

-> begin

-> select * from find;

-> end$

(2)查询存储过程

mysql> show procedure status;

(3)执行存储过程

mysql> call p1();

2、有参

(1)创建存储过程

delimiter $

create procedure p2(n int)

begin

select * from orders where id>n;

end$

(2)查询存储过程

mysql> show procedure status;

(3)执行存储过程

mysql> call p2(8);

3、有if控制语句

(1)创建存储过程

delimiter $ 

 create procedure p3(n int,j varchar(10)) 

 beginif 

j="电脑" then

select * from orders where id>n and gid in(select id from goods where tradename=j);

else

select * from orders where id<n and gid in(select id from goods where tradename=j);

(2)查询存储过程

show procedure status;

(3)执行存储过程

call p3(8,"电脑");

4、while控制语句

(1)创建存储过程

delimiter$

create procedure p4(n int,name varchar(10))

begin

declare i int;

set i=1;

while i<=n do

insert into user values(null,concat(name,i));

set i=i+1;

end while;

end$

(2)查询存储过程

mysql> show procedure status;

(3)执行存储过程

mysql> call p4(8,"电脑");

5、jdbc调用存储过程

//调用存储过程只需18毫秒,不用十万条记录机器内存不够

public void add2(int n,String name) throws SQLException{//查询用存储过程

mysqlConnection();

long a=System.currentTimeMillis();//开始时间

cs=con.prepareCall("{call p5(?,?)}");//jdbc调用存储过程

cs.setInt(1,n);

cs.setString(2,name);

cs.executeUpdate();

long b=System.currentTimeMillis();//结束时间

System.out.println("插入用存储过程用时:"+(b-a));

}

public void add1(int n,String name) throws SQLException{//插入不用存储过程

mysqlConnection();

int i=0;

long a=System.currentTimeMillis();//开始时间

while(i<=n){

String sql="insert into user values(null,?)";

pre=con.prepareStatement(sql);

pre.setString(1,name+i);

pre.executeUpdate();

i++;

}

long b=System.currentTimeMillis();//结束时间

System.out.println("插入不用存储过程用时:"+(b-a));

}

六、mysql权限设置

1、授权用户

(1)授权用户 mike有查加改所有库、所有表

mysql> grant select,insert,update on *.* to mike@localhost identified by '123';

(2)授权用户 john对test库中person表有查加改删除

mysql> grant select,insert,update,delete on test.person to john@localhost identified by '123';

(3)授权用户 qq对test库中person表只有查询和删除权限

mysql> grant select,delete on test.person to qq@localhost identified by '123';

2、取消授权用户

revoke all privileges on*.* from qq@localhost;

3删除用户

mysql> delete from user where user='qq' and host='localhost';

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容