MySQL---数据库从入门走向大神系列(八)-在java中执行MySQL的存储过程

http://blog.csdn.net/qq_26525215/article/details/52143733

在上面链接的博客中,写了如何用MySQL语句定义和执行存储过程

Java执行存储过程:

准备表stud:

列类型分别为:
varchar,varchar,int

定义的存储过程分别为:

p1:-无参

delimiter &&
create procedure p1()
begin
    insert into stud values('P100','小李',43);
    select * from stud;
end&&
delimiter ;

p2:-输入参数

delimiter &&
create procedure p2(in id varchar(32),in sname varchar(32),in age int)
begin
    insert into stud values(id,sname,age);
    select * from stud;
end &&
delimiter ;

p3:-输入输出参数:

delimiter &&
create procedure p3(in id varchar(32) ,in sname varchar(32),in age int ,out num int)
begin
    insert into stud values(id,sname,age);
    select * from stud;
    select count(*) into num from stud;
end&&
delimiter ;

Java演示执行不带参数的存储过程:

@Test
    public void callProcedureDemo() throws Exception{
        Connection con = ConnFactory.getConnection();

        String sql = "call p1()";
        CallableStatement cst = con.prepareCall(sql);

        ResultSet rs = cst.executeQuery();

        while(rs.next()){
            System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getInt(3));
        }
    }

演示结果:

Java演示执行带输入参数的存储过程:

构造 call 转义序列时,请使用 ?(问号)字符来指定 IN 参数。此字符充当要传递给该存储过程的参数值的占位符。

可以使用 SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。可使用的 setter 方法由 IN 参数的数据类型决定。

向 setter 方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个 IN 参数,则其序数值为 1。如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。

@Test//带输入参数
    public void callProcedureDemo2() throws Exception{
        Connection con = ConnFactory.getConnection();

        String sql="call p2(?,?,?)";

        CallableStatement cst = con.prepareCall(sql);

        cst.setString(1, "P110");
        cst.setString(2, "段誉");
        cst.setInt(3, 43);

        ResultSet rs = cst.executeQuery();
        while(rs.next()){
            System.out.println(rs.getString(1)+","+rs.getString(2)+","+rs.getInt(3));
        }
    }

演示结果:

Java演示执行带输入输出参数的存储过程:

构造 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。
此字符充当要从该存储过程返回的参数值的占位符。
要为 OUT 参数指定值,必须在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定各参数的数据类型。

使用 registerOutParameter 方法为 OUT 参数指定的值必须是 java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成本地 SQL Server 数据类型之一。有关 JDBC 和 SQL Server 数据类型的详细信息,请参阅了解 JDBC 驱动程序数据类型。

当您对于 OUT 参数向 registerOutParameter 方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。例如,如果存储过程包含单个 OUT 参数,则其序数值为 1;如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。

@Test//带输入输出参数-----第4个参数 是 输出参数
    public void callProcedureDemo3() throws Exception{
        Connection con = ConnFactory.getConnection();

        String sql = "call p3(?,?,?,?)";

        CallableStatement cst =con.prepareCall(sql);

        cst.setString(1, "P102");
        cst.setString(2, "小凯");
        cst.setInt(3, 23);

        //将指定序号位置的 OUT 参数注册为给定的JDBC 类型。
        cst.registerOutParameter(4, Types.INTEGER);

        cst.execute();

        //获取输出的参数
        int count = cst.getInt(4);
        System.out.println(count);
    }

时间: 2024-07-28 19:15:01

MySQL---数据库从入门走向大神系列(八)-在java中执行MySQL的存储过程的相关文章

MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查

上节已经学会对MySQL进行简单的增删改查了,那么,我们如何实现用Java来对数据库操作增删改呢. 本节将用Java演示对MySQL进行增删改查. 简单的来说,分为4个步骤: 1.加载连接器(驱动)   通过Driver类 (最好用类反射来加载,更加灵活) 2.建立与数据库的连接 3.获取语句对象 4.对数据库进行操作(增删改查) 其实第一步现在可以不用写了,高版本的MySQL已经在内部帮我们写好了第一步,但是,为了兼容性更好(兼容低版本的MySQL)我们最好还是写上第一步. 我们先看一下原数据

MySQL---数据库从入门走向大神系列(九)-用Java向数据库读写大文本/二进制文件数据

介绍MySQL的文本和图形数据类型: Text 类型: 数据类型:描述 ------------------------------------------------------ char(size):保存固定长度的字符串(可包含字母.数字以及特殊字符).在括号中指定字符串的长度.最多 255 个字符. varchar(size):保存可变长度的字符串(可包含字母.数字以及特殊字符).在括号中指定字符串的最大长度.最多 255 个字符. 注释:如果值的长度大于 255,则被转换为 text类型

MySQL---数据库从入门走向大神系列(三)-修改数据库编码/DOS窗口编码

如何查看与修改数据库的编码,如何修改dos窗口的显示编码,都在本篇详细讲解. 查看当前数据库的编码: show variables where variable_name like 'character%'; 如果出现了中文乱码,我们只要看: character_set_client -客户端的编码 character_set_connection -连接的编码(传输时的编码) character_set_results - 最后的输出编码 只要保证这三个编码是相同的,且编码集有中文,中文就不会

MySQL---数据库从入门走向大神系列(六)-事务处理与事务隔离(锁机制)

MySQL 事务处理 简单介绍事务处理: MySQL 事务主要用于处理操作量大,复杂度高的数据. 比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行.换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的.如果在事务的任何操作失败,则整个事务将失败. 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全

MySQL---数据库从入门走向大神系列(五)-存储过程

本篇博客讲解: 自动增长列.字段值唯一性约束.存储过程.区分大小写的查询! 自动增长列.字段值唯一性约束 create table aa( id int auto_increment primary key, sname varchar(32) unique ); insert into aa values(5,'abc'); 创建一个自动增长的id属性(最开始不设置就从0开始增长) (后面的id如果有值了,如果添加数据时没有设置id,MySQL就会用最大的id加1做为最新的id) 注意:aut

MySQL---数据库从入门走向大神系列(七)-Java访问数据库配置及简单使用方法execute

从操作配置文件properties中读取连接字符串,通过该字符串进行数据连接,需要写三个文件其中,两个是java类,一个是后缀名为.properties的文件,该文件放在src工作目录下. 需要准备的包: https://github.com/chenhaoxiang/Java 后缀为.properties的文件此处为其取名为jdbc.properties,其中的代码如下: ##MySQL driver=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0

MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系

本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系! 准备: 首先我们创建一列sex.再为部分行设置好值0(女)或者1(男): delete from stud where age=26; 删除年龄为26的行. update stud set sex='1' where saddress like '湖南%'; 将地址中湖南开头的人的的sex修改为1. update stud set sex='0' where age>=30 and sex is null;

MySQL---数据库从入门走向大神系列(十三)-BasicDataSource创建DataSource(DBCP连接池配置)

DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去. 首先,下载必须的jar包 dbcp包,目前版本是2.1.1 : htt

MySQL---数据库从入门走向大神系列(十六)-JavaWeb分页技术实例演示1

分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不 是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,用户可以通过指定页码或是点上/下一页的方式进行翻页. 本例演示静态分页,也就是先设置好每页显示10行,再根据总行数,来算出总页数,将所有页数的页号都显示出来. 相关算法(技术): 总行数(num): select count(1) from stud; 每页显示的行数(n): 固定值---已知的一个常量 页数: pageSize= num/n +( (num%n==0)?