首先,JDBC 的 Statement,CallableStatement 和 PreparedStatement 接口定义的方法和属性,可以让你发送 SQL 命令到数据库,并从你的数据库接收数据,其中CallableStatement被用来执行数据库访问存储过程的时候。[关于Statement对象的理解](http://edu.clouderwork.com/course/373/learn#lesson/1923)
步骤:
创建存储过程:
mysql> CREATE DATABASE EMP $$
mysql> DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
mysql> CREATE PROCEDURE `EMP`.`getEmpName`
-> (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
-> BEGIN
-> SELECT first INTO EMP_FIRST
-> FROM Employees
-> WHERE ID = EMP_ID;
-> END $$
mysql> DELIMITER ;
创建CallableStatement对象,调用存储过程(我用的是MySql数据库)
package ProcedureTest;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import org.apache.commons.dbcp.BasicDataSource;
public class JdbcConnectedPro {
private static Connection connection=null;
private static CallableStatement callableStatement = null;
//private static ResultSet resultSet = null;//结果集
private static String sql = null;
/**
* 创建connection对象
* @return
*/
public static Connection getConnection() {
//创建dataSource
BasicDataSource dataSource = new BasicDataSource();
//加载数据库驱动
dataSource.setDriverClassName("org.gjt.mm.mysql.Driver");
//设置用户名和密码
dataSource.setUrl("jdbc:mysql://localhost:3306/emp");
dataSource.setUsername("root");
dataSource.setPassword("root");
try {
connection=dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 基于存储过程实例化CallableStatement对象
* @return
*/
public static CallableStatement getStatement() {
//String sql = "";//{call getEmpName (?, ?)}
try {
callableStatement = connection.prepareCall(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return callableStatement;
}
//关闭资源
public static void close() {
if (null != callableStatement) {
try {
callableStatement.close();
if (null != connection) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
sql = "{call getEmpName (?, ?)}";
try {
getConnection();
getStatement();
callableStatement.setInt(1, 1);
callableStatement.registerOutParameter(2, Types.VARCHAR);
callableStatement.execute();//执行
int result = callableStatement.getInt(2);
System.out.println("返回结果为"+result);
} catch (SQLException e) {
e.printStackTrace();
}
}
}