jdbc java数据库连接 5)CallableStatement 接口
CallableStatement执行存储过程(也是预编译语言)
首先在sql中执行以下带有输入参数的代码:
DELIMITER $
CREATE PROCEDURE pro_findById(IN sid INT)
BEGIN
SELECT * FROM person WHERE id = sid;
END $
那么,这条语句的存储过程代码就是
CALL pro_findById (?);
使用CallableStatement来执行:
/**
带有输入参数的存储语言
sql中先运行
DELIMITER $
CREATE PROCEDURE pro_findById(IN sid INT)
BEGIN
SELECT * FROM person WHERE id = sid;
END $
*/
private static void testIn() { Connection conn = null;
CallableStatement stsm = null;
ResultSet rs = null;
try{
//1:创建连接
conn = Jdbcutil.getConnection(); //2:准备sql语言(带有存储过程的预编译语言)
String sql = "CALL pro_findById(?);"; //3:执行预编译语言
stsm = conn.prepareCall(sql); //4:设置参数
stsm.setInt(1, 4); //5:发送参数,执行sql(注意:CallableStatement执行sql只有executeQuery()方法)
//返回ResultSet对象
rs = stsm.executeQuery(); //6:遍历,打印出结果
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String sex = rs.getString("sex");
System.out.println(id+","+name+","+sex);
}
}
catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
//7:关闭连接
finally{
Jdbcutil.close(conn, stsm, rs);
} }
在sql中执行带有输入参数和输出参数的代码:
DELIMITER $
CREATE PROCEDURE pro_findout(IN sid INT ,OUT sname VARCHAR(20))
BEGIN
SELECT NAME INTO sname FROM person WHERE id = sid;
END $
这段代码的存储过程代码是:
CALL pro_findout(4,@NAME);
//预编译语言就是
//CALL pro_findout(?,?);
使用CallableStatement来执行:
/**
带有输入,输出参数的存储语言
DELIMITER $
CREATE PROCEDURE pro_findout(IN sid INT ,OUT sname VARCHAR(20))
BEGIN
SELECT NAME INTO sname FROM person WHERE id = sid;
END $
*/
private static void InAndOut() { Connection conn = null;
CallableStatement stsm = null; try{ //1:创建连接
conn = Jdbcutil.getConnection(); //2:创建sql存储语言(预编译)
String sql = "CALL pro_findout(?,?)"; //3:执行sql预编译语言
stsm = conn.prepareCall(sql); //4:设置参数
/**
* 第一个参数是输入参数
* 第二个参数是存储过程中的输出参数的jdbc类型(这里是varchar())
* 在sql.Types中寻找对应的类型
*/
//4.1:第一个参数的设置
stsm.setInt(1, 4);
//4.2:第二个参数的设置
stsm.registerOutParameter(2,java.sql.Types.VARCHAR); //5:发送参数,执行sql:这个返回的不是ResultSet对象
stsm.executeQuery(); /**
* 6:得到输出参数的值
* 根据索引值,也就是预编译sql语言中输出参数的位置
*/
String result = stsm.getString(2);
System.out.println(result);
}
catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
//7:关闭连接
finally{
Jdbcutil.close(conn, stsm);
} }
jdbc java数据库连接 5)CallableStatement 接口的更多相关文章
- jdbc java数据库连接 2)jdbc接口核心的API
JDBC接口核心的API java.sql.* 和 javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...
- jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化
上一章的代码中,可以发现,jdbc执行DDL和DML有几个步骤都是一样的: 1)执行语句开始时,创建驱动注册对象.获取连接的数据库对象.创建Statement对象 // 创建驱动注册对象 Class. ...
- jdbc java数据库连接 3)Statement接口之执行DDL、DML、DQL
|- Statement接口: 用于执行静态的sql语句 |- int executeUpdate(String sql) : 执行静态的更新sql语句(DDL,DML) |- ResultSet ...
- jdbc java数据库连接 4)PreParedStatement接口 之 区别和例子
Statement 和 PreparedStatement 的区别: 1)语句不同 PreparedStatement需要预编译以及需要参数 2)由于PreparedStatement有缓存区,所以效 ...
- JDBC数据库编程:callableStatement接口
了解MySQL存储过程建立, 了解存储过程中参数传递的三种方式 了解callablestatement调用存储过程操作. 因为在现在开发中,使用存储过程的地方越来越少,所以,对于存储过程使用,只需要了 ...
- jdbc:java数据库连接
1.导jar包 四大参数: 1.加载驱动类:Class.forName("com.mysql.jdbc.Driver"); 2.url:jdbc:mysql://localhost ...
- jdbc java数据库连接 11)中大文本类型的处理
1. Jdbc中大文本类型的处理 Oracle中大文本数据类型, Clob 长文本类型 (MySQL中不支持,使用的是text) Blob 二进制类型 MySQL数据库, Text ...
- jdbc java数据库连接 8)防止sql注入
回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象; 写sql 5:执行sql ...
- jdbc java数据库连接 6)类路径读取——JdbcUtil的配置文件
之前的代码中,以下代码很多时候并不是固定的: private static String url = "jdbc:mysql://localhost:3306/day1029?useUnic ...
随机推荐
- 手动获取spring的ApplicationContext和bean对象
WEB项目: 方法1: 1 ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(S ...
- SSH整合(struts2.3.24+hibernate3.6.10+spring4.3.2+mysql5.5+myeclipse8.5+tomcat6+jdk1.6)
终于开始了ssh的整合,虽然现在比较推崇的是,ssm(springmvc+spring+mybatis)这种框架搭配确实比ssh有吸引力,因为一方面springmvc本身就是遵循spring标准,所以 ...
- php实现设计模式之 简单工厂模式
作为对象的创建模式,用工厂方法代替new操作. 简单工厂模式是属于创建型模式,又叫做静态工厂方法模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 工厂 ...
- 基于WCF MSMQ 的企业应用解决方案
最近研究了一下基于MSMQ的WCF应用,从书上.网上查了很多资料,但始终没能彻底理解WCF-MSMQ的工作原理,也没能得到一个合理的应用解决方案.索性还是自己做个实验,探索一下吧.经过反复试验,颇有收 ...
- javascript封装与多态的体现
封装是实现面向对象程序设计的第一步,封装就是将数据与函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型. 在传统的面向对象语言中有访问修饰符,如Private:只有类本身能 ...
- 使用gulp+browser-sync搭建前端项目自动化以及自动刷新
前段时间使用了gulp+browser-sync才发现这个东西真的很好用. 准备工作:(1).安装nodejs.gulp是基于nodejs使用的,所以先安装nodejs,https://nodejs. ...
- 12种不适宜使用的javascript语法
1. == (o゜▽゜)o☆[BINGO!] Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前 ...
- Android动画例子。
例子一: 补间动画效果,从右进,从左出. ImageSwitcher mImageSwitcher = new ImageSwitcher(this); mImageSwitcher.setFacto ...
- AFNetworking 3.0 断点续传 使用记录
最近项目中用到了压缩包下载,使用AFNetworking 3.0 下载压缩包 支持断点续传 代码如下: #import "HDInternet_handler.h" #import ...
- Android Touch事件分发机制学习
Android 事件分发机制 ViewGroup dispatchTouchEvent 返回true dispatchTouchEvent: Activity ACTION_DOWN Myrelat ...