JDBC

来源:互联网 发布:samba端口号 445 修改 编辑:程序博客网 时间:2024/05/01 11:32
 
JDBC
 
一、   JDBC简述
JDBC是面向对象的,基于Java的API,用于实现对数据库的访问,它由一组用Java语言编写的类和接口组成,目的在于为Java开发人员和数据库供应商提供可以遵循的标准。
 
JDBC接口分为两个层次,一个是面向程序开发人员的JDBC API,另一个是面向底层的JDBC Driver API。下图说明了JDBC与数据库的关系。 
 
 
 
 

从上图可以看出:
JDBC的上层是JDBC API,该层主要是面向应用程序开发者的,应用程序可以通过JDBC API向JDBC驱动程序管理器发送SQL语句请求;
 
下层是JDBC Driver API,该层是面向数据库底层开发人员的,该层负责上层管理器发送的SQL语句进行转化,开成可与数据交互的底层代码,具体的转化工作是由各数据库驱动程序来完成的。
 
 
 
 
JDBC的功能:
1 建立与数据库的连接
2 发送SQL语句
3 返回和处理数据库操作结果
 
 
二、SQL包简述
JDBC通过把特定数据库厂商专用的细节抽象出来而得到一组类和接口,然后将它放入java.sql包中,因而,就可供任何具有JDBC驱动程序的数据库使用,从而实现了大多数常用数据库访问功能的通用化。
JDBC主要类和接口
接 口
  
CallableStatement
此接口用于执行数据库中的存储过程
Connection
此接口用于数据库连接,并拥有创建SQL语句的方法,以完成常规的SQL操作,并为数据库事务处理提供提交和回滚的方法。
Driver
此接口代码JDBC驱动程序,每个驱动程序类都必须实现的接口。如微软的com.microsoft.sqlserver.jdbc.SQLServerDriver(sql2005)类就实现了此接口。
PreparedStatement
此接口用于执行预编译的SQL语句,可以提高数据库操作性能。因为数据库管理系统只需要预编译SQL语句一次,就可以多次执行。
ResultSet
通常由Statement和PreparedStatement中的executeQuery()方法执行select查询指令时得到的结果。
ResultSetMateData
此接口用于获取关于ResultSet对象中列的类型和属性信息。
Statement
此接口用于执行SQL语句并将数据检索到Result中。
类 名
  
DriverManager
此类用于负责加载、注册JDBC驱动程序,管理应用程序和已注册的驱动程序的连接。
Date
此类提供了将SQL日期格式转换成Java日期格式的各种方法。
 
接口与类的主要方法分列如下:
 
CallableStatement接口常用方法
int[] count = newint[3];
CallableStatement csmt=conn.prepareCall("{call proc_Sex(?,?,?,?)}");
              //注册OUT类型输出参数
              csmt.registerOutParameter(1,Types.INTEGER);//男生总人数 输出参数
              csmt.registerOutParameter(2, Types.INTEGER);//女生总人数 输出参数
              csmt.registerOutParameter(3, Types.INTEGER);//男女生总人数 输出参数
              csmt.setString(4, stuSex);//设置存储过程输入参数
              csmt.execute();
              //得到输出参数的值
             
              count[0] =csmt.getInt(1);
              count[1]=csmt.getInt(2);
              count[2]=csmt.getInt(3);
void registerOutParameter(int parameterIndex, int sqlType)
注册OUT输出参数,索引从1开始!
XXX getXXX(int parameterIndex)
执行存储过程后,获取输出参数值,索引值对应注册参数中的索引值.
void setXXX(int parameterIndex)
设置输入参数,parameterIndex对应call中的?
 
 
 
Connection接口常用方法
Statement createStatement()
创建并返回一个Statement对象
void close()
用于关闭数据库连接
void commit()
用于提交事务
boolean isClosed()
用于判断是否已关闭连接
void rollback()
用于回滚事务
PreparedStatement
PreparedStatement(String sql)
返回一个PreparedStatement对象,并把SQL语句提交到数据库进行预编译.
CallableStatement
CallableStatement(String sql)
返回一个CallableStatement对象,此对象用来处理存储过程.
CallableStatement prepareCall(String sql)
 创建一个CallableStatement对象来调用数据库存储过程。
 
 
 
PreparedStatement接口常用方法
ResultSet executeQuery()
用于执行select指令并返回结果集
int executeUpdate()
用于执行更新数据库的SQL指令,如insert delete update等
ResultSetMetaData getMetaData()
返回集果集ResultSet对象的有关字段的信息
void setBoolean(int i,boolean x)
给第i个参数设置类型为boolean的值x
void setByte(int i,byte x)
给第i个参数设置类型为byte的值x
void setDate(int i,Date x)
给第i个参数设置类型为Date的值x
void setDouble(int i,double x)
给第i个参数设置类型为double的值x
void setFloat(int i,float x)
给第i个参数设置类型为float的值x
void setInt(int i,int x)
给第i个参数设置类型为int的值x
void setLong(int i,long x)
给第i个参数设置类型为long的值x
void setObject(int i,Object x)
给第i个参数设置类型为Object的值x
void setString(int i,String x)
给第i个参数设置类型为String的值x
void setTime(int i,Time x)
给第i个参数设置类型为Time的值x
 
 
 
ResultSet接口常用方法
Boolean absolute(int row)
将记录指针移到第row条记录,row=1表示第一行,row=-1表示最后一行
void afterLast()
将记录指针移到最后一行的后面.
void beforeFirst()
将记录指针移到第一行的前面
void cancelRowUpdate()
取消对结果集中当前行的更新
void deleteRow()
删除当前行
boolean first()
将记录指针移到第一行
boolean last()
将记录指针移到最后一行
boolean next()
将记录指针移到下一行
boolean previous()
将记录指针移到上一行
boolean isFirst()
判断记录指针是否在第一行
boolean isLast()
判断记录指针是否在最后一行
boolean isAfterLast()
判断记录指针是否在最后一行之后
boolean isBeforeFirst()
判断记录指针是否在第一行之前
void moveToInsertRow()
将记录指针移动到插入行,并记录移动前的行号
void moveToCurrentRow()
将记录指针移动到前面记载下来的行
void insertRow()
向数据库中插入一条记录
void updateRow()
用当前行的内容更新数据库
boolean getBoolean(int x)
返回当前行第x列的值,类型为boolean
double getDouble(int x)
返回当前行第x列的值,类型为double
float getFloat(int x)
返回当前行第x列的值,类型为float
int getInt(int x)
返回当前行第x列的值,类型为int
long getLong(int x)
返回当前行第x列的值,类型为long
Object getObject(int x)
返回当前行第x列的值,类型为Object
String getStrng(int x)
返回当前行第x列的值,类型为String
ResultSetMetaData getMetaData()
返回结果集相关字段的信息
void updateBoolean(int I,boolean x)
更新第i列的值为x
void updateInt(int i, int x)
更新第i列的值为x
void updateString(int i,String x)
更新第i列的值为x
void updateDouble(int i,double x)
更新第i列的值为x
 
 
 
ResultSetMateData接口常用方法
int getColumnCount()
返回此ResultSet对象中的列数。
String getColumnName(int column)
获取指定列的名称。
 
 
 
Statement接口常用方法
void close()
用于立即释放与一个Statement对象相关联的所有资源
ResultSet executeQuery(String sql)
用于执行select语句,并将结果集返回到ResultSet对象中.
int executeUpdate(String sql)
用于执行修改数据库的指令,:insert delete update.并返回指令所影响的记录条数.
 
 
 
DriverManager类常用(静态)方法
static Connection
getConnection(String url)
用于建立对数据库的连接.其中url格式为:jdbc:sqlserver://localhost:1433;DatabaseName=stuDB;userName=sa;passWord=sa
static Connection
getConnection(String url,
String user,String password)
 
static Driver getDriver(String url)
用于返回能够打开url所指定的数据库的驱动程序

 

 

 
JSP中对存储过程的调用方法综合示例
 
 
JSP如何实现对存储过程的调用:
 A:不带输出参数的
   ---------------不带输出参数的----------------------------------
create procedure getsum
@n int =0<--此处为参数-->
as
declare @sum int<--定义变量-->
declare @i int
set @sum=0
set @i=0
while @i<=@n begin
set @sum=@sum+@i
set @i=@i+1
end
print 'the sum is '+ltrim(rtrim(str(@sum)))
 
 
--------------在SQL中执行:--------------------
 exec getsum 100
 
 
------------在JSP中调用:---------------------
 JSP可以调用 但是在JSP程序却不能去显示该存储过程的结果因为上面的存储
 过程的参数类型int 传递方式是in(按值)方式
 import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
        //创建存储过程的对象
        CallableStatement c=conn.prepareCall("{call getsum(?)}");
       
        //给存储过程的参数设置值
        c.setInt(1,100); //将第一个参数的值设置成100
       
        //执行存储过程
        c.execute();
        conn.close();
}
}
  
 B:带输出参数的
    1:返回int
        -------------------------带输出参数的----------------
alter procedure getsum
@n int =0,
@result int output
as
declare @sum int
declare @i int
set @sum=0
set @i=0
while @i<=@n begin
set @sum=@sum+@i
set @i=@i+1
end
set @result=@sum
   -------------------在查询分析器中执行------------
 declare @myResult int
exec getsum 100,@myResult output
print @myResult
 
 
 
   ------------在JSP中调用---------------------
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
        //创建存储过程的对象
        CallableStatement c=conn.prepareCall("{call getsum(?,?)}");
       
        //给存储过程的第一个参数设置值
        c.setInt(1,100);
       
        //注册存储过程的第二个参数
        c.registerOutParameter(2,JSP.sql.Types.INTEGER);
       
        //执行存储过程
        c.execute();
       
        //得到存储过程的输出参数值
        System.out.println (c.getInt(2));
        conn.close();
}
}
    2:返回varchar
      ----------------存储过程带游标----------------
---在存储过程中带游标   使用游标不停的遍历orderid
create procedure CursorIntoProcedure
@pname varchar(8000) output
as
--定义游标
declare cur cursor for select orderid from orders
--定义一个变量来接收游标的值
declare @v varchar(5)
--打开游标
open cur
set @pname=''--给@pname初值
--提取游标的值
fetch next from cur into @v
while @@fetch_status=0
 begin
 
 
set @pname=@pname+';'+@v
 fetch next from cur into @v
end
print @pname
--关闭游标
close cur
--销毁游标
deallocate cur
 
 
 
 ------------执行存储过程--------------
exec CursorIntoProcedure ''
 
 
 --------------JSP调用------------------
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 CallableStatement c=conn.prepareCall("{call CursorIntoProcedure(?)}");
 
 
 c.registerOutParameter(1,JSP.sql.Types.VARCHAR);
 
 c.execute();
 
 System.out.println (c.getString(1));
 conn.close();
}
}
 C:删除数据的存储过程
     ------------------存储过程--------------------------
 
 
drop table 学生基本信息表
create table 学生基本信息表
(
StuID int primary key,
StuName varchar(10),
StuAddress varchar(20)
)
insert into 学生基本信息表 values(1,'三毛','wuhan')
insert into 学生基本信息表 values(2,'三毛','wuhan')
create table 学生成绩表
(
StuID int,
Chinese int,
PyhSics int
foreign key(StuID) references 学生基本信息表(StuID)
on delete cascade
on update cascade
)
insert into 学生成绩表 values(1,99,100)
insert into 学生成绩表 values(2,99,100)
 
 
--创建存储过程
create procedure delePro
@StuID int
as
delete from 学生基本信息表 where StuID=@StuID
--创建完毕
exec delePro 1 --执行存储过程
--创建存储过程
create procedure selePro
as
select * from 学生基本信息表
--创建完毕
exec selePro   --执行存储过程
     ------------------在JSP中调用----------------
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
        //创建存储过程的对象
        CallableStatement c=conn.prepareCall("{call delePro(?)}");
       
        c.setInt(1,1);
       
        c.execute();
       
        c=conn.prepareCall("{call selePro}");
        ResultSet rs=c.executeQuery();
       
        while(rs.next())
        {
         String Stu=rs.getString("StuID");
         String name=rs.getString("StuName");
         String add=rs.getString("StuAddress");
        
         System.out.println ("学号:"+"    "+"姓名:"+"    "+"地址");
         System.out.println (Stu+"    "+name+"   "+add);
        }
        c.close();
}
}
 D:修改数据的存储过程
---------------------创建存储过程---------------------
 create procedure ModPro
@StuID int,
@StuName varchar(10)
as
update 学生基本信息表 set StuName=@StuName where StuID=@StuID
 
 
 
 -------------执行存储过程-------------------------
exec ModPro 2,'四毛'
 ---------------JSP调用存储过程--------------------
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
        //创建存储过程的对象
        CallableStatement c=conn.prepareCall("{call ModPro(?,?)}");
       
        c.setInt(1,2);
        c.setString(2,"美女");
               
        c.execute();
       
        c=conn.prepareCall("{call selePro}");
        ResultSet rs=c.executeQuery();
       
        while(rs.next())
        {
         String Stu=rs.getString("StuID");
         String name=rs.getString("StuName");
         String add=rs.getString("StuAddress");
        
         System.out.println ("学号:"+"    "+"姓名:"+"    "+"地址");
         System.out.println (Stu+"    "+name+"   "+add);
        }
        c.close();
}
}
 E:查询数据的存储过程(模糊查询)
     -----------------存储过程---------------------
create procedure FindCusts
@cust varchar(10)
as
select customerid from orders where customerid
like '%'+@cust+'%'
    ---------------执行---------------------------
execute FindCusts 'alfki'
   -------------在JSP中调用--------------------------
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
        //创建存储过程的对象
        CallableStatement c=conn.prepareCall("{call FindCusts(?)}");
        c.setString(1,"Tom");
       
        ResultSet rs=c.executeQuery();
       
        while(rs.next())
        {
         String cust=rs.getString("customerid");       
         System.out.println (cust);
        }
        c.close();
}
}
 F:增加数据的存储过程
 
 
------------存储过程--------------------
create procedure InsertPro
@StuID int,
@StuName varchar(10),
@StuAddress varchar(20)
as
insert into 学生基本信息表 values(@StuID,@StuName,@StuAddress)
 
 
-----------调用存储过程---------------
exec InsertPro 5,'555','555'
-----------在JSP中执行-------------
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
        //创建存储过程的对象
        CallableStatement c=conn.prepareCall("{call InsertPro(?,?,?)}");
        c.setInt(1,6);
        c.setString(2,"Liu");
        c.setString(3,"wuhan");
       
        c.execute();
       
        c=conn.prepareCall("{call selePro}");
        ResultSet rs=c.executeQuery();
       
        while(rs.next())
        {
         String stuid=rs.getString("StuID");       
         String name=rs.getString("StuName");       
         String address=rs.getString("StuAddress");       
         System.out.println (stuid+"   "+name+"   "+address);
        }
        c.close();
}
}
 
 
G:在JSP中创建存储过程 并且在JSP中直接调用
import java.sql.*;
publicclass ProcedureTest
{
publicstaticvoid main(String args[]) throws Exception
{
 //加载驱动
 DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
 //获得连接
 Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
 
 
 Statement stmt=conn.createStatement();
 //在JSP中创建存储过程
 stmt.executeUpdate("create procedure OOP as select * from 学生成绩表");
 
 
 CallableStatement c=conn.prepareCall("{call OOP}");
 
 ResultSet rs=c.executeQuery();
 while(rs.next())
 {
   String chinese=rs.getString("Chinese");
  
   System.out.println (chinese);
 }
 conn.close();
 
}
}
 

 

原创粉丝点击