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中的类型,都是在创建表的时候被确定,并不能随意更改