JDBC详解之存储过程的调用

来源:互联网 发布:中石油hazop风险矩阵 编辑:程序博客网 时间:2024/05/20 15:11

1.JDBC存储过程之调用无参存储过程

存储过程代码:

CREATE PROCEDURE imooc_db.sp_select_nofilter()//默认是前面要加spBEGIN    select * from imooc_goddess;END;

调用代码:

Connection conn=DBUtil.getConnection();//获取连接CallableStatement c=conn.prepareCall("call sp_select_nofilter()");//call 空格sp...c.execute();ResultSet rs=c.getResultSet();

存储过程一般名称前面要加sp,方法体放在begin,end之间。调用时还是要创建连接,我们之前jdbc后面则是创建statement对象或者PreparedStatement对象,在这里则是CallableStatement,调用的方法是prepareCall方法,后面参数call+空格方法名。
这里的例子,存储过程END后面符号问题,因为之前学的时候都是要在命令行变更结尾符号,然后结尾//,但是我用navicat自己尝试的时候,不需要直接就能用,END后面也不用加符号。这里先暂时用它创建一个存储过程并且调用成功。
在存储过程添加完后,做一个实际的例子还是用上节的内容:

public static void sp_select_nofilter(){        //获得连接        Connection conn=DBUtil.getConnection();        try {            //获得CallableStatement对象            CallableStatement cs=conn.prepareCall("Call sp_select_nofilter()");            //执行存储过程            cs.execute();            //处理结果:结果集,出参            ResultSet rs=cs.getResultSet();            while(rs.next()){                System.out.println(rs.getString("user_name")+                rs.getString("email")+rs.getString("mobile"));            }        } catch (SQLException e) {            e.printStackTrace();        }    }

2.JDBC存储过程之调用带输入参数的存储过程

mysql的if else if语句之前没有接触过,下面的代码含义是带了一个参数,如果输入是空或者空的字符串,那么搜索所有内容,如果参数是11位并且首位是1,则带条件搜索手机,剩余的则用名字来进行模糊匹配:

CREATE PROCEDURE sp_select_filter(IN sp_name VARCHAR(20))BEGIN    IF sp_name IS NULL THEN        SELECT * FROM imooc_goddess;    ELSE        IF LENGTH(sp_name)=11 AND SUBSTRING(sp_name,1,1)=1 THEN            SELECT * FROM imooc_goddess WHERE mobile=sp_name;        ELSE             SELECT * FROM imooc_goddess WHERE user_name LIKE CONCAT('%',SP_NAME,'%');        END IF;    END IF;END
static List<Goddess> result1=new ArrayList<Goddess>();    public  static List<Goddess> sp_select_filter(String sp_name) throws Exception{        //获得连接        Connection conn=DBUtil.getConnection();        //获得CallableStatement对象        CallableStatement cs=conn.prepareCall("Call sp_select_filter(?)");        cs.setString(1,sp_name);        //执行存储过程        cs.execute();        ResultSet rs=cs.getResultSet();        Goddess g=null;        while(rs.next()){                g=new Goddess();                g.setId(rs.getInt("id"));                g.setUser_name(rs.getString("user_name"));                g.setMobile(rs.getString("mobile"));                g.setAge(rs.getInt("age"));                result1.add(g);        }        return result1;    }

3.JDBC调用之调用带输出参数的存储过程

这里我们首先来看一下写出来的出参存储过程

CREATE PROCEDURE sp_select_count(OUT count INT(10))BEGIN    SELECT count(*) INTO count1 FROM imooc_goddess;END

这里我直接用命令行去测试了一下,可以返回有多少条记录。

public static Integer select_count() throws Exception{        Integer count=0;        //获得连接        Connection conn=DBUtil.getConnection();        //获得CallableStatement对象        CallableStatement cs=conn.prepareCall("Call sp_select_count(?)");        //这里就不能跟之前一样了,因为是输出参数,出参而不是入参,所以不能使用setString或者其他set去赋值,        //咱们需要注册输出参数,需要一个sql的类型,咱们需要告诉JDBC,咱们输出的参数是什么类型        cs.registerOutParameter(1,Types.INTEGER);//Types,jdbc封装的java里常用的数据类型        //执行存储过程        cs.execute();        //处理结果集,获取一下        count=cs.getInt(1);        return count;    }