存储过程之七—java代码调用
一、简介
jdbc调用存储过程与调用一般的sql语句有些差别。jdbc调用一般的sql语句的时候,返回的是结果集,或是sql语句后是否执行成功的标记量。而存储过程返回的可以是结果集,输出参数、返回状态和受影响行数。而mysql存储过程不支持return,所以只有剩下的三种返回方式。
调用的过程一般如下:
1、创建连接 Connection conn = DriverManager.getConnection(url, user, password);
2、创建CallableStatement CallableStatement statement = conn.prepareCall(sql);
3、设置参数
statement.setInt(1, id);
statement.registerOutParameter(2, Types.VARCHAR);
statement.registerOutParameter(3, Types.INTEGER);
statement.registerOutParameter(4, Types.VARCHAR);
4、执行
statement.execute(); 或 statement.executeUpdate();
5、获取返回
int age = statement.getInt(3);或ResultSet resultSet = statement.executeQuery();
二、实例
以下存储过程表结构如下:
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of person
-- ----------------------------
INSERT INTO `person` VALUES ('', 'lisi', '', 'li123456');
INSERT INTO `person` VALUES ('', 'zhangsan', '', 'zhang123456');
1、增加记录(输入输出参数的调用)
存储过程如下:
DROP PROCEDURE IF EXISTS proc_person_insert;
CREATE PROCEDURE proc_person_insert(
IN uusername VARCHAR(255),
IN uage INT(11),
IN upassword VARCHAR(255),
OUT flag INT(11)
)
BEGIN
START TRANSACTION;
INSERT INTO person (username, age, password) values (uusername, uage, upassword);
SET flag = ROW_COUNT(); -- 保存sql语句操作后影响的行数
COMMIT;
END;
调用代码如下:
public static void insert(String username, int age, String upassword) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call proc_person_insert( ?, ?, ?, ? )}";
CallableStatement statement = conn.prepareCall(sql);
statement.setString(1, username); //设置输入参数username
statement.setInt(2, age); //设置输入参数age
statement.setString(3, upassword);//设置输入参数password
statement.registerOutParameter(4, Types.INTEGER);//设置输出参数username
statement.executeUpdate();
int flag = statement.getInt(4);//获取输出参数
System.out.println(flag);// 1添加成功,0添加失败
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
对于输出参数需要调用statement.registerOutParameter(4, Types.INTEGER)进行注册,执行之后通过statement.getInt()方法来获取。
2、修改记录(输入输出参数的调用)
存储过程如下:
DROP PROCEDURE IF EXISTS proc_person_update;
CREATE PROCEDURE proc_person_update(
IN uid INT(11),
IN uusername VARCHAR(255),
IN uage INT(11),
IN upassword VARCHAR(255),
OUT flag INT(11)
)
BEGIN
START TRANSACTION;
UPDATE person SET username = uusername, age = uage, password = upassword WHERE id = uid;
SET flag = ROW_COUNT(); -- 保存sql语句操作后影响的行数
COMMIT;
END;
调用代码如下:
public static void update(int id, String username, int age, String upassword) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call proc_person_update( ?, ?, ?, ?, ? )}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.setString(2, username);
statement.setInt(3, age);
statement.setString(4, upassword);
statement.registerOutParameter(5, Types.INTEGER);
statement.executeUpdate();
int flag = statement.getInt(5);
System.out.println(flag);// 1添加成功,0添加失败
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
3、删除记录(使用statement.getUpdateCount()获取影响行数)
存储过程如下:
DROP PROCEDURE IF EXISTS proc_person_del;
CREATE PROCEDURE proc_person_del(
IN pid INT(11)
)
BEGIN
DELETE FROM person WHERE id = pid;
END;
调用代码如下:
public static void delete(int id){
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call proc_person_del( ?)}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.executeUpdate();
int flag = statement.getUpdateCount();//使用该语句的时候存储过程DELETE语句外不能出现 START TRANSACTION;COMMINT;
System.out.println(flag);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
18 e.printStackTrace();
}
}
4、查询一条记录(输入输出)
存储过程如下:
DROP PROCEDURE IF EXISTS proc_person_find;
CREATE PROCEDURE proc_person_find(
IN pid INT(11),
OUT pusername VARCHAR(255),
OUT page INT(11),
OUT ppassword VARCHAR(255)
)
BEGIN
SELECT username, age, password INTO pusername, page, ppassword FROM person WHERE id = pid;
END;
使用在SELECT语句中使用INTO给输出参数赋值
调用代码如下:
public static void find(int id){
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call proc_person_find( ?, ?, ?, ?)}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.registerOutParameter(2, Types.VARCHAR);
statement.registerOutParameter(3, Types.INTEGER);
statement.registerOutParameter(4, Types.VARCHAR);
statement.execute();
String username = statement.getString(2);
int age = statement.getInt(3);
String ppassword = statement.getString(4);
System.out.println("id:" + id);
System.out.println("username:" + username);
System.out.println("age:" + age);
System.out.println("ppassword:" + ppassword);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
5、查询一个集合(返回一个集合)
存储过程如下:
DROP PROCEDURE IF EXISTS proc_person_findAll;
CREATE PROCEDURE proc_person_findAll( )
BEGIN
SELECT id, username, age, password FROM person;
END;
调用代码如下:
public static void findAll(){
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test";
String user = "root";
String password = "";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "{call proc_person_findAll()}";
CallableStatement statement = conn.prepareCall(sql);
ResultSet resultSet = statement.executeQuery();
while(resultSet.next()){
int id = resultSet.getInt("id");
String username =resultSet.getString("username");
int age = resultSet.getInt("age");
String ppassword = resultSet.getString("password");
System.out.println(id + " " + username + " " + age + " " + ppassword);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
通过statement.executeQuery()方法返回已经ResultSet,再对ResultSet进行遍历。
关于存储过程存在into参数的时候,java代码中在设置输入参数之后,还需要注册输出参数,调用之后通过statement.get..方法拿到输出参数的值。如下:
String sql = "{call proc_person_del( ? )}";
CallableStatement statement = conn.prepareCall(sql);
statement.setInt(1, id);
statement.registerOutParameter(1, Types.INTEGER);
// 注意此次注册out 的index 和上面的in 参数index 相同
statement.execute();
int flag = statement.getInt(1);
存储过程之七—java代码调用的更多相关文章
- Java代码调用Oracle的存储过程,存储函数和包
Java代码调用存储过程和存储函数要使用CallableStatement接口 查看API文档: 上代码: java代码调用如下的存储过程和函数: 查询某个员工的姓名 月薪 职位 create or ...
- java代码调用数据库存储过程
由于前边有写java代码调用数据库,感觉应该把java调用存储过程也写一下,所以笔者补充该篇! package testSpring; import java.sql.CallableStatemen ...
- Java代码调用服务器上的Shell脚本
Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...
- Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件
本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import ...
- Jmeter自定义编写Java代码调用socket通信
一.前言 最近需要测试一款手机游戏的性能,找不到啥录制脚本的工具,然后,另外想办法.性能测试实际上就是对服务器的承载能力的测试,和各种类型的手机客户端没有啥多大关系,手机再好,服务器负载不了,也不能够 ...
- 用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql
1:创建shell脚本 touch sqoop_options.sh chmod 777 sqoop_options.sh 编辑文件 特地将执行map的个数设置为变量 测试 可以java代码传参数 ...
- java代码调用oracle存储过程
一.简介 与调用mysql存储过程类型过程都是如下 1.创建连接 Connection conn = DriverManager.getConnection(url, user, password); ...
- Java代码调用存储过程和存储方法
准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: package com.test.d ...
- java代码调用使用cxf搭建的webService服务传递对象
前边成功创建好一个cxf的webServcie服务,并带了一个无参数的方法.现在进一步尝试了使用带参数的方法,分别测了用String为参数和用自定义的对象为参数. 其中,使用String为参数时和不带 ...
随机推荐
- mysql truncate带有被引用外键的表时报错解决方法
清空具有外键约束的表时报ERROR 1701(42000)的解决 mysql> truncate table t_users;ERROR 1701 (42000): Cannot trunc ...
- C#类的一些概念
一.概念 1.类的作用是来模拟现实对象的,一个现实对象可以从两个地方进行描述:特征和行为. 2.类不是你凭空想象的,它只是描述现实对象具体的特征和行为的. 3我们写类只需要写我们所需要的. 4.类是提 ...
- Linq查询操作之投影操作
投影操作,乍一看不知道在说啥.那么什么是投影操作呢?其实就是Select操作,名字起的怪怪的.和Linq查询表达式中的select操作是一样的.它能够选择数据源中的元素,并指定元素的表现形式.投影操作 ...
- AEAI BPM流程集成平台V3.0.2版本开源发布
本次开源发布的是AEAI BPMV3.0.2版流程平台,该版本是数通畅联首次正式对外发布的版本,产品现已开源并上传至开源社区http://www.oschina.net/p/aeai-bpm. 产品说 ...
- css中visiblity和display异同
visiblity 是设置元素的可见性,即可见 / 隐藏:隐藏后元素所占有位置保留: display 是设置元素按什么样的方式来显示,是按块显示,显示成一条线的形式,显示为“消失”等等,当displa ...
- 自定义tab在地图进行分页显示
@{ ViewBag.Title = "GIS地图"; Layout = null; } @model HFSoft.Plat.UIWeb.Models.MapShowDataVO ...
- 四、MyBatis主配置文件
//备注:该博客引自:http://limingnihao.iteye.com/blog/1060764 在定义sqlSessionFactory时需要指定MyBatis主配置文件: Xml代码 收藏 ...
- 一个SpringMVC简单Demo中出现的错误
最近在学springmvc 一个简答的Springmvc配置包括如下步骤: 1.在 web.xml 文件中配置 DispatcherServlet (该中央控制器相当于 MVC 模式中的 C),还可以 ...
- Windows程序控件升级==>>构建布局良好的Windows程序
01.菜单栏(MenuStrip) 01.看看这就是menuStrip的魅力: 02.除了一些常用的属性(name.text..)外还有: 03.有人会问:上图的快捷键: 方法: 方式一:1.设置菜单 ...
- ahjesus配置vsftpd和xinetd
vsftpd的简单配置参考此教程 传送门 教程内xinetd的配置失效, 用xinetd方式启动ftp方式如下 1.在/etc/xinetd.d/目录中创建一个文件vsftpd 内容如下: servi ...