JDBC基础篇(MYSQL)——使用CallabeStatement调用存储过程
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接:
package day04_callable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import util.JdbcUtil;
/**
* CallabeStatement:存储过程的statement
*
1. 首先创建一个存储过程:查询所有的用户
DELIMITER $
CREATE PROCEDURE select_allStudent()
BEGIN
SELECT * FROM student;
END $
CALL select_allStudent();
2. 输入一个id,查询id对应的用户
DELIMITER $
CREATE PROCEDURE select_studentById(IN sid INT)
BEGIN
SELECT * FROM student WHERE id = sid; -- 注意
END $
CALL select_studentById(10);
3. 创建一个有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE get_studentName(IN sid INT,OUT sname VARCHAR(20))
BEGIN
SELECT NAME INTO sname FROM student WHERE id = sid;
END $
CALL get_studentName(10, @sname);
SELECT @sname;
-- 注意输出参数不在ResultSet结果集中,应该在输出参数中
继承关系:
Statement
-->PrapredStatement
---->CallableStatement
@author mzy
*/
public class Demo01 {
public static void main(String[] args) {
// testIn();
testOut();
}
private static void testOut() {
Connection conn = null;
CallableStatement cstmt = null;
ResultSet rs = null;
String sql = "call get_studentName(?, ?)"; //不管是输入还是输出,都可以用 ? 来代替这个参数
conn = JdbcUtil.getConnection();
try {
cstmt = conn.prepareCall(sql);
/**
* 设置输入参数
*/
cstmt.setInt(1, 10); // 来自preparedStatement:只有preparedStatement才有预编译的功能
/**
* 设置输出参数:
* 第一个参数同样是位置下标
* 第二个参数是存储过程中,那个输出参数的类型
*
* 此方法就是注册输出参数的类型:
* 因为是注册输出参数的是mysql中的操作,注册的输出参数也必须是mysql中的数据类型
*
* 通过 java.sql.Types.XXX:就可以获得其中的sql的类型
*/
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR); // 因为我们的out参数是varchar
// 发送参数:结果并不在resultSet中
// 这里并不需要rs结果集:因为我们是带返回参数的存储过程,并没有查询结果集
/*rs = */cstmt.executeQuery(); // 注意:存储过程只能执行Query方法,也只有query方法!!!
// 结果在输出参数中,我们应该在输出参数中查看结果
// 这里的参数位置和我们的输出参数的位置是保持一致的
// 通过getXXX方法;但是这里的getXXX方法,和resultSet中的getXXX方法不同
// 这里的getXXX方法是callableStatement提供的,专门针对存储过程的out参数的
// 而resultSet中的getXXX方法是获取列的值的
String sname = cstmt.getString(2);
System.out.println(sname);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, cstmt, conn);
}
}
private static void testIn() {
Connection conn = null;
CallableStatement cstmt = null;
ResultSet rs = null;
String sql = "call select_studentById(?)";
conn = JdbcUtil.getConnection();
try {
cstmt = conn.prepareCall(sql);
cstmt.setInt(1, 10);
rs = cstmt.executeQuery(); // 注意:存储过程只能执行Query方法,也只有query方法!!!
while(rs.next()) {
int id = (int)rs.getObject("id"); // rs.getInt("id");
String name = (String)rs.getObject("name"); // rs.getString("name");
int age = (int)rs.getObject("age"); // rs.getInt("age");
System.out.println(id+", "+name+", "+age);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(rs, cstmt, conn);
}
}
}
JDBC基础篇(MYSQL)——使用CallabeStatement调用存储过程的更多相关文章
- mysql jdbc性能优化之mybatis/callablestatement调用存储过程mysql jdbc产生不必要的元数据查询(已解决,cpu负载减少20%)
INFO | jvm 1 | 2016/08/25 15:17:01 | 16-08-25 15:17:01 DEBUG pool-1-thread-371dao.ITaskDao.callProce ...
- JDBC基础篇(MYSQL)——通过JDBC连接数据库的三种方式
package day01_jdbc; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManage ...
- JDBC基础篇(MYSQL)——自定义JDBCUtil工具类
package util; import java.io.File; import java.io.InputStream; import java.sql.Connection; import ja ...
- JDBC基础篇(MYSQL)——PreparedStatement执行DML、DQL等
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day03.prepare; import java.sql.Connection; import java.sql ...
- JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...
- JDBC基础篇(MYSQL)——使用statement执行DML语句(insert/update/delete)
注意:其中的JdbcUtil是我自定义的连接工具类:代码例子链接: package day02_statement; import java.sql.Connection; import java.s ...
- jdbc基础 (一) MySQL的简单使用
前段时间学习了jdbc,正好利用这几篇文章总结一下. JDBC 可做三件事:与数据库建立连接.发送操作数据库的语句并处理结果. 而程序首先要做的就是加载数据库驱动,这里我使用的是mysql: Stri ...
- [MySQL实战-Mysql基础篇]-mysql架构
1.基本组成 下面是mysql的基本架构示意图 图一 图二 我们可以从图上看出,mysql大体分为两个部分,一个是server层,另一个是引擎层. server层中包含了连接器.查询缓存.分析器.优 ...
- JavaSE基础篇—MySQL基础知识点
MySQL MySQL是一种关系数据库管理系统,是一种开源软件.可搭配PHP和Apache可以有更好的性能,也可以工作在众多的平台上.Orcale是一个数据库创建多个用户,MySQL是一个用户创建多个 ...
随机推荐
- ES6 模块export import
在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库, 和基于 CMD 规范的模块化库).ES6 引入了模块化,其设计思想是在编译时就能确定模 ...
- shell脚本(5)-shell变量
一.变量介绍 将一些数据需要临时存放在内存中,以待后续使用时快速读出. 二.变量分类 1.本地变量: 用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile..bashrc文件中 ...
- Spring 学习笔记(2) Spring Bean
一.IoC 容器 IoC 容器是 Spring 的核心,Spring 通过 IoC 容器来管理对象的实例化和初始化(这些对象就是 Spring Bean),以及对象从创建到销毁的整个生命周期.也就是管 ...
- [HNOI2008]GT考试 题解
这题比较难搞.考虑设计状态:\(f_{i,j}\) 表示当前考虑到 \(X_i\) 位,且 \(X\) 的后 \(j\) 位刚好与 \(A\) 列匹配时的方案数.最终答案为 \(\sum_{i=0}^ ...
- UnitTest 用法
功能 1.能组织多个用例去执行 2.提供丰富的断言方法 3.提供丰富的日志与测试结果 核心要素 1.TestCase 2.TestSuite 3.TextTestRunner 4.Fixture 用法 ...
- python 实现自动部署测试环境
预设条件 产品运行在Linux CentOS6 X64上 python3,Djanggo,Cherrypy安装好手动安装过程 登录服务器 检查是否有以前的版本的产品在运行,有,停掉 如果有原来的代码包 ...
- VB 6.0不能加载MSCOMCTL.OCX的解决方法
问题场景:打开 VB 6项目时报错,不能加载 'C:\WINDOWS\system32\MSCOMCTL.OCX'--继续加载工程吗? 解决方法: 1.新建一个VB工程,然后按CTRL + T,选中 ...
- WEB安全新玩法 [10] 防范竞争条件支付漏洞
服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞.攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商 ...
- Super-Mario-Host(超级玛丽)靶机
仅供个人娱乐 靶机百度云下载 链接:https://pan.baidu.com/s/13l1FUgJjXArfoTOfcmPsbA 提取码:a8ox 一.主机发现 arp-scan -l 二.漏洞扫 ...
- 01_安装电脑软件的步骤批处理脚本.bat
REM 01_安装电脑软件的步骤批处理脚本.bat MD 01_安装电脑软件的步骤 REM ZIP解压密码空格MD 02_制作杏雨梨云USB维护系统2019中秋版之国庆更新固态U盘MD 03_复制安装 ...