–CallableStatement 简介 
–调用简单的存储过程 
–调用有输入参数的存储过程 
–调用有输入、输出参数的存储过程
################Michael分割线####################
• CallableStatement 简介 
–CallableStatement 继承PreparedStatement 
–提供了调用存储过程的能力
• 调用简单的存储过程
image
先创建一个存储过程
create procedure all_user()    
select * from UserTbl
image
调用存储过程
call all_user();
image
image
F5刷新
image
ConnectionUtil.java
package com.michael.jdbc;    

import java.sql.Connection;    
import java.sql.DriverManager;    
import java.util.Properties;    

public class ConnectionUtil {    
        //第一种方法    
        public Connection getConnection(){    
                Connection conn = null;    
                try {    
                        //Class.forName加载驱动    
                        Class.forName("com.mysql.jdbc.Driver");    
                        //DriverManager获得连接    
                        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_db","root","mysqladmin");    
                        return conn;    
                } catch (Exception e) {    
                        e.printStackTrace();    
                }    
                return null;    
        }    
        //第二种方法    
        public Connection getConnection(String driver,String url,String user,String password){    
                Connection conn = null;    
                try {    
                        //Class.forName加载驱动    
                        Class.forName(driver);    
                        //DriverManager获得连接    
                        conn = DriverManager.getConnection(url,user,password);    
                        return conn;    
                } catch (Exception e) {    
                        e.printStackTrace();    
                }    
                return null;    
        }    
        //第三种方法    
        public Connection openConnection(){    
                String driver = "";    
                String url = "";    
                String user = "";    
                String password = "";    
                Properties prop = new Properties();    
                Connection conn = null;    
                try {    
                        //加载属性文件    
                        prop.load(this.getClass().getClassLoader().getResourceAsStream("DBConfig.properties"));    
                        driver = prop.getProperty("driver");    
                        url = prop.getProperty("url");    
                        user = prop.getProperty("user");    
                        password = prop.getProperty("password");    
                        //Class.forName加载驱动    
                        Class.forName(driver);    
                        //DriverManager获得连接    
                        conn = DriverManager.getConnection(url,user,password);    
                        return conn;    
                } catch (Exception e) {    
                        e.printStackTrace();    
                }    
                return null;    
        }    


TestCallableStatement.java
package com.michael.jdbc;    

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

public class TestCallableStatement {    
        public static void call(){    
                Connection conn = new ConnectionUtil().openConnection();    
                try {    
                        CallableStatement cstmt = conn.prepareCall("{call all_user()}");    
                        ResultSet rs = cstmt.executeQuery();    
                        while(rs.next()){    
                                int id = rs.getInt(1);    
                                String user = rs.getString(2);    
                                String password = rs.getString(3);    
                                int age = rs.getInt(4);    
                                System.out.println(id+":"+user+":"+password+":"+age);    
                        }    
                } catch (SQLException e) {    
                        e.printStackTrace();    
                }finally{    
                        try {    
                                conn.close();    
                        } catch (SQLException e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    

Main.java
package com.michael.main;    

import com.michael.jdbc.TestCallableStatement;    

public class Main {    
        public static void main(String[] args) {    
                TestCallableStatement.call();    
        }    

image
• 调用有输入参数的存储过程 
image
创建有输入参数的存储过程
create procedure insert_user(in un varchar(20),in pw varchar(20),in a int)    
insert into UserTbl(user,password,age)    
values(un,pw,a)
image
调用有输入参数的存储过程
call insert_user('testname','123456',25)
image
数据己增加
image
TestCallableStatement.java
package com.michael.jdbc;    

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

public class TestCallableStatement {    
        //调用简单的存储过程    
        public static void call1(){    
                Connection conn = new ConnectionUtil().openConnection();    
                try {    
                        CallableStatement cstmt = conn.prepareCall("{call all_user()}");    
                        ResultSet rs = cstmt.executeQuery();    
                        while(rs.next()){    
                                int id = rs.getInt(1);    
                                String user = rs.getString(2);    
                                String password = rs.getString(3);    
                                int age = rs.getInt(4);    
                                System.out.println(id+":"+user+":"+password+":"+age);    
                        }    
                } catch (SQLException e) {    
                        e.printStackTrace();    
                }finally{    
                        try {    
                                conn.close();    
                        } catch (SQLException e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    
        //调用有输入参数的存储过程    
        public static void call2(){    
                Connection conn = new ConnectionUtil().openConnection();    
                try {    
                        CallableStatement cstmt = conn.prepareCall("{call insert_user(?,?,?)}");    
                        cstmt.setString(1, "test1");    
                        cstmt.setString(2, "test2");    
                        cstmt.setInt(3, 3);    
                        cstmt.executeUpdate();    
                } catch (SQLException e) {    
                        e.printStackTrace();    
                }finally{    
                        try {    
                                conn.close();    
                        } catch (SQLException e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    

Main.java
package com.michael.main;    

import com.michael.jdbc.TestCallableStatement;    

public class Main {    
        public static void main(String[] args) {    
                TestCallableStatement.call2();    
                TestCallableStatement.call1();    
        }    

image
image
• 调用有输入、输出参数的存储过程
image
创建有输入输出参数的存储过程
create procedure getAgeByName(in name varchar(20),out return_age int)    
begin    
         declare a int;    
         select age into a from UserTbl where user=name;    
         set return_age = a;    
end 

image
测试查询michael
image
输出年龄11
image
调用有输入输出的存储过程
TestCallableStatement.java
package com.michael.jdbc;    

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

public class TestCallableStatement {    
        //调用简单的存储过程    
        public static void call1(){    
                Connection conn = new ConnectionUtil().openConnection();    
                try {    
                        CallableStatement cstmt = conn.prepareCall("{call all_user()}");    
                        ResultSet rs = cstmt.executeQuery();    
                        while(rs.next()){    
                                int id = rs.getInt(1);    
                                String user = rs.getString(2);    
                                String password = rs.getString(3);    
                                int age = rs.getInt(4);    
                                System.out.println(id+":"+user+":"+password+":"+age);    
                        }    
                } catch (SQLException e) {    
                        e.printStackTrace();    
                }finally{    
                        try {    
                                conn.close();    
                        } catch (SQLException e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    
        //调用有输入参数的存储过程    
        public static void call2(){    
                Connection conn = new ConnectionUtil().openConnection();    
                try {    
                        CallableStatement cstmt = conn.prepareCall("{call insert_user(?,?,?)}");    
                        cstmt.setString(1, "test1");    
                        cstmt.setString(2, "test2");    
                        cstmt.setInt(3, 3);    
                        cstmt.executeUpdate();    
                } catch (SQLException e) {    
                        e.printStackTrace();    
                }finally{    
                        try {    
                                conn.close();    
                        } catch (SQLException e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    
        //调用有输入输出参数的存储过程    
        public static void call3(){    
                Connection conn = new ConnectionUtil().openConnection();    
                try {    
                        CallableStatement cstmt = conn.prepareCall("{call getAgeByName(?,?)}");    
                        cstmt.setString(1, "redking");    
                        //注册输出参数    
                        cstmt.registerOutParameter(2, Types.INTEGER);    
                        cstmt.execute();    
                        int age = cstmt.getInt(2);    
                        System.out.println(age);    
                } catch (SQLException e) {    
                        e.printStackTrace();    
                }finally{    
                        try {    
                                conn.close();    
                        } catch (SQLException e) {    
                                e.printStackTrace();    
                        }    
                }    
        }    

Main.java
package com.michael.main;    

import com.michael.jdbc.TestCallableStatement;    

public class Main {    
        public static void main(String[] args) {    
                //TestCallableStatement.call2();    
                //TestCallableStatement.call1();    
                TestCallableStatement.call3();    
        }    


输出redking年龄为22
image
################Michael分割线####################