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是一个用户创建多个 ...
随机推荐
- Window安装构建神器Jenkins
Jenkins是什么? Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.支持各种运行方式,可通过系统包.Docker 或者通过一个独立的 Java 程 ...
- C++ Primer Plus 第四章 复合类型 学习笔记
第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...
- Servlet 单例多线程详解(六)
一.Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
- 【Azure 应用服务】App Service 通过配置web.config来添加请求返回的响应头(Response Header)
问题描述 在Azure App Service上部署了站点,想要在网站的响应头中加一个字段(Cache-Control),并设置为固定值(Cache-Control:no-store) 效果类似于本地 ...
- videojs踩过的坑
1.videojs-contrib-hls 在webpack中不能用,解决方法:window.videojs = videojs:出处 https://github.com/videojs/video ...
- Thinkphp 生成的验证码不显示问题解决
在调用验证码之前加上 ob_clean(); 将: public function verify(){ $verify = new \Think\Verify(); ...
- Android内存溢出、内存泄漏常见案例及最佳实践总结
内存溢出是Android开发中一个老大难的问题,相关的知识点比较繁杂,绝大部分的开发者都零零星星知道一些,但难以全面.本篇文档会尽量从广度和深度两个方面进行整理,帮助大家梳理这方面的知识点(基于Jav ...
- AHKManager.ahk AHK管理器 2019年12月15日
AHKManager.ahk AHK管理器 2019年12月15日 快捷键 {Alt} + {F1} ///////////////////////////////////////////// ...
- RHCSA_DAY02
Linux:一切皆文件 分区:/boot:做引导盘 /swap:虚拟内存----最大20gb /data:自己放文件用 /:根分区 - 图形界面: - Ctrl+Shift +号 //调整命令 ...
- 史上最详细的Android消息机制源码解析
本人只是Android菜鸡一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 606页Android最新面试题含答案,有兴趣可以点击获取. ...