JDBC学习笔记.docx
《JDBC学习笔记.docx》由会员分享,可在线阅读,更多相关《JDBC学习笔记.docx(19页珍藏版)》请在冰点文库上搜索。
JDBC学习笔记
JDBC学习笔记
(我们所学习的均为jdbc2.0规范,jdbc1.0为直接连接,而jdbc2.0它有JNDI服务,在服务器启动时自动创建一个连接池,定义了一个DataSource接口,用其标准才能使用JDBC连接池)
一、关于JDBC
1.连接到数据库的方法
答:
1)ODBC(OpenDatabaseConnectivity)
一个以C语言为基础访问SQL为基础数据库引擎的接口,它提供了一致的接口用于和数据库沟通以及访问数据。
2)JDBC
Java版本的ODBC
2.JDBC应用编程接口
答:
JDBC应用编程接口是:
1)标准的数据访问接口,可以连到不同的数据库;
2)JAVA编程语言的一组类和接口。
JDBC应用编程接口能够:
1)连接到数据库;
2)发SQL查询字符串到数据库;
3)处理结果。
JDBC应用编程接口有二个主要的部分:
1)JAVA应用程序开发接口面向JAVA应用程序开发者;
2)JDBC驱动程序开发接口。
3.JDBCDriver
答:
1)一大堆实现了JDBC类和接口的类;
2)提供了一个实现java.sql.Driver接口的类。
4.JDBCDriver的四种类型
答:
1)JDBC-ODBC桥
由ODBC驱动提供JDBC访问,JDBCZ转换为ODBC。
2)NativeBridge
Java对数据库的访问转化为数据库客户端对数据库的访问,所以需要安装数据库客户端(API)。
3)JDBC-net
直接发送到数据库被数据库监听。
纯的Javadriver,将JDBC调用转入DBMS,与网络协议无关。
然后通过服务器将调用转为DBMS协议。
4)本地协议
纯的javadriver,将JDBC调用直接转为DBMS使用的网络协议
5.JDBC开发者接口
答:
1)java.sql--java2平台下JDBC的主要功能,标准版(J2SE)
2)javax.sql--java2平台下JDBC增强功能,企业版(J2EE)
6.使用URL确认数据库
答:
我们使用URL来确定一个数据库(正确的Driver,正确的主机,正确的协议,正确的协议,正确的用户名和密码);
语法:
protocol:
subprotocol:
subname
范例:
jdbc:
db2:
MyTest
jdbc:
db2:
//localhost:
6789/MyTest
-------------------------------oracle--------------------------------
驱动:
oracle.jdbc.driver.OracleDriver
URL:
jdbc:
oracle:
thin:
@<:
port>:
dbname
注:
machine_name:
数据库所在的机器的名称;(或IP)
port:
端口号,默认是1521
-------------------------------mysql--------------------------------
驱动:
org.gjt.mm.mysql.Driver
URL:
jdbc:
mysql:
//<:
port>/dbname
注:
machine_name:
数据库所在的机器的名称;(或IP)
port:
端口号,默认3306
----------------------------pointbase---------------------------------
驱动:
com.pointbase.jdbc.jdbcUniversalDriver
URL:
jdbc:
pointbase:
server:
//<:
port>/dbname
注:
machine_name:
数据库所在的机器的名称;(或IP)
port:
端口号,默认是9092
---------------------------SQLServer---------------------------------
驱动:
com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:
jdbc:
microsoft:
sqlserver:
//<:
port>;DatabaseName=
注:
machine_name:
数据库所在的机器的名称;(或IP)
port:
端口号,默认是1433
--------------------------DB2---------------------------------------------
驱动:
com.ibm.db2.jdbc.app.DB2Driver
URL:
jdbc:
db2:
//<:
port>/dbname
注:
machine_name:
数据库所在的机器的名称;(或IP)
port:
端口号,默认是5000
7.javax.sql包JDBC2.0的增强功能
1)数据源接口;
2)连接池;
3)分布式交易;
4)行集;
二、基本的JDBC应用
1、创建一个基本的JDBC应用
答:
1)步骤一:
注册一个driver;
1driver被用于连接到数据库;
2JDBC应用编程接口使用第一个能成功连接到给定URL的driver;
3在同一时间可以转载多个driver
注册一个driver的方法:
1使用类loader(装载;实例化;注册入DriverManager)
Class.forName(“oracle.jdbc.driver.OracleDriver”);
a.Class.forName(“Com.ibm.db2.jdbc.app.DB2Driver”);
b.Class.forName(“C.DB2Driver”);
c.Class.forName(“Com.microsoft.jdbc.sqlServer.SQLServerDriver”);
d.Class.forName(“oracle.jdbc.driver.OracleDriver”);
e.Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
②实例化一个Driver
a.Driverdrv=newCOM.cloudscape.core.RmiJdbcDriver();
2)步骤二:
建立一个到是数据库的连接;
第一个方法:
DriverManager调用getConnection(urlString)方法,实际上调用的是driver的connect(urlString)方法;
Connectioncon=DriverManager.getConnection
(“jdbc:
oracle:
thin:
@192.168.1.100:
1521:
tarenadb”,”tarenadb”,”tarenadb”);
①当一个driver肯定地对应到一个数据库URL,DriverManager建立一个连接;
2当没有driver匹配,返回null然后下一个driver被校验;
3假如没有建立连接,抛出一个SQLException异常
第二种方法:
调用driver的connect方法。
1创建一个到指定Driver实例的直接调用;
2避免一般访问的问题
Driverdrv=newCOM.ibm.db2.jdbc.app.DB2Driver();
//Driverdrv=neworacle.jdbc.dri;
Connectioncon=null;
try{com=drv.connect(“jdbc:
db2:
MyTest”,newProperties())}
catch(SQLExceptione){}
3)步骤三:
创建一个statement;
①Statement的三个接口:
a.Statement;
b.PrepareStatement(继承自Statement);
c.CallableStatement(继承自PrepareStatement)
2使用方法connection.createStatement()得到一个Statement对象
PreparedStatement对象
1调用ProparedStatement比statement更高效;
2继承自Statement;
3语法PrepareStatementpstm=connection.prepareStatement(sqlString);
CallableStatement对象
1通过CallableStatement调用数据库中的存储过程;
2继承自PreparedStatement;
3CallableStatementcstm=connection.prepareCall(“{callreturn_student[?
?
]}”);
cstm.setString(1,”8623034”);
cstm.registerOutparameter(2,Types.REAL);
cstm.execute();
floatgpa=cstm.getFloat
(2);
#Statement接口的比较
答:
|Statement|PreparedStatement|CallableStatement
------------------------------------------------------------------------------
写代码位置|客户端|客户端|服务器端
------------------------------------------------------------------------------
写代码位置|客户端|服务器端|服务器端
------------------------------------------------------------------------------
编写代码技术|Java,SQL操作|Java,SQL操作|数据库的程序语言,如PL/SQL
------------------------------------------------------------------------------
可配置性|高|第一次高,以后低|低
------------------------------------------------------------------------------
可移植性|高|假设支持PreparedStatement的话高
------------------------------------------------------------------------------
传输效率|低|第一次低,以后高|高
4)步骤四:
执行SQL语句:
通过接口方法将SQL语句传输至黙认的数据库连接,返回结果可能是一个数据表,可以通过java.sql.ResultSet访问。
①Statement的接口方法:
a.executeQuery(sqlString):
执行给定的SQL声明,返回一个结果集(ResultSet)对象;
b.executeUpdate(sqlString):
执行给定的SQL声明,可以是INSERT、UPDATE或DELETE声明,也可以是SQLDDL声明;
c.execute(sqlString):
执行给定的SQL声明。
5)步骤五:
处理结果:
①使用结果集(ResultSet)对象的访问方法获取数据;
a.next():
下一个记录
b.first():
第一个记录
c.last():
最后一个记录
d.previous():
上一个记录
while(rs.next()){
System.out.print(“name:
”+rs.getString
(1));
System.out.print(“\tgender:
”+rs.getString
(2));
System.out.print(“\tage:
”+rs.getInt(3));
System.out.print(“\tgpa:
”+rs.getFloat(4));
}
②通过字段名或索引取得数据,rs.getString(列名)或者rs.getString(列名数字)。
③结果集保持了一个指向了当前行的指针,初始化位置为第一个记录前。
6)步骤六:
关闭JDBC对象
①首先关闭记录集;
②其次关闭声明;
③最后关闭连接对象。
最经典的关闭这三个对象的程序是:
publicvoidclose(ResultSetrs,Statementstm,Connectioncon)
{if(rs!
=null){try{rs.close();}catch(Exceptionme)}}
{if(stm!
=null){try{stm.close();}catch(Exceptionme)}}
{if(con!
=null){try{con.close();}catch(Exceptionme)}}
2.经常使用的一些JDBCURL
答:
1)JDBC-ODBC:
jdbc:
odbc:
2)Oracle:
jdbc:
oracle:
oci:
@orjdbc:
oracle:
thin:
@
3)WeblogicMS-SQL:
jdbc:
weblogic:
mssqlserver4:
@:
4)DB2:
jdbc:
db2:
MyTestorjdbc.db2:
//localhost:
6789/MyTest(需要用户名和密码)
3.Statement的类型:
答:
1)Statement接口:
用来封装任意一条SQL语句,但仅仅限于静态的SQL命令。
a.得到一个Statement:
Statementstm=con.createStatement();
Statementstm=con.createStatement(intresultSetType,intresultSetConcurrency);//生成一个指定的结果集类型的Statement
其中第一个参数:
resultSetType可指定为下列三种形式之一:
ResultSet.TYPE_FORWARD_ONLY//不可回卷,只能依次从前往后读。
ResultSet.TYPE_SCROLL_INSENSITIVE//可回卷,但对底层数据库的修改不敏感。
ResultSet.TYTP_SCROLL_SENSITIVE//可回卷,并且对底层数据库的修改不敏感
其中第二个参数:
resultSetConcurrency可指定为下列两种形式之一:
ResultSet.CONCUT_READ_ONLY//结果集只读,不可更新
ResultSet.CONCUT_UPDATABLE//结果集可更新
b.得到执行结果:
ResultSetrs=stm.executeQuery(“selectname,gender,age,gpafromstudent0506”);(返回结果集)
intI=stm.executeUpdate(“insertintostudent0506values(\”tony\”,\”male\”,20,89)”);(返回改变的行数)
Booleanb=stm.execute(“droptablesudent0506”);(返回是否执行成功)
2)PreparedStatement接口,Statement的子接口:
用来封装一条带参数的SQL语句,可以用来代替参数。
a.得到一个PreparedStatement:
PreparedStatementpstm=con.prepareStatement(“insertintostudent0506valuse(?
?
?
?
)”);
Con.prepareStatement()方法同样可以在后面给2个表示结果集类型的参数,设置与上相同。
b.设置SQL语句中的参数,并执行SQL语句:
pstm.setString(1,”tony”);
pstm.setString(2,”male”);
pstm.setInt(3,20);
pstm.setFloat(4,89.5f);
pstm.excuteUpdate();
3)CallableStatement,接口,PreparedStatement的子接口,用来封装被数据库支持的非SQL语句,常常用来执行SQL存储过程(一系列的SQL命令组成的集合,用来完成一系列的工作)。
a.得到一个CallableStatement:
CallableStatementcs=con.prepareCall(Stringsql);
如果sql带参数,就在新建时传给它,不带参数?
可用代替。
例如:
CallableStatementcstm=con.prepareCall(“{Callreturn_student}”);
cstm.setString(1,”8613034”);
cstm.registerOutParament(2,Types.REAL);
cstm.execute();
floatgpa=cstm.getFloat
(2);
return_student(Stringstr,floatgpa){selectgpafromStudentwhereid=str}
4.Statement接口的比较
Statement
PreparedStatement
CallableStatement
写代码位置
客户端
客户端
服务器端(数据库端生成)
存代码位置
客户端
服务器端
服务器端(在服务器端转化)
编写代码技术
Java,SQL操作
Java,SQL操作
数据库的程序语言,如PL/SQL
可配置性
高
第一次高,以后低
低
可移植性
高
假设支持PreparedStatement的话高
传输效率
低
第一次低,以后高
高
5.数据表和类对应的三种关系:
答:
1)一个表对应一个类;
2)一个表对应相关类;
3)一个表对应整个类关系层
6.类间关系的几种表设计:
答:
1)为每个类创建一个表:
最接近面向对象的思想,且能支持多态,且维护容易,但是这需要很多时间去维护很多表,花更多的时间去读写这个表,直接从一个表来得到一个记录比较困难。
2)为每个实体类创建一个表(抽象类则不):
比较容易得到一个记录,但是如果你改动了一个类,则必须改变这个表和这个类的子类的表。
3)为一张完整的类的层次结构建一张表。
支持多态,且维护简单,比较容易直接从一个表来得到一个记录,但是任何一个类的修改都会影响该表,且这个表会异常庞大等。
7.SQL数据类型及其相应的Java数据类型
答:
SQL数据类型Java数据类型说明
-------------------------------------------------------------------------------
INTEGER或者INTint通常是个32位整数
SMALLINTshort通常是个16位整数
NUMBER(m,n)DECIMAL(m,n)Java.sql.Numeric合计位数是m的定点十进制数,小数后面有n位数
DEC(m,n)Java.sql.Numeric合计位数是m的定点十进制数,小数后面有n位数
FLOAT(n)double运算精度为n位二进制数的浮点数
REALfloat通常是32位浮点数
DOUBLEdouble通常是64位浮点数
CHARACTER(n)或CHAR(n)String长度为n的固定长度字符串
VARCHAR(n)String最大长度为n的可变长度字符串
BOOLEANboolean布尔值
DATEJava.sql.Date根据具体设备而实现的日历日期
TIMEJava.sql.Time根据具体设备而实现的时戳
TIMESTAMPJava.sql.Timestamp根据具体设备而实现的当日日期和时间
BLOBJava.sql.Blob二进制大型对象
CLOBJava.sql.Clob字符大型对象
ARRAYJava.sql.Array
三.JDBC的高级特性
1.元数据
答:
关于数据的信息,例如类型或者容量。
通过JDBCAPI可以访问:
1)数据库元数据;
a.使用connection.getMetadata方法得到DataMetaData对象,从而获取关于数据库的信息。
b.能够使用DataMetaData.isReadOnly()此类方法获取关于数据库信息。
2)结果集元数据;
a.使用ResultSet.getMetadata方法返回ResultSetMetaData对象
b.能够使用getColumnCount此类方法获取信息
2.数据库的事务处理ppt52
答:
1)一系列的动作作为一个不可分的操作;
2)JDBCAPI中使用事务处理步骤:
a.设置是否需要系统自动提交事务,如果不需要则用false作为参数调用Connection.setAutoCommit()方法;
b.执行一或多个关于数据库的操作;
c.调用Cmit方法完成改变;
d.恢复上次提交后的改变,调用Connection.rollback()方法,则从上一次提交开始回滚。
例子如下:
try
{
con.setAutoCommit(false);
Statementstm=con.createStatement();
stm.executeUpdate("insertintostudent(name,age,gpa)values('gzhu',30,4.8)");
mit();
}
catch(SQLExceptione)
{
try
{
con.rollback();
}
catch(Exceptione){}
}
3.数据库的并发控制ppt54
答:
1)设置隔离级