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是一个用户创建多个 ...
随机推荐
- MySQL用B+树(而不是B树)做索引的原因
众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构, ...
- if函数+isna函数+vlookup函数实现不同列相同单元格内容排列在同一行
1,首先学习的网址:https://jingyan.baidu.com/album/22a299b5dd0f959e19376a22.html?picindex=1 2,excel 这也许是史上最好最 ...
- pagehelper插件使用时查询不到数据
刚用mybatis 的分页插件时,老项目中分页封装的分页类起始为( pageno-1)* pagesize 于是直直接在pagehelper.start(start,pagesize)来进行分页.结 ...
- Leetcode春季活动打卡第三天:面试题 10.01. 合并排序的数组
Leetcode春季活动打卡第三天:面试题 10.01. 合并排序的数组 Leetcode春季活动打卡第三天:面试题 10.01. 合并排序的数组 思路 这道题,两个数组原本就有序.于是我们采用双指针 ...
- jsp-->js-->jsp之间的关系
jsp和js通过form.submit();发送request请求createdIdSave.jsp 在CreatedIdSave.jsp中进行BL的增删改查操作,在jsp中将值保存到页面的scrip ...
- noip模拟29[简单的板子题](虽然我不会)
\(noip模拟29\;solutions\) 这次考试给我最大的伤害,让我意识到了差距 这场考试可以说是非常的简单,就是简单到,看两眼,打个表就有结果了 但是呢?我考得非常的完蛋,只有30pts 据 ...
- Linux下的Vim文本编辑器(入门)
引言 vim filename:打开名为filename的文件,如果不存在就会创建一个filename文件 Vim的三种使用模式 1. 命令模式 启动Vim时,就进入了命令模式 在该模式下: i:切换 ...
- Spring Cloud 专题之六:bus
书接上回: SpringCloud专题之一:Eureka Spring Cloud专题之二:OpenFeign Spring Cloud专题之三:Hystrix Spring Cloud 专题之四:Z ...
- ElasticSearch进阶检索
ElasticSearch进阶检索 入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索 一.SearchAPI ES 支持两种基本方式检索 : 1.一种是通过使用 R ...
- SSM集成FastJson
FastJson Json数据格式回顾 什么是json JSON:(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript( ...