Java访问MySQL的存储过程

1、理论

MySQL中的存储过程也就是一种特殊的函数,只不过,MySQL中的方法只能返回单一的值,不能返回像结果集一样的值,所以,存储过程就诞生了,
1、返回值不同
2、调用方式不同
方法的调用就是直接在SELECT 或者WHERE中。存储过程需要使用:CALL 存储过程名(参数),
3、存储过程的 参数不同,存储过程提供了两种类型的参数——IN和OUT,也就是相当于Java中的传值和传引用的区别。而OUT 类型的参数就是用来返回结果集的类型,不过在MySQL中传一个OUT类型的参数,通常是一个用户变量,而Java中调用时就需要配合MySQL中的数据类型来作为参数了

2、实践

废话不多说,上代码:


public class StoreProcess {
    private final static String URL="jdbc:mysql://localhost:3306/yggl?useSSL=true&serverTimezone=GMT%2B8";
    private final static String USER="root";
    private final static String PASSWORD="abcdef";
    private static Connection connection=null;

	//将jdbc的驱动加载入内存中并得到jdbc的连接
    static{
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection= DriverManager.getConnection(URL,USER,PASSWORD);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        if(null==connection){	//对连接对象进行一个判断,防止空指针异常
            System.out.println("null");
        }else {
            accessStoreProcess();
        }
    }

	//访问存储过程
    private static void accessStoreProcess(){
    	//SQL语句发生了变化,使用了{}的写法,其他的写法和数据库中的写法一样
        String sql="{CALL proce_information(?,?)}";
        //参数1(IN类型):员工名, 参数2(OUT类型):结果参数
        
        //执行对象也发生了改变,不再是preperedStatement
        CallableStatement callableStatement=null;
        try {
        //得到执行对象的语句还是一样的,通过连接对象获得执行对象
            callableStatement= connection.prepareCall(sql);
            callableStatement.setString(1,"张番番");//对执行对象中的占位符进行赋值
            
            //对于第二个参数是OUT类型的存储过程,就需要配合MySQL中的类型进行赋值,
            //同时也采用了新了赋值方法:registerOutParameter();表示注册一个引用类型的参数
            callableStatement.registerOutParameter(2, Types.VARCHAR);
            
            callableStatement.execute();//执行SQL语句
            
            //得到存储过程中返回的值
            //这里的写法也与以往不同:
            //需要通过执行对象调用get方法并且传入OUT类型占位符所在的第N个位,从而得到存储过程的返回值
            System.out.println(callableStatement.getString(2));
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}

3、总结

1、调用存储过程的SQL语句不同,需要在调用存储过程时加上{}

String sql="{CALL proce_information(?,?)}"

2、执行对象不同:callableStatement

callableStatement= connection.prepareCall(sql);

3、对于参数的传入不同

//对于存储过程中的IN类型:直接通过set方法传值就行了
 callableStatement.setString(1,"张番番");

//对于存储过程中的OUT类型:由于Java中并没有用户变量这一说法,
//所以说对于OUT类型的变量就需要通过方法去注册,
//并且在注册的时候就需要指定参数的类型,Types.VARCHAR:这个类型就是数据库中的字符串类型
//对应Java中的String类型
callableStatement.registerOutParameter(2, Types.VARCHAR);

4、得到返回值的方式不同

//由于Java中没有用户变量,所以,也就无法用变量去接收存储过程中返回的值,
//但是,返回值会存在于OUT类型的变量中,所以可以直接通过取占位符的方式取得存储过程的返回值
System.out.println(callableStatement.getString(2));
//getString()中的2就表示SQL中的第二个参数是OUT类型的参数

在Java中使用的类型必须和执行的MySQL中的类型一致,否则会报错
并且,MySQL中的类型,都是在创建表的时候被确定,并不能随意更改

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值