mysql储存过程教学_MySQL存储过程之深入理解(一)

一、什么是存储过程

Stored Procedure 是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它 。

通俗点理解,就是数据库的一些自定义的函数,并且支持含参调用。通常用于:数据查询,数据初始化

二、优势

复用性高:比如涉及复杂的业务逻辑的数据需要修改,可以用写好的存储过程反复操作。

灵活性高:如果涉及业务逻辑修改,只需要修改存储过程,而无需修改程序(程序可以远程调用存储过程)

执行速度快:相比较远程程序调用,本地数据库服务查询等操作,效率高,速度快,不受带宽,网络条件的干扰

安全性高:运行的场景为数据库服务器,特定的操作由特定权限的人操作,物理安全,权限安全

Oracle中存储过程已经出现很久了,而且配合SQL Plus使用起来很友好。开源和轻量级的mysql直到5.0版本才支持,而且客户端支持也不友好,好在8.0之后配合Navicat已经有很好的体验了。

三、语法

CREATE

PROCEDURE过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]])

[特性 ...]

过程体

create procedure testa()

begin

select * from users;

select * from orders;

end;

上边展示了一个简单的存储过程。下边来看一个稍微复杂的

CREATE DEFINER=`root`@`localhost` PROCEDURE `TestProcedure`(IN C_in int,OUT C_out VARCHAR(12))

BEGIN

IF (C_in%2=0)

THEN

SET C_out='合数';

ELSE

SET C_out='素数';

END IF;

SELECT C_in AS'输入结果';

END

当然整个过程是借助Navicat编写的,有提示很友好

f2a1f91450961ffe7aee310fc797d6b8.png

2e159122f6a94a131fa6cfb7c5ae81ab.png

40d215996e563d6637c4dd4bda2704e7.png

编写完成之后,点击运行,会要求输入参数,就可以看到输出和结果啦

b113f3f2a0669023e4f81fdd6ed4773d.png

其中结果1是select出来的,结果2是输出参数

76ef7edac11447ed633c11bf296adae3.png

四、内部调用和外部调用

1.数据库调用

declare para

call testa(para );

2.外部调用(java远程调用)使用JDBC

Connection conn = getConnection(); //创建数据库连接

CallableStatement cs = conn.prepareCall("{call findAllBook()}");

ResultSet rs = cs.executeQuery(); //执行查询操作,并获取结果集

package com.scd.book;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

public class FindBook {

/**

* 获取数据库连接

* @return Connection对象

*/

public Connection getConnection()

{

Connection conn = null; //数据库连接

try

{

Class.forName("com.mysql.jdbc.Driver"); //加载数据库驱动,注册到驱动管理器

/*数据库链接地址*/

String url = "jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=UTF-8";

String username = "root";

String password = "123456";

/*创建Connection链接*/

conn = DriverManager.getConnection(url, username, password);

}

catch (ClassNotFoundException e){

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return conn; //返回数据库连接

}

/**

* 通过存储过程查询数据

* @return List

*/

public List findAll()

{

List list = new ArrayList(); //实例化List对象

Connection conn = getConnection(); //创建数据库连接

try

{

//调用存储过程

CallableStatement cs = conn.prepareCall("{call findAllBook()}");

ResultSet rs = cs.executeQuery(); //执行查询操作,并获取结果集

while(rs.next())

{

Book book = new Book(); //实例化Book对象

book.setName(rs.getString("name")); //对name属性赋值

book.setPrice(rs.getDouble("price")); //对price属性赋值

book.setBookCount(rs.getInt("bookCount")); //对bookCount属性赋值

book.setAuthor(rs.getString("author")); //对author属性赋值

list.add(book);

}

}catch(Exception e)

{

e.printStackTrace();

}

return list; //返回list

}

/**

* 主函数 调用存储过程(测试使用)

* @param args

*/

public static void main(String[] args)

{

FindBook fb = new FindBook();

//System.out.println(fb.findAll());

for (Book book : fb.findAll())

{

System.out.print(book.getName() + "--" + book.getPrice() + "--");

System.out.print(book.getBookCount() + "--" + book.getAuthor());

System.out.println();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值