JDBC
(Java Database Connectivity)
一、概述:
JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实行者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API为Java开发者使用数据库提供了统一的编程接口,它由一组Java 类和接口组成,使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。
1.在JDBC中包括了两个包:java.sql和javax.sql。
①java.sql基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连
接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,
比如批处理更新、事务隔离和可滚动结果集等。
②javax.sql扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、
分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分
布式事务和行集等。
主要对象和接口:
注:除了标出的Class,其它均为接口。
驱动程序按照工作方式分为四类:(了解)
1、JDBC-ODBC bridge +ODBC 驱动
JDBC-ODBC bridge 桥驱动将JDBC 调用翻译成ODBC 调用,再由ODBC 驱动翻译成访问数据库命令。
优点:可以利用现存的ODBC 数据源来访问数据库。
缺点:从效率和安全性的角度来说比较差。不适合用于实际项目。
2、基于本地API 的部分Java 驱动
我们应用程序通过本地协议跟数据库打交道。然后将数据库执行的结果通过驱动程序中的Java 部分返回给客户端程序。
优点:效率较高;
缺点:安全性较差。
3、纯Java 的中间服务器驱动
缺点:两段通信,效率比较差
优点:安全性较好
4、纯Java 本地协议:通过本地协议用纯Java 直接访问数据库。
特点:效率高,安全性好。
对象和接口关系图:
(中间协议)(本地协议)JVM
注册驱动程序有三种方式:方式一:class.forName(class.forName(““oracle.jdbc.driver.OracleDriver oracle.jdbc.driver.OracleDriver”
”);Java 规范中明确规定:所有的驱动程序必须在静态初始化代码块中将驱动注册到驱动程序管理器中。
方式二:Driver drv =new oracle.jdbc.dirver.OracleDriver();
//针对没有隐式注册时采用
方式三:编译时在虚拟机中加载驱动
java –Djdbc.dirvers=驱动全名类名
例:java –Djdbc.drivers=oracle.jdbc.driver.OracleDriver Lab1
使用系统属性名,加载驱动;-D 表示为系统属性赋值。附:mysql 的Driver 的全名sql.jdbc.Driver
SQLServer 的Driver 的全名com.microsoft.jdbc.sqlserver.SQLServerDriver
②建立连接Connection(“jdbc :Connection 连接是通过DriverManager 的静态方法getConnection(....)来得到的,这个方法的实质是把参数传到实际的Driver 中的connect()方法中来获得数据库连接的。
Oracle URL 的格式:
jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXX (IP 地址及端口号):XXXXXXX (所使用的库名)
MySql URL 的写法
例:jdbc:mysql://192.168.8.21:3306/test SQLServer URL 的写法例:jdbc:microsoft:sqlserver://192.168.8.21:1433
③获得一个Statement 对象stm =ateStatement()ateStatement();
;④通过Statement 执行SQL 语句
//返回一个查询结果集uteUpdate(String sql);
//返回值为int 型,表示影响记录的条数。ute(String sql);//返回true ,表示查询;返回false ,表示其它操作。将sql 语句通过连接发送到数据库中执行,以实现对数据库的操作。
⑤处理结果集
使用Connection对象获得一个Statement,Statement中的executeQuery(String sql)方法可以使用select语句查询,并且返回一个结果集ResultSet,通过遍历这个结果集,可以获得select语句的查寻结果,ResultSet的next()方法会操作一个游标从第一条记录的前面开始读取,直到最后一条记录。executeUpdate(String sql)方法用于执行DDL和DML语句,主要还是DML,包括insert,delete,update操作。
只有执行select语句才有结果集返回。
例:Statement ateStatement();//创建Statement
test””+”’”
”’”++”test
”’”++”)”;
String sql=
sql=””insert into test(id,name)values(1,
values(1,””+”’”
test””;
sql=””select*from test
String sql=
ResultSet uteQuery(String sql);//执行Sql语句,执行select语句后有结果集
//遍历处理结果集信息Array ()){
System.out.Int(
System.out.Int(““id id””));
name””))
System.out.String(
System.out.String(““name
} Array
⑥关闭数据库连接(释放资源)调用.close()
rs.close();stm.close();
ResultSet Statement Connection是依次依赖的。
注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接时才可以使用的,所以在使用结束之后有可能其它的Statement还需要连接,所以不能先关闭Connection。
图形演绎编写JDBC程序的一般过程:
三、几个重要接口:
(1)Statement——SQL语句执行接口
Statement接口代表了一个数据库的状态,在向数据库发送相应的SQL语句时,都需要创建Statement接口或者PreparedStatement接口。在具体应用中,Statement主要用于操作不带参数(可以直接运行)的SQL语句,比如删除语句、添加或更新。
Stagement    a.某些情况下,效率不高;
b.语法结构不够清晰,造成对类型的支持不太好;
(2)PreparedStatement——预编译的Statement(重点)
Step1:通过连接获得PreparedStatement对象,用带占位符(?)的sql语句构造。
PreparedStatement pstm=con.prepareStatement(
id=??”);
con.prepareStatement(““select*from test where id=
Step2:设置参数
08868””);
P stm.setString(1,“08868
Step3:执行sql语句
uteQuery();
Statemnet发送完整的SQL语句到数据库不是直接执行而是由数据库先编译,再运行。而PreparedStatement是先发送带参数的SQL语句,再发送一组参数值。如果是同构的SQL 语句,PreparedStatement的效率要比Statement高。而对于异构的SQL则两者效率差不多。同构:两个SQL语句可编译部分是相同的,只有参数值不同。
异构:整个SQL语句的格式是不同的。
注意点:①使用预编译的Statement编译多条SQL语句一次执行
②可以跨数据库使用,编写通用程序
③能用预编译时尽量用预编译
PreparedStatement也执行相应的SQL语句。它继承于Statement接口,除了具备Statement 所有功能,还可以对SQL语句进行预处理。防止SQL注入(SQL Injection)。
主要方法:
mysql中delete语句
①ResultSet executeQuery()throws SQLException
在此PreparedStatement对象中执行SQL查询,并返回该查询生成的ResultSet对象。从不返回null;如果发生数据库访问错误或者SQL语句没有返回ResultSet对象则抛出SQLException异常。
②int executeUpdate()throws SQLException
在此PreparedStatement对象中执行SQL语句,该语句必须是一个SQL INSERT、UPDATE或DELETE语句;或者是一个什么都不返回的SQL语句,比如DDL语句。
返回值int表示影响的记录条数,一条都没有则返回0;
③boolean execute()throws SQLException

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。