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是一个用户创建多个 ...
随机推荐
- ZooKeeper 分布式锁 Curator 源码 04:分布式信号量和互斥锁
前言 分布式信号量,之前在 Redisson 中也介绍过,Redisson 的信号量是将计数维护在 Redis 中的,那现在来看一下 Curator 是如何基于 ZooKeeper 实现信号量的. 使 ...
- windows下搭建vue开发环境实践
Vue.js是一套构建用户界面的 "渐进式框架".与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已 ...
- sqldbx配置连接Oracle 12C数据库
本地开发环境: Windows10 64位.Oracle 12C客户端 32位.sqlDBX (32位) =============================================== ...
- 解决:CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source.
log4j给出的异常信息有下面几句: Caused by: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC C ...
- memcache(11211)未授权访问
1.安装Memcache服务端 sudo apt-get install memcached 2.启动服务 sudo memcached -d -m 128 -p 11211 -u root 3.ap ...
- SaltStack 任意文件读写漏洞(CVE-2020-11652)
漏洞影响 SaltStack < 2019.2.4 SaltStack < 3000.2 同CVE-2020-11651 poc git clone https://github.com/ ...
- 当鼠标移入div上时,div的背景色在4s之内渐变为灰色,同时在5s之内顺时针旋转45度,且尺寸缩小一半;当鼠标移走时,再渐变恢复初始样式
<style> #d1{ width:200px; height:200px; border:1px solid #000; transition:background 4s linear ...
- 电脑桌面与群晖NAS双向实时同步-20210105
电脑桌面与群晖NAS双向实时同步 2021年1月15日星期五 一.购买群晖DS920+网络存储服务器.NEC超轻笔记本电脑(重量小于800克).小米10至尊版安卓智能手机和intel i9 1 ...
- 网络安全日记 ① IIS 之web服务器搭建以及dns转发配置
IIS(internet info server)服务器的搭建 创建iis服务 打开光驱 选择网络应用服务 安装iis和ftp(后面有讲) 配置服务 通过管理工具打开iis 2. 此时80端口就已经开 ...
- noip模拟22[d·e·f]
noip模拟22 solutions 哈哈哈,这次暴力打满直接190,其实不到哈哈哈,187.. 这次的题暴力极其好打,但是正解确实不简单... 打了好久才改完这个题,改完的时候爽暴了 这些一个字母的 ...