posts - 37, comments - 8, trackbacks - 0, articles - 0

JSP中数据库的一些操作

Posted on 2008-10-21 20:24 梦与桥 阅读(2015) 评论(0)  编辑  收藏

1. JDBC驱动程序的类型
  目前比较常见的JDBC驱动程序可分为以下四个种类:
  (1)JDBC-ODBC桥加ODBC驱动程序
  JavaSoft桥产品利用ODBC驱动程序提供JDBC访问。注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。
  (2)本地API
  这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。
  (3)JDBC网络纯Java驱动程序
  这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。
  (4)本地协议纯Java驱动程序
  这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。由于许多这样的协议都是专用的,因此数据库提供者自己将是主要来源,有几家提供者已在着手做这件事了。
据专家预计第(3)、(4)类驱动程序将成为从JDBC访问数据库的首方法。第(1)、(2)类驱动程序在直接的纯Java驱动程序还没有上市前会作为过渡方案来使用。对第(1)、(2)类驱动程序可能会有一些变种,这些变种要求有连接器,但通常这些是更加不可取的解决方案。第(3)、(4)类驱动程序提供了Java的所有优点,包括自动安装(例如,通过使用JDBC驱动程序的appletapplet来下载该驱动程序)。

2. JDBC编程的步骤
1)第一步:加载驱动程序
 //jdbc-odbc驱动
 try{
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
}catch(ClassNotFoundException e){
 e.printStackTrace();
}
 加载其他各种不同驱动程序的方法如下:
 //sqlserver
 Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);
 //mysql
 Class.forName(“org.gjt.mm.mysql.Driver”);
 //oracle
 Class.forName(Oracle.jdbc.driver.OracleDriver);
 //Informix
 Class.forName(“com.informix.jdbc.IfxDriver”);
 //Sybase
 Class.forName(“com.sybase.jdbc2.jdbc.SybDriver”);
 //AS400
 Class.forName(“com.ibm.as400.access.AS400JDBCConnection”);
2)第二步:将“驱动程序”传递到DriverManager,然后获得“连接”。
  DriverManager类的getConnection(String rul,String user,String password)方法用于建立与某个数据库的连接。每个JDBC驱动程序使用一个专门的JDBC URL作为自我标识的一种方法。
  JDBC URL的格式为:jdbc:<子协议名>:<子名称>,子协议与子名称和JDBC驱动程序有关。
 //建立JDBC-ODBC驱动的连接
 try{
  String url=”jdbc:odbc:myodbc”;
  Connection con=DriverManager.getConnection(url);
  //或者
  //Connection con=DriverManager.getConnection(url,user,password);;
} catch(SQLException e){
 e.printStackTrace();
}
以下是连接各种不同的数据库的URL编写方法:
//sqlserver
 DriverManger.getConnection(“jdbc:Microsoft:sqlserver://主机:端口号;DatabaseName=数据库名”,”用户名”,”密码”)
 //mysql
 DriverManger.getConnection(“jdbc:mysql://主机:端口号:数据库名”,”用户名”,”密码”)
 //oracle
 DriverManger.getConnection(“jdbc:Oracle:thin:@主机:端口号:数据库名”,”用户名”,”密码”)
 //Informix
 DriverManger.getConnection(“jdbc:informix-sqli://主机:端口号/数据库名:INFORMIXSERVER=informix服务名”,”用户名”,”密码”)
 //Sybase
 DriverManger.getConnection(“jdbc:sybase:Tds:主机:端口号/数据库名”,”用户名”,””密码)
 //AS400
 DriverManger.getConnection(“jdbc:as400://主机”,”用户名”,”密码”)
3)第三步:创建语句,Statement、PreparedStatement或CallableStatement,并将它们用于更新数据库或执行查询。
4)第四步:查询并返回包含有已请求数据的ResultSet,该ResuletSet是按类检索的。
5)显示数据或根据得到的查询结果完成业务逻辑处理。
6)第六步:最后关闭ResultSet(结果集)、Statement(语句对象)、Conection(数据库连接)。

3. 数据库各种连接方式实例分析
1)通过ODBC建立与数据库的连接,创建数据源的过程略掉,数据源的名称为myodbc,代码:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>通过ODBC建立连接</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
        try {
            
// 加载ODBC驱动
            Class.forName(
"sun.jdbc.odbc.JdbcOdbcDriver");
            
// 通过驱动管理器(DriverManager)获得连接
            con 
= DriverManager.getConnection("jdbc:odbc:myodbc",
                    
"sa","");
            
// 如果连接不成功,就会出现异常,不会执行下面这个语句
            
            out.println(
"<H1>");
            out.println(
"通过ODBC数据源连接数据库成功!");
            out.println(
"</H1>");
        } catch (Exception e) {
// 如果出现异常,会打印堆栈里异常的信息
            e.printStackTrace();
        } finally {
// 用完后,关闭连接,释放资源
            try {
                
if (con != null// 防止出现内存泄露
                    con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }  
   
%>    
  
</body>
</html>

2)通过sqlserver提供驱动程序获得连接,需要3个jar文件:msbase.jar、mssqlserver.jar、msutil.jar,设置class环境变量,或者配置到WEB中,jar文件部署,和所有的jar文件一样,想在整个WEB服务器(我指Tomcat)中使用,就拷贝到Tomcat 6.0\lib目录下,若在当前WEB应用中使用,拷贝到WEB应用的WEB-INF\lib目录下。代码:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>通过Sqlserver純驱动程序建立连接</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
        
// 加载SQLSERVER的驱动程序            
        Class.forName(
"com.microsoft.jdbc.sqlserver.SQLServerDriver");
        
// 通过驱动来获得一个连接
        con 
= DriverManager.getConnection(
                
"jdbc:microsoft:sqlserver://localhost:1433;"
                        
+ "databasename=pubs""sa""");    

        
// 如果连接不成功,就会出现异常,不会执行下面这个语句
        
        out.println(
"<H1>");
        out.println(
"通过SQLServer纯驱动程序连接数据库成功!<br> con="+con);
        out.println(
"</H1>");
    } catch (Exception e) {
// 如果出现异常,会打印堆栈里异常的信息
        e.printStackTrace();
    } finally {
// 用完后,关闭连接,释放资源
        try {
            
if (con != null// 防止出现内存泄露
                con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }  
   
%>    
  
</body>
</html>

3)通过Oracle提供驱动程序获得连接,需要用到一个classes12.jar文件,配置同上。代码:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>通过oracle純驱动程序建立连接</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
        
// 加载ORACLE9i的驱动程序
            Class.forName(
"oracle.jdbc.driver.OracleDriver");
            
// 获得连接 oracle数据库的端口号:1521 数据服务器的名字叫ora921
            
// 登陆的用户名为system,密码为:itjob (默认密码为manager)
            con 
= DriverManager.getConnection(
                    
"jdbc:oracle:thin:@127.0.0.1:1521:ora921"
                    
"system","itjob");    
        
// 如果连接不成功,就会出现异常,不会执行下面这个语句        
        out.println(
"<H1>");
        out.println(
"通过ora921纯驱动程序连接数据库成功!<br> con="+con);
        out.println(
"</H1>");
    } catch (Exception e) {
// 如果出现异常,会打印堆栈里异常的信息
        e.printStackTrace();
    } finally {
// 用完后,关闭连接,释放资源
        try {
            
if (con != null// 防止出现内存泄露
                con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }  
   
%>    
  
</body>
</html>

4)通过数据库连接池获得连接,连接池将通过连接的重用,降低开销。

 以oracle数据库为例,配置Tomcat6.0的连接池。
    §将classes12.jar拷到Tomcat 6.0\lib目录下,并修改Tomcat 6.0\conf目录下的context.xml文件,在文件的</Context>标记前面加上如下代码:

<WatchedResource>WEB-INF/confweb.xml</WatchedResource>
<Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource" maxActive="100"
maxIdle
="30" maxWait="10000" username="scott" password="tiger" driverClassName="oracle.jdbc.driver.OracleDriver"
url
="jdbc:oracle:thin:@127.0.0.1:1521:wzz"/>
保存并重启Tomcat。
§编辑jsp文件pool_connection.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>通过数据库连接池建立连接</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
        Context context 
=new InitialContext();
        DataSource ds
=(DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
        con
=ds.getConnection();
        out.println(
"<H1>");
        out.println(
"第一次通过数据库连接池连接数据库成功!<br> con="+con);
        out.println(
"</H1>");
        
//con.close();
        
        con 
= ds.getConnection();        
        out.println(
"<H1>");
        out.println(
"第二次通过数据库连接池连接数据库成功!<br> con="+con);
        out.println(
"</H1>");
        con.close();
        
    } catch (Exception e) {
// 如果出现异常,会打印堆栈里异常的信息
        e.printStackTrace();
    } 
   
%>    
  
</body>
</html>
其中连接数据库的代码:
        Context context =new InitialContext();
        DataSource ds=(DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
        con=ds.getConnection();
可以修改为如下代码:
        Context initContext = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        DataSource ds = (DataSource)envContext.lookup("jdbc/oracleds");
        con = ds.getConnection();
3. 使用DDL和DML语言对数据进行基本操作
    1)创建表并插入、修改数据,代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>创建表并插入及修改数据</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
            
// 通过连接池来获得一个连接
            Context initContext 
= new InitialContext();
            Context envContext  
= (Context)initContext.lookup("java:/comp/env");
            DataSource ds 
= (DataSource)envContext.lookup("jdbc/sqlserver");
            con 
= ds.getConnection();
        
            
// 创建语句对象
            Statement st 
= con.createStatement();
            
// 创建表的SQL语句
            
String sql = "create table student(id int,name char(30),age int)";
            
// 执行完SQL语句的结果
            
boolean b = st.execute(sql);            
            out.println(
"<h2>创建student表成功!</h2><br>");
            
            
// 插入数据到student表
            sql 
= "insert into student values(1,'andy',47)"
                    
+ "insert into student values(2,'jacky',53)"
                    
+ "insert into student values(3,'周润发',51)"
                    
+ "insert into student values(4,'谢贤',60)";
            
// 执行完SQL语句的结果
            b 
= st.execute(sql);            
            out.println(
"<h2>插入数据成功!</h2><br>");
            

            
// 更新表数据
            sql 
= "update  student set name='刘德华' where id=1";
            
int rows = st.executeUpdate(sql);

            
// 如果更新成功,rows肯定是大于1的值
            
if (rows > 0)
                out.println(
"<h2>修改数据成功!</h2><br>");
            
else
                out.println(
"<h2>修改数据失败!</h2><br>");

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                
if (con != null)
                    con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

   
%>    
  
</body>
</html>
2)查询数据,代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>查询数据库数据</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
            
// 通过连接池来获得一个连接
            Context initContext 
= new InitialContext();
            Context envContext  
= (Context)initContext.lookup("java:/comp/env");
            DataSource ds 
= (DataSource)envContext.lookup("jdbc/sqlserver");
            con 
= ds.getConnection();
        
            Statement st 
= con.createStatement();
            
String query = "select id,name from student";

            
// 获得一个结果集
            ResultSet rs 
= st.executeQuery(query);
            
// 获得结果集的元数据(表及相关的信息)
            ResultSetMetaData rsmt 
= rs.getMetaData();
            
// 得到结果集有几列
            
int num = rsmt.getColumnCount();
            
String[] columns = new String[num];
            
// 列的序号是从1开始的
            
for (int i = 0; i < num; i++)
                columns[i] 
= rsmt.getColumnName(i + 1);            
            out.println(
"<table width='600' border='1'>");
            out.println(
"<tr>");        
            
// 先输出列名            
            
for (int i = 0; i < num; i++)
                out.print(
"<td>"+columns[i] + "</td>");
            
// 输出列名之后换行
            out.println(
"</tr>");
            
// 取出结果
            
while (rs.next()) {
                
// 输出每一行的值
                out.println(
"<tr>");
                
for (int i = 1; i <= num; i++) {
                    
String temp = rs.getString(i);
                    out.print(
"<td>"+temp + "</td>");
                }
                out.println(
"</tr>");
            }            
            out.println(
"</table>");
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                
// 用完后要关闭连接,释放资源
                
if (con != null)
                    con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
   
%>    
  
</body>
</html>
3)使用预编译语句,代码如下:
<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>预编译的SQL语句</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
            
// 通过连接池来获得一个连接
            Context initContext 
= new InitialContext();
            Context envContext  
= (Context)initContext.lookup("java:/comp/env");
            DataSource ds 
= (DataSource)envContext.lookup("jdbc/sqlserver");
            con 
= ds.getConnection();
            
            
// 创建修改表的PrepareStatement SQL语句
            
String sql = "update  student set name=? where id=?";
            
// 创建预编译语句对象
            PreparedStatement pst 
= con.prepareStatement(sql);
            
String[] names = new String[] { "梁朝伟""贝壳汗母""小罗""霍元甲" };
            
for (int i = 0; i < names.length; i++) {
                pst.setString(
1, names[i]);
                pst.setInt(
2, i + 1);
                pst.executeUpdate();
            }
            pst.close();
            
// 打印执行完SQL语句的结果        
            
            out.println(
"<h1>修改后的数据库结果</h1>");    
        
            Statement st 
= con.createStatement();
            
String query = "select id,name from student";

            
// 获得一个结果集
            ResultSet rs 
= st.executeQuery(query);
            
// 获得结果集的元数据(表及相关的信息)
            ResultSetMetaData rsmt 
= rs.getMetaData();
            
// 得到结果集有几列
            
int num = rsmt.getColumnCount();
            
String[] columns = new String[num];
            
// 列的序号是从1开始的
            
for (int i = 0; i < num; i++)
                columns[i] 
= rsmt.getColumnName(i + 1);            
            out.println(
"<table width='600' border='1'>");
            out.println(
"<tr>");        
            
// 先输出列名            
            
for (int i = 0; i < num; i++)
                out.print(
"<td>"+columns[i] + "</td>");
            
// 输出列名之后换行
            out.println(
"</tr>");
            
// 取出结果
            
while (rs.next()) {
                
// 输出每一行的值
                out.println(
"<tr>");
                
for (int i = 1; i <= num; i++) {
                    
String temp = rs.getString(i);
                    out.print(
"<td>"+temp + "</td>");
                }
                out.println(
"</tr>");
            }            
            out.println(
"</table>");
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                
// 用完后要关闭连接,释放资源
                
if (con != null)
                    con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
   
%>    
  
</body>
</html>

4)使用存储过程。存储过程是用来封装一段SQL语句完成一个完整的业务功能,这样可以带来更快的性能和改进的安全性。存储过程可以支持3种类型的参数:IN、OUT、INOUT,这对于存储过程在数据库内部真正能做什么来说,带来了很大的灵活性。不管存储过程是用什么语言编写的,它都能以一种标准的方式从java应用程序调用。首先需要创建一个CallableStatement对象,允许三种类型的调用,调用存储过程StudentList为例:
    §|call StudentList|:如果过程不需要参数。
    §|call StudentList(?,?)|:如果过程需要两个参数。
    §|? =call StudentList(?,?)|:如果参数需要两个参数并返回一个。

首先要创建存储过程,代码如下:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>创建SQLServer存储过程</title>
  
</head>  
  
<body>
  
<%
   Connection con 
= null;
    try {
            
// 通过连接池来获得一个连接
            Context initContext 
= new InitialContext();
            Context envContext  
= (Context)initContext.lookup("java:/comp/env");
            DataSource ds 
= (DataSource)envContext.lookup("jdbc/sqlserver");
            con 
= ds.getConnection();
            Statement stmt 
= con.createStatement();            
            
// 1.创建存储过程show_students
            
String createProcedure1 = "create procedure show_students " + "as "    + "select id, name,age " + "from student " + "order by id";
            
// 删除数据库中存在的同名过程
            stmt.executeUpdate(
"if exists(select name from sysobjects "
                    
+ "where name='show_students'and type='p') "
                    
+ "drop procedure show_students");
            stmt.executeUpdate(createProcedure1);
            out.println(
"<h1>第一个存储过程show_students创建成功</h1><br>");            

            
// 2.创建储存过程onestudent
            
String createProcedure2 = "create procedure onestudent "
                    
+ "@stu_id int = null, " + "@name varchar(20) output, "
                    
+ "@age  int  output " + "as " + "if @stu_id = null "
                    
+ "BEGIN "
                    
+ "  PRINT 'ERROR: You must specify a stu_id value.' "
                    
+ "  RETURN "
                    
+ "END "
                    
+
                    
// Get the sales for the specified cof_name and " +
                    // assign it to the output parameter. " +
                    "SELECT @name = name, @age = age " + "FROM student "
                    
+ "WHERE id = @stu_id " + "RETURN ";
            stmt.executeUpdate(
"if exists(select name from sysobjects "
                    
+ "where name='onestudent'and type='p') "
                    
+ "drop procedure onestudent");
            stmt.executeUpdate(createProcedure2);            
            out.println(
"<h1>第二个存储过程onestudent创建成功</h1><br>");

            
// 3.创建函数
            
String createProcedure3 = "CREATE FUNCTION ageofstu "
                    
+
                    
// Input cof_name
                    
"(@stu_name varchar(20)) "
                    
+ "RETURNS int "
                    
+ // return sales
                    
"AS " + "BEGIN " + "  DECLARE @age int "
                    
+ "  SELECT @age = age " + "  FROM student "
                    
+ "  WHERE name like @stu_name " + "  RETURN @age "
                    
+ "END ";
            stmt.executeUpdate(
"if exists(select name from sysobjects "
                    
+ "where name='ageofstu') "
                    
+ "drop function ageofstu");
            stmt.executeUpdate(createProcedure3);
            out.println(
"<h1>函数ageofstu创建成功</h1><br>");
            stmt.close();
            
//con.close();
            
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                
// 用完后要关闭连接,释放资源
                
if (con != null)
                    con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
   
%>    
  
</body>
</html>

调用存储过程:

<%@ page language="java" contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*,javax.naming.*,javax.sql.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>    
    
<title>调用SQLServer数据库存储过程</title>
  
</head>  
  
<body>
  
<%
       Connection con 
= null;
   
// 定义调用存储过程和函数的 SQL 语句
    
String callSQL1 = "{call show_students}";
    
String callSQL2 = "{call onestudent(?,?,?)}";
    
String callSQL3 = "{? = call ageofstu(?)}";
     
    try {
            
// 通过连接池来获得一个连接
            Context initContext 
= new InitialContext();
            Context envContext  
= (Context)initContext.lookup("java:/comp/env");
            DataSource ds 
= (DataSource)envContext.lookup("jdbc/sqlserver");
            con 
= ds.getConnection();
        
            
// 调用第 1 个存储过程
            CallableStatement cs 
= con.prepareCall(callSQL1);
            ResultSet rs 
= cs.executeQuery();
            out.println(
"<h1>第一个存储过程调用结果</h1><br>");
            
while (rs.next()) {
                
String id = rs.getString(1);
                
String name = rs.getString(2);
                
String age = rs.getString(3);
                out.println(id 
+ "  " + name + " " + age+"<br>");
            }            
            
// 调用第 2 个存储过程
            cs 
= con.prepareCall(callSQL2);
            cs.setString(
1"2");
            cs.registerOutParameter(
2, Types.CHAR);
            cs.registerOutParameter(
3, Types.INTEGER);
            cs.execute();
            
String name = cs.getString(2);
            
int age = cs.getInt(3);
            out.println(
"<h1>第二个存储过程调用结果</h1><br>");
            out.println(
"This student's name is " + name
                    
+ " and age is " + age+"<br>");
            
// 调用函数
            cs 
= con.prepareCall(callSQL3);
            cs.setString(
2"小罗");
            cs.registerOutParameter(
1, Types.INTEGER);
            cs.execute();
            age 
= cs.getInt(1);
            out.println(
"<h1>函数调用结果</h1><br>");
            out.println(
"This student's name is " + age + ".<br>");
            cs.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                
// 用完后要关闭连接,释放资源
                
if (con != null)
                    con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
   
%>    
  
</body>
</html>

注意:在调用存储过程或函数需要使用返回参数时,须使用Call-ableStatement的registerOutParameter(序号,类型)对返回参数进行注册。其中序号是调用语句从左至右顺序号,且起始位置从1计数开始。


只有注册用户登录后才能发表评论。


网站导航: