存储过程之七—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 (‘1‘, ‘lisi‘, ‘21‘, ‘li123456‘);
INSERT INTO `person` VALUES (‘2‘, ‘zhangsan‘, ‘23‘, ‘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;

    调用代码如下:

 1     public static void insert(String username, int age, String upassword) {
 2         String driver = "com.mysql.jdbc.Driver";
 3         String url = "jdbc:mysql://127.0.0.1:3306/test";
 4         String user = "root";
 5         String password = "";
 6         try {
 7             Class.forName(driver);
 8             Connection conn = DriverManager.getConnection(url, user, password);
 9             String sql = "{call proc_person_insert( ?, ?, ?, ? )}";
10             CallableStatement statement = conn.prepareCall(sql);
11             statement.setString(1, username); //设置输入参数username
12             statement.setInt(2, age); //设置输入参数age
13             statement.setString(3, upassword);//设置输入参数password
14             statement.registerOutParameter(4, Types.INTEGER);//设置输出参数username
15             statement.executeUpdate();
16             int flag = statement.getInt(4);//获取输出参数
17             System.out.println(flag);// 1添加成功,0添加失败
18         } catch (ClassNotFoundException e) {
19             e.printStackTrace();
20         } catch (SQLException e) {
21             e.printStackTrace();
22         }
23     }

    对于输出参数需要调用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;

    调用代码如下:

 1 public static void update(int id, String username, int age, String upassword) {
 2         String driver = "com.mysql.jdbc.Driver";
 3         String url = "jdbc:mysql://127.0.0.1:3306/test";
 4         String user = "root";
 5         String password = "";
 6         try {
 7             Class.forName(driver);
 8             Connection conn = DriverManager.getConnection(url, user, password);
 9             String sql = "{call proc_person_update( ?, ?, ?, ?, ? )}";
10             CallableStatement statement = conn.prepareCall(sql);
11             statement.setInt(1, id);
12             statement.setString(2, username);
13             statement.setInt(3, age);
14             statement.setString(4, upassword);
15             statement.registerOutParameter(5, Types.INTEGER);
16             statement.executeUpdate();
17             int flag = statement.getInt(5);
18             System.out.println(flag);// 1添加成功,0添加失败
19         } catch (ClassNotFoundException e) {
20             e.printStackTrace();
21         } catch (SQLException e) {
22             e.printStackTrace();
23         }
24     }

  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;

    调用代码如下:

 1 public  static void delete(int id){
 2         String driver = "com.mysql.jdbc.Driver";
 3         String url = "jdbc:mysql://127.0.0.1:3306/test";
 4         String user = "root";
 5         String password = "";
 6         try {
 7             Class.forName(driver);
 8             Connection conn = DriverManager.getConnection(url, user, password);
 9             String sql = "{call proc_person_del( ?)}";
10             CallableStatement statement = conn.prepareCall(sql);
11             statement.setInt(1, id);
12             statement.executeUpdate();
13             int flag = statement.getUpdateCount();//使用该语句的时候存储过程DELETE语句外不能出现 START TRANSACTION;COMMINT;
14             System.out.println(flag);
15         } catch (ClassNotFoundException e) {
16             e.printStackTrace();
17         } catch (SQLException e) {
18             e.printStackTrace();
19         }
20     }

   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给输出参数赋值

    调用代码如下:

 1     public  static void find(int id){
 2         String driver = "com.mysql.jdbc.Driver";
 3         String url = "jdbc:mysql://127.0.0.1:3306/test";
 4         String user = "root";
 5         String password = "";
 6         try {
 7             Class.forName(driver);
 8             Connection conn = DriverManager.getConnection(url, user, password);
 9             String sql = "{call proc_person_find( ?, ?, ?, ?)}";
10             CallableStatement statement = conn.prepareCall(sql);
11             statement.setInt(1, id);
12             statement.registerOutParameter(2, Types.VARCHAR);
13             statement.registerOutParameter(3, Types.INTEGER);
14             statement.registerOutParameter(4, Types.VARCHAR);
15             statement.execute();
16             String username = statement.getString(2);
17             int age = statement.getInt(3);
18             String ppassword = statement.getString(4);
19             System.out.println("id:" + id);
20             System.out.println("username:" + username);
21             System.out.println("age:" + age);
22             System.out.println("ppassword:" + ppassword);
23         } catch (ClassNotFoundException e) {
24             e.printStackTrace();
25         } catch (SQLException e) {
26             e.printStackTrace();
27         }
28     }

  5、查询一个集合(返回一个集合)

    存储过程如下:

DROP PROCEDURE IF EXISTS proc_person_findAll;
CREATE PROCEDURE proc_person_findAll( )
BEGIN
    SELECT id, username, age, password  FROM person;
END;

    调用代码如下:

 1 public  static void findAll(){
 2         String driver = "com.mysql.jdbc.Driver";
 3         String url = "jdbc:mysql://127.0.0.1:3306/test";
 4         String user = "root";
 5         String password = "";
 6         try {
 7             Class.forName(driver);
 8             Connection conn = DriverManager.getConnection(url, user, password);
 9             String sql = "{call proc_person_findAll()}";
10             CallableStatement statement = conn.prepareCall(sql);
11             ResultSet resultSet = statement.executeQuery();
12             while(resultSet.next()){
13                 int id = resultSet.getInt("id");
14                 String username =resultSet.getString("username");
15                 int age = resultSet.getInt("age");
16                 String ppassword = resultSet.getString("password");
17                 System.out.println(id + " " + username + " " + age + " " + ppassword);
18             }
19         } catch (ClassNotFoundException e) {
20             e.printStackTrace();
21         } catch (SQLException e) {
22              e.printStackTrace();
23         }
24     }

     通过statement.executeQuery()方法返回已经ResultSet,再对ResultSet进行遍历。

时间: 2024-12-18 14:12:47

存储过程之七—java代码调用的相关文章

java代码调用数据库存储过程

由于前边有写java代码调用数据库,感觉应该把java调用存储过程也写一下,所以笔者补充该篇! package testSpring; import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet; import oracle.jdbc.OracleCalla

Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import

ubuntu下用java代码调用命令将java格式文件转换为html格式文件

首先我们应该在电脑上装上GNU Source-highlight 3.1.7,给个链接参考: http://www.gnu.org/software/src-highlite/#mozTocId120994 下面代码实现了 将java类型的代码转换为html文件类型的代码,如果java代码的文件名为 helloword.java,则转换为html格式的文件名为helloword.java.html,将java代码在浏览器上显示出来.其次我还将html文件中的内容提取出来,便于在html文件里编写

使用java代码调用exe程序 (包括参数传递)

使用Java代码调用exe 1使用场景 我现在使用eclipse+tomcat的架构建立了web server, 在这个web project中我需要建立一个定时任务,在定时任务中执行本地的一个C#工程生成的exe. 2Java代码 public class MyTask extends TimerTask { public void run() { System.out.println("call at " + (new Date())); // TODO æ­¤å¤?æ·»å? å

Java代码调用存储过程和存储方法

准备一个oracle 的JDBC jar 包:ojdbc14_11g.jar 首先找到你的 oracle 安装位置,例如: 1.创建一个JDBC数据库连接工具类: [java] view plain copy print? package com.test.db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; i

java代码调用C代码 JNI

1 定义一个c方法的接口   相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的 public native int login(String password); 2 实现C代码 在android工程的目录的src下,可以使用命令: (javah  -jni  全类名 )来生成对应C语言函数的头文件 #include <stdio.h>#include "com_qushaohui_aliwangwang_MainActivity.h" int login

java代码调用oracle存储过程

一.简介 与调用mysql存储过程类型过程都是如下 1.创建连接 Connection conn = DriverManager.getConnection(url, user, password); 2.创建CallableStatement CallableStatement statement = conn.prepareCall(sql); 3.设置参数 statement.setInt(1, id); statement.registerOutParameter(2, Types.VA

Java代码调用C#实现的Web服务

1.WebService项目结构 SimpleModel类: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace DonetWS { public class SimpleModel { public System.Int32 id { set; get; } public System.String str { set; get; } } } DonetWS

02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译

?? 1  编写以下案例(下面的三个按钮都调用了底层的C语言): 项目案例的代码结构如下: 2 编写DataProvider的代码: package com.example.ndkpassdata; public class DataProvider { /** * 计算x和y的加法  apktools * * @param x * @param y * @return */ public native int add(int x,int y); /** * 给字符串后面拼接字符串   加密运算