美文网首页
数据库第五天

数据库第五天

作者: 浅水姑娘柠檬泪_d411 | 来源:发表于2017-04-23 12:10 被阅读0次

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

    相关文章

      网友评论

          本文标题:数据库第五天

          本文链接:https://www.haomeiwen.com/subject/aiaezttx.html