Java复习之知识点整理(二十七)---MySQL大对象储存数据类型,存储过程procedure,游标,存储过程实现百万记录插入,function函数

37 篇文章 3 订阅

一、MySQL大对象储存数据类型
----------------------------------------------------------
     LongBlob : 大字节对象存储形式。
     Text :  大文本文件储存形式
     
     
 二、操作大对象longblob,text
 ---------------------------------------------------------
     1.表中增加两个字段,一个pic是图片类型,一个info是大文本类型
     alter table mytable add column pic longblob;
     alter table mytable add column info text;
     
     2.数据库中插入图片
     pt.setBinaryStream(2, is, file.length());
     
     3.读取数据库中的图片字节数组
     pt =  conn.prepareStatement("select pic from mytable");
    ResultSet set =  pt.executeQuery();
     byte [] bs = set.getBytes(1);

 

  /**
     * 测试保存大对象到数据库
     */
    public static void tsSavePic()
    {
        int max = 9000;
        Ts02.loadDriversClass();
        Connection conn =  Ts02.getConn();
        PreparedStatement pt = null;
            
        try {    
            
            conn.setAutoCommit(false);
                    
            //开始插入数据
            long time1 = System.currentTimeMillis();
            pt =  conn.prepareStatement("insert into mytable (name,pic,info) values(?,?,?)");
    
            pt.setString(1, "tom");
            
            //获取图片的输入流
            File file = new File("D:\\1.png");
            FileInputStream is = new FileInputStream(file);
    
            pt.setBinaryStream(2, is, file.length());
            
            pt.setString(3, "xxxxxxxxxxxxxxx");
                
            //开始更新                                                    
            pt.executeUpdate();
            conn.commit();
            
            
            System.out.println("耗时:" + (System.currentTimeMillis() - time1));
            
            //处理关闭
            pt.close();
            conn.close();
            System.out.println("update over");
            
        } catch (Exception e) {            
            e.printStackTrace();
        }
        
    }


    /**
     * 测试查询大对象
     */
    public static void tsSelectPic()
    {
        int max = 9000;
        Ts02.loadDriversClass();
        Connection conn =  Ts02.getConn();
        PreparedStatement pt = null;
            
        try {    
            
            conn.setAutoCommit(false);
                    
            //开始插入数据            
            pt =  conn.prepareStatement("select pic from mytable");
            ResultSet set =  pt.executeQuery();
            
            while(set.next())
            {
                byte [] bs = set.getBytes(1);
                File file = new File("D:\\1.1.png");
                FileOutputStream fos = new FileOutputStream(file);
                
                fos.write(bs);
                
                fos.flush();
                
                fos.close();
            }
    
            conn.commit();

            //处理关闭
            pt.close();
            conn.close();
            System.out.println("select over");
            
        } catch (Exception e) {            
            e.printStackTrace();
        }
    }
    

 

三、存储过程procedure(大数据量统计计算的时候,非常具有优势)
 ----------------------------------------------------------
     1.在数据库中预先存放的一种sql程序
     2.创建存储过程 实现两个数相加
     3.定义 分隔符:delimiter 重新定义分割符,结束符,为了和函数语句的;区分开来
     4.调用存储过程语句: Call func_name;
     6.in 表示输入;   out 表示输出  ;   := 表示赋值;   begin 表示 函数创建开始  end 表示函数创建结束
     7.创建存储过程:
         delimiter //
          create procedure fun_name(in a int , in b int  , out c int);
         begin
             set c:= a+b;
         end
         //
     8.使用存储过程(@c表示 变量c)
          call up_add(1,2,@c) //
          select @c  //
                   
    9.查看所有的存储过程
        show procedure status;  
        
    10.删除存储过程
        drop procedure myprocedure;

          


 四、java中调用存储过程procedure
 ------------------------------------------------------------
     1.Connection conn;
     2.CallableStatement cst = conn.prepareCall("{call func_name(?,?,?)}");
     3.cst.setInt(1,1);    cst.setInt(2,3);
     4.cst.registerOutParameter(3,Types.Integer);
     5.cst.execute();
     6.int c = cst.getInt(3);

 

 /**
     * 测试存储语句
     */
    public static void tsUpAdd()
    {
        //加载驱动
        Ts02.loadDriversClass();
        //建立连接
        Connection conn =  Ts02.getConn();
        //创建服务器语句
        try {    
            //创建查询串
            CallableStatement call =  conn.prepareCall("{call up_add(?,?,?)}");
            //注册参数
            call.setInt(1, 1);
            call.setInt(2, 1);
            call.registerOutParameter(3, Types.INTEGER);
            //开始执行
            call.execute();
            //获取结果
            int c = call.getInt(3);
            System.out.println("c= " + c);
            //处理关闭
            call.close();
            conn.close();
        
            
        } catch (Exception e) {            
            e.printStackTrace();
        }
    }

     
     
 五、mysql的赋值语句
 ------------------------------------------------------------
     1. set x : a + b;
     2. select count(*) into x from mytable;
          
 
 六、MySql中的游标
 -------------------------------------------------------------
     create procedure curdemo()                                //创建存储过程
     begin 
         declare bl_name int default 0;                        //定义int 类型变量 bl_name,并赋初值 0;
         declare a char(20);                                    //定义char (20) 类型变量a
         declare b,c int;
         declare cur1 cursor for select id,name from mydata.mytable;    //给表mytable定义游标cur1,对应表中的id和name字段
         declare continue handler for sqlstate '02000' set bl_name = 1;   //定义一个逻辑,当fetch游标到了数据库表格最后一行的时候,设置done=1.
         
         open cur1;                                            //打开游标(从mytable的头部开始浏览)
         
         repeat                                                //开始循环
             fetch cur1 into a,b;                            //将游标中的存储的id 和 name 赋值变量给 a,b
             if not done then                                //if语句,如果没有达到表格末尾,这里可以自定义判断条件
                 Insert into mytable1  values (a,b);            //要执行的sql语句。
             end if;                                            //结束if
         until bl_name end reprat;                            //结束循环
         
         close cur1;                                            //关闭游标
     end                                                        //结束存储过程
     
     
 
 七、通过存储过程实现百万记录插入
 -------------------------------------------------------------
     1.创建存储过程
         create procedure big_insert(in num int)                  //创建存储过程
         begin                                
             declare i int default 0;                            //定义变量 i = 0;
             start transaction;                                    //开启事务
             while i < num do                                    //循环条件
                 insert into mytable (name,password,age) values(concat('tom',i), concat('' + i) ,i % 30); //插入数据
                 set i := i + 1;                                    //i自增
             end while;                                            //结束循环
             commit;                                                //提交事务                    
         end    
             
         
     2.java 中执行存储过程

 /**
     * 测试使用存储过程。进行100万条语句插入
     */
    public static void tsBigInsert()
    {
        try {
            
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");            
            //2.建立数据库连接
            String url = "jdbc:mysql://localhost:3306/mydata";
            String user = "mysql";
            String password = "mysql";            
            Connection conn = DriverManager.getConnection(url, user, password);
            //3.执行存储过程                
            CallableStatement call =  conn.prepareCall("{call big_insert2(?)}");
            //4.传参
            call.setInt(1, 100000);
            //5.执行
            call.execute();
            //6.关闭
            call.close();
            conn.close();
                    
        } catch (Exception e) {
            // TODO: handle exception
        }
        
    }        
    


        
八、MySql的函数
------------------------------------------------------------------
    1.创建函数
        create function uf_add(a int , b int) returns int
            return a + b ;

//测试使用函数
    public static void tsUseFunc()
    {
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");            
            //2.建立数据库连接
            String url = "jdbc:mysql://localhost:3306/mydata";
            String user = "mysql";
            String password = "mysql";            
            Connection conn = DriverManager.getConnection(url, user, password);
            CallableStatement call =  conn.prepareCall("{? = call myfunc(?,?)}");
            call.setInt(2, 1);
            call.setInt(3, 1);
            call.registerOutParameter(1, Types.INTEGER);
            call.execute();
            System.out.println(call.getInt(1));
            
            call.close();
            conn.close();
            
            
        } catch (Exception e) {
            // TODO: handle exception
        }
        
    }

 

 

 


    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值