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