数据库第五天

一、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

(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';

你可能感兴趣的:(数据库第五天)