JDBC(MySQL)——DAY04(调用存储过程,存储函数)

今天针对JDBC中调用存储过程和存储函数进行了学习,学习内容如下:

1.JDBC中调用存储过程:

调用存储过程需要用到PreparedCall,专门用来处理调用存储过程和存储函数,迄今为止我学了三个Connection创建的陈述对象了,Statement,PreparedStatement和PreparedCall三个,前两个区别在于Statement是在executeQuery/ExecuteUpdate的时候进行SQL语句的执行,而PreparedStatement是在初始化的时候传入SQL语句,并在指定参数部位传入?占位,并在后续使用setObject/String/Int/Blob...进行参数设置,设置好之后使用execute执行SQL,Statement的执行流程是:解析->编译->优化->执行就是连续下来的一个过程,PreparedStatement的执行流程是:解析->编译->优化->缓存执行计划,然后在后续调用execute之后再执行,而PreparedCall的执行则是和PreparedStatement相同,只不过作用的是存储过程和存储函数罢了;

(1)调用无参的存储过程

javascript 复制代码
create procedure noparam()
begin
select * from emp;
end;
javascript 复制代码
public class TestNoParam {
    public static void main(String[] args) throws SQLException {
        //Statement
        //PreparedStatement
        Connection connection = DBUtil.getConnection();
        String sql = "{call noparam()}";
        CallableStatement callableStatement = connection.prepareCall(sql);
        callableStatement.execute();//执行了存储过程
        ResultSet resultSet = callableStatement.getResultSet();
        //ResultSet resultSet = callableStatement.executeQuery();
        while (resultSet.next()) {
            System.out.print(resultSet.getString(1) + "\t");
            System.out.print(resultSet.getString(2) + "\t");
            System.out.print(resultSet.getString(3) + "\t");
            System.out.print(resultSet.getString(4) + "\t");
            System.out.print(resultSet.getString(5) + "\t");
            System.out.println(resultSet.getString(6) + "\t");
        }
        DBUtil.close(callableStatement, connection);
    }
}

(2)有入参的存储过程调用

sql 复制代码
create procedure sell_pro(goodsId varchar(30),orderId varchar(32),n int)
begin
start transaction ;
insert into order_info values (default,goodsId,orderId,n);
update stock set num=num-n where goods_id=goodsId;
insert into records values (default,goodsId,n,now());
commit ;
end;
java 复制代码
public class TestInParam {
public static void main(String[] args) throws SQLException {
Connection connection= DBUtil.getConnection();
String sql="{call sell_pro(?,?,?)}";
CallableStatement callableStatement = connection.prepareCall(sql);
callableStatement.setString(1,"1001");
callableStatement.setString(2,"20230102");
callableStatement.setInt(3,20);
callableStatement.execute();
DBUtil.close(callableStatement,connection);
}
}

(3)既有入参又有出参的存储过程调用:

sql 复制代码
create procedure add_test( a int, b int,out c int )
begin
set c=a+b;
end;
java 复制代码
public class TestOutParam {
public static void main(String[] args) throws SQLException {
Connection connection= DBUtil.getConnection();
String sql="{call add_test(?,?,?)}";
CallableStatement callableStatement = connection.prepareCall(sql);
callableStatement.setInt(1,10);
callableStatement.setInt(2,20);
//对应out参数的处理,标注参数类型
callableStatement.registerOutParameter(3, Types.INTEGER);
callableStatement.execute();
int anInt = callableStatement.getInt(3);
System.out.println(anInt);
DBUtil.close(callableStatement,connection);
}
}

(4)有特殊参数(INOUT)的调用

sql 复制代码
create procedure mul(inout res int)
begin
set res=res*10;
end;
java 复制代码
public class TestInOutParam {
public static void main(String[] args) throws SQLException {
Connection connection= DBUtil.getConnection();
String sql="{call mul(?)}";
CallableStatement callableStatement = connection.prepareCall(sql);
callableStatement.setInt(1,5);
//对应out参数的处理,标注参数类型
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.execute();
int anInt = callableStatement.getInt(1);
System.out.println(anInt);
DBUtil.close(callableStatement,connection);
}
}

(6)存储结果查询了多个结果集:

sql 复制代码
create procedure selectMul(goodsId varchar(30))
begin
select * from order_info where goods_id = goodsId;
select * from stock where goods_id = goodsId;
select * from records where goods_id = goodsId;
end;
java 复制代码
package demo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;

/**
 * @author djw
 */
public class Test5 {
    public static void main(String[] args) throws Exception {
        Connection conn = DBUtil.getConnection();
        CallableStatement callableStatement = conn.prepareCall("{call selectMul(?)}");
        callableStatement.setString(1, "1001");
        callableStatement.execute();
        ResultSet rs = callableStatement.getResultSet();
        while(rs.next()) {
            for(int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
                System.out.print(rs.getString(i) + "\t");
            }
        }
        System.out.println("---------------------");
        while (callableStatement.getMoreResults()) {
            ResultSet resultSet = callableStatement.getResultSet();
            while(resultSet.next()) {
                for(int i = 1; i <= resultSet.getMetaData().getColumnCount(); i++) {
                    System.out.print(resultSet.getString(i) + "\t");
                }
            }
            System.out.println();
            System.out.println("--------------------");
        }
        DBUtil.close(conn, callableStatement);
    }
}

这里可以使用元数据getMetaData来获取有多少行的统计值,以便于进行打印

2.再创建Statement/PreparedStatement/PreparedCall的时候可以传入参数以设置结果集的可滚动性,可更新性等特点:

3.调用函数:

java 复制代码
public class TestFunction {
public static void main(String[] args) throws SQLException {
Connection connection= DBUtil.getConnection();
//调用自定义函数
CallableStatement callableStatement =
connection.prepareCall("{?=call getHiredate(?)}");
callableStatement.registerOutParameter(1, Types.DATE);
callableStatement.setString(2,"白居易");
callableStatement.execute();
System.out.println(callableStatement.getDate(1));
DBUtil.close(callableStatement,connection);
}
}

方式与有out参数的存储过程相似,只不过语法有所改变;

相关推荐
清空mega2 小时前
第7章:JavaBean、Servlet 与 MVC——从 JSP 页面开发走向规范项目
java·servlet·mvc
惊讶的猫2 小时前
springboot常用注解
java·spring boot·后端
tuyanfei2 小时前
SpringSecurity+jwt实现权限认证功能
java
yhole2 小时前
【SpringBoot】单元测试实战演示及心得分享
java
OKkankan2 小时前
撕 STL 系列:封装红黑树实现 mymap 和 myset
java·c++·算法
C蔡博士2 小时前
最近点对问题(Closest Pair of Points)
java·python·算法
APIshop3 小时前
Java调用亚马逊商品详情API接口完全指南
java·开发语言·python
微学AI3 小时前
时序数据库选型:聚焦时间序列数据库Apache IoTDB——为工业物联网与大数据而生
数据库·apache·时序数据库
jason_renyu3 小时前
Windows下MySQL多实例配置:添加多端口服务(独立配置文件法)
windows·mysql·mysql配置多端口服务