JDBC调用存储过程
来源:互联网 发布:谁有阿里云免费开通码 编辑:程序博客网 时间:2024/06/02 05:57
http://www.cnblogs.com/gaopeng527/p/4447583.html
http://blog.csdn.net/yerenyuan_pku/article/details/52304479
在JDBC API中提供了调用存储过程的方法,通过CallableStatement对象进行操作。CallableStatement对象位于Java.sql包中,它继承于Statement对象,主要用于执行数据库中定义的存储过程,其调用方法如下:
{call <procedure-name>[(<arg1>,<arg2>,...)]}
- 1
- 1
其中,arg1、arg2为存储过程中的参数,如果存储过程中需要传递参数,可以对其进行赋值操作。
技巧:存储过程是一个SQL语句和可选控制流语句的预编译集合。编译完成后存放在数据库中,这样就省去了执行SQL语句时对SQL语句进行编译所花费的时间。在执行存储过程时只需要将参数传递到数据库中,而不需要将整条SQL语句都提交给数据库,从而减少了网络传输的流量,从另一方面提高了程序的运行速度。
例1.1 创建查询所有图书信息的存储过程,通过JDBC API对其调用获取所有图书信息,并将其输出到JSP页面中。
(1)在数据库test中创建名称为findAllBook的存储过程,用于查询所有图书信息。关键代码如下:
BEGIN SELECT* FROM books ORDER BY id DESC;END
- 1
- 2
- 3
- 1
- 2
- 3
各种数据库创建存储过程的方法并非一致,本实例使用的是MySQL数据库,如果使用其他数据库创建存储过程请参阅数据库提供的帮助文档。
(2) 创建名称为Book的类,该类用于封装图书信息的JavaBean对象。关键代码如下:
复制代码
package com.cn.gao;public class Book { private int id; private String name; private double price; private int bookCount; private String author; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getBookCount() { return bookCount; } public void setBookCount(int bookCount) { this.bookCount = bookCount; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
(3)创建名称为FindBook的类,用于执行查询图书信息的存储过程。首先在该类中编写getConnection()方法,获取数据库连接对象Connection,其关键代码如下:
复制代码
/** * 获取数据库连接 * @return Connection 对象 */ public Connection getConnection(){ Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "1234"; conn=DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
然后编写findAll()方法,调用数据库中定义的存储过程findAllBook,查询所有图书信息,并将查询到的图书的信息放置到List集合中。关键代码如下:
/** * 通过存储过程查询数据 * @return List<Book> */ public List<Book> findAll(){ List<Book> list = new ArrayList<Book>(); Connection conn = getConnection(); try { //调用存储过程 CallableStatement cs = conn.prepareCall("{call findAllBook()}"); ResultSet rs = cs.executeQuery(); //执行查询操作,并获取结果集 while(rs.next()){ Book book = new Book(); book.setId(rs.getInt("id")); book.setName(rs.getString("name")); book.setPrice(rs.getDouble("price")); book.setBookCount(rs.getInt("bookCount")); book.setAuthor(rs.getString("author")); list.add(book); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
由于存储过程findAllBook中没有定义参数,所以实例中通过调用“{call findAllBook()}”来调用存储过程。
(4)创建程序中的主页index1.jsp,在该页面中实例化FindBook对象,并调用它的findAll()方法获取所有图书信息,将图书信息数据显示在页面中。关键代码如下:
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%><%@ page import="java.util.*" %><%@ page import="com.cn.gao.*" %><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>Insert title here</title></head><body> <jsp:useBean id="findBook" class="com.cn.gao.FindBook"></jsp:useBean> <table align="center" width="450" border="1"> <tr> <td align="center" colspan="5"> <h2>所有图书信息</h2> </td> </tr> <tr align="center"> <td><b>ID</b></td> <td><b>图书名称</b></td> <td><b>价格</b></td> <td><b>数量</b></td> <td><b>作者</b></td> </tr> <% List<Book> list = findBook.findAll(); if(list==null||list.size()<1){ out.print("没有数据!"); }else{ for(Book book:list){ %> <tr align="center"> <td><%=book.getId() %></td> <td><%=book.getName() %></td> <td><%=book.getPrice() %></td> <td><%=book.getBookCount() %></td> <td><%=book.getAuthor() %></td> </tr> <% } } %> </table></body></html>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
实例运行后,进入到index1.jsp页面,程序将执行数据库中定义的存储过程findAllBook查询图书信息,其运行结果如下图所示:
注意一下几点:
存储过程,相当于数据库中的函数或方法。现举例来说明使用JDBC调用存储过程。
编写存储过程(参看mysql文档)
delimiter $$接收一个输入参数create procedure demoSp(in inputParam varchar(255), inout inOutParam varchar(255))begin 在传进来的字符串前加上zyxw---,然后将结果into到第二个参数select concat('zyxw---', inputParam) into inOutParam;end $$delimiter ;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
得到CallableStatement,并调用存储过程
public class Demo5 { // 调用存储过程 public static void main(String[] args) throws SQLException { Connection conn = null; CallableStatement st = null; ResultSet rs = null; try { conn = JdbcUtils.getConnection(); // 得到CallableStatement,并调用存储过程 st = conn.prepareCall("call demoSp(?,?)"); // 设置参数,注册返回值,得到输出 st.setString(1, "叶磊磊"); st.registerOutParameter(2, Types.VARCHAR); // 告诉MySQL驱动输出的是什么类型,即数据库的类型,Types类中有所有数据库的常见类型 st.execute(); System.out.println(st.getString(2)); } finally { JdbcUtils.release(conn, st, rs); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
学了存储过程,将来对数据进行处理就有2种选择了。
在数据库里面写存储过程,对数据进行处理,然后在java程序里面直接调用存储过程,获取到处理完后的数据,直接显示即可。不在数据库里面写存储过程,通过JDBC获取数据库中的数据,获取到了之后拿到程序里面写方法来处理,处理完后再显示。
什么情况下我们需要在数据库里面写存储过程来处理数据呢?
银行的数据处理一般用存储过程来实现。银行那些业务都是写好存储过程后给你,你去调用存储过程即可。在金融证劵领域用到的特别多,金融证劵领域的开发是不会用hibernate框架,因为表结构不会对开发人员公开。
- jdbc调用存储过程
- Jdbc调用存储过程
- jdbc调用存储过程
- jdbc调用存储过程
- JDBC调用存储过程
- JDBC调用存储过程
- JDBC调用存储过程
- Jdbc存储过程调用
- jdbc调用存储过程
- JDBC调用存储过程
- Jdbc调用存储过程
- JDBC调用存储过程
- JDBC调用存储过程
- jdbc调用存储过程
- JDBC调用存储过程
- jdbc调用存储过程
- jdbc调用存储过程
- jdbc调用存储过程
- 你给我这么多报表,让我如何是好
- 获取指定class名的元素,并兼容IE
- 如何查看composer安装路径,全局使用composer
- ZooKeeper的功能以及工作原理
- MindManager应用程序错误(0xc000007b)
- JDBC调用存储过程
- CSS3的属性选择器
- 优秀程序设计的18大原则
- 打造自己的RecyclerView(一)之添加header和footer
- 百度地图manager start failed : info.plist 中必须添加 Bundle display name
- 为RecyclerView打造通用CommonAdapter 让RecyclerView更加好用
- easyUI 关联验证
- 关于birt导出excel数值科学计数法失去精度问题
- 注册判断两次输入的密码是否一致