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 =
new
int
[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
对象来调用数据库存储过程。
|
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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.*;
public
class
ProcedureTest
{
public
static
void
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();
}
}