Java Web之第9章JDBC

JDBC:用于访问数据库的标准Java类库

9.1 什么是JDBC

JDBC:Java数据库连接,它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型的数据库,并使用SQL语句来完成对数据库中数据的查询,更新,新增和删除操作

不同种类的数据库(如MySQL,Oracle等)在其内部处理数据的方式是不同的。如果直接使用数据库厂商提供的访问接口操作数据库,应用程序的可移植性就会变得很差。例如用户当前在程序中使用的是MySQL提供的接口操作数据库,如果换成Oracle数据库,则需要重新使用Oracle数据库提供的接口,这样代码的改动量会很大。有了JDBC后,这种情况不复存在了,因为它要求各个数据库厂商按照统一的规范来提供数据库驱动,而在程序中是由JDBC和具体的数据库驱动联系,所有用户就不必直接与底层的数据库交互,这使得代码性更强

JDBC在应用程序与数据库直接起到一个桥梁的作用。当应用程序使用JDBC访问特定的数据库时,需要通过不同数据库驱动与不同的数据库进行连接,连接后即可对该数据库进行相应的操作

9.2 JDBC常用的API

JDBC API:主要位于java.sql包中,该包定义了一系列访问数据库的接口和类

9.2.1 Driver接口

Driver接口:是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用

注意在编写JDBC程序时,必须要把所使用的数据库驱动程序或类库加载到项目的classpath中(这里指MySQL驱动JAR包)

9.2.2 DriverManager类

DriverManager类:用于加载JDBC驱动并且创建于数据库的连接

在DriverManager类中,定义了两个比较重要的静态方法,具体如下:

方法名称功能描述
registerDriver(Driver driver)该方法用于向DriverMangager中注册给定的JDBC驱动程序
getConnection(String url,String user,String pwd)该方法用于建立和数据库的连接,并返回表示连接的Connection对象

9.2.3 Connection接口

Connection接口:代表Java程序和数据库的连接,只有获得该连接对象后才能访问数据库,并操作数据库

在Connection接口中,定义了一系列方法,具体如下:

方法名称功能描述
getMetaData()该方法用于返回表示数据库的元数据的DatabaseMetaData对象
createStatement()用于创建一个Statement对象并将SQL语句发送到数据库
prepareStatement(String sql)用于创建一个prepareStatement对象并将参数化的SQL语句发送到数据库
prepareCall(String sql)用于创建一个CallableStatement对象来调用数据库的存储过程

9.2.4 Statement接口

Statement接口:用于执行静态的SQL语句,并返回一个结果对象,该接口的对象通过Connection实例的createStatement()方法获得。利用该对象把静态的SQL语句发送到数据库编译执行,然后返回数据库的处理结果

在Statement接口中,提供了3个常用的执行SQL语句的方法,具体如下:

方法名称功能描述
execute(String sql)用于执行各种SQL语句,该方法返回一个boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可通过Statement的getResultSet()方法获得查询结果
executeUpdate(String sql)用于执行SQL中INSERT,UPDATE和DELETE语句。该方法返回一个int类型的值,表示数据库中受该SQL语句影响的记录条数
executeQuery用于执行SQL中的SELECT语句,该方法返回一个表示查询结果的ResultSet对象

9.2.5 PreparedStatement接口

PreparedStatement接口:是Statement的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用接口中的SQL语句可以使用占位符?来替代其参数,然后通过setXxx()方法为SQL语句的参数赋值

在PreparedStatement接口中,提供了一些常用方法,具体如下:

方法名称功能描述
executeUpdate()在此PreparedStatement对象中执行SQL语句,该语句必须是一个DML语句或者是无返回内容的SQL语句,比如DDL语句
executeQuery()在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象
setlnt(int parameterlndex,int x)将指定参数设置为给定的int值
setFloat(int parameterlndex,float x)将指定参数设置为给定的float值
setString(int parameterlndex,String x)将指定参数设置为给定的String值
setDate(int parameterlndex,Date x)将指定参数设置为给定的Date值
addBatch()将一组参数添加到此PreparedStatement对象的批处理命令中
setCharacterStream(int parameterlndex,java.io.Reader,int length)经指定的输入流写入数据库的文本字段
setBinaryStream(int parameterlndex,java.io.InputStream x,int length)将二进制的输入流数据写入到二进制字段中

注意setDate()方法可以设置日期内容,但参数Date的类型是java.sql.Date,而不是java.util.Date
在通过setXxx()方法为SQL语句中的参数赋值时,可以通过参数与SQL类型向匹配的方法(例如,如果参数类型为integer,那么应该使用setInt方法),也可以通过setObject()方法设置多种类型的输入参数

9.2.6 ResultSet接口

ResultSet接口:用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在ResultSet接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第1行之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false。在应用程序中经常使用next()方法作为WHILE循环的条件来迭代ResultSet结果集

ResultSet接口中常用方法如下:

方法名称功能描述
getString(int columnlndex)用于获取指定字段的String类型的值,参数columnindex代表字段的索引
getString(String columnName)用于获取指定字段的String类型的值,参数columnName代表字段的名称
getlnt(int columnlndex)用于获取指定字段的int类型的值,参数columnindex代表字段的索引
getlnt(String columnName)用于获取指定字段的int类型的值,参数columnName代表字段的名称
getDate(int columnlndex)用于获取指定字段的Date类型的值,参数columnindex代表字段的索引
getDate(String columnName)用于获取指定字段的Date类型的值,参数columniName代表字段的索引
next()将游标从当前位置向下移一行
absolute(int row)将游标从当前位置此ResultSet对象的指定行
afterLast()将游标从当前位置此ResultSet对象的末尾,即最后一行之后
beforeFirst()将游标从当前位置此ResultSet对象的开头,即第1行之后
previous()将游标从当前位置此ResultSet对象的上一行
last()将游标从当前位置此ResultSet对象的最后一行

注意字段的索引是从1开始编号的

9.3 实现第一个JDBC程序

JDBC的使用步骤如下:
(1)加载并注册数据库驱动

(2)通过DriverManager获取数据库连接

(3)通过Connection对象获取Statement对象

Connection创建Statement的方式有如下3种:

1.createStatement():创建基本的Statement对象

2.prepareStatement():创建prepareStatement对象

3.prepareCall():创建CallableStatement对象

(4)使用Statement执行SQL语句

Statement的3种执行SQL语句的方法:

1.execute():可以执行任何SQL语句

2.executeQuery():通常执行查询语句,执行后返回代表结果集的ResultSet对象

3.executeUpdate():主要用于执行DML和DDL语句。执行DML语句,如INSERT,UPDATE或DELETE时,返回受SQL语句影响的行数,执行DDL语句返回0

(5)操作ResulSet结果集

如果执行的SQL语句是查询语句,执行结果将返回一个ResultSet对象,该对象里保存了SQL语句查询的结果,程序可以通过操作该ResultSet对象来取出查询结果

(6)关闭连接,释放资源

每次操作数据库结束后都要关闭数据库连接,释放资源,包括关闭ResultSet,Statement和Connection等资源

9.4 PreparedStatement对象

SQL语句的执行是通过Statement对象实现的。Statement对象每次执行SQL语句时,都会对其进行编译。当相同的SQL语句执行多次时,Statement对象就会使数据库频繁编译相同的SQL语句,从而降低数据库的访问效率

为了解决上述问题,Statement提供了一个子类PreparedStatement。PreparedStatement对象可以对SQL语句进行预编译,预编译的信息会存储在PreparedStatement对象中。当相同的SQL语句再次执行时,程序会使用PreparedStatement对象中的数据,而不需要对SQL语句再次编译去查询数据库,这样就大大地提高了数据的访问效率

9.5 ResultSet对象

ResultSet:主要用于存储结果集,可以通过next()方法由前向后逐个获取结果集中的数据。如果想获取结果集中任意位置的数据,则需要在创建Statement对象时,设置两个ResultSet定义的常量,具体设置方式如下:

Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENITIVE,Statement.CONCUR_READ_ONLY);

ResultSet rs = st.excuteQuery(sql);

常量ResultSet.TYPE_SCROLL_INSENITIVE表示结果集可滚动,常量Statement.CONCUR_READ_ONLY表示以只读形式打开结果集


版权声明:本文为weixin_44516267原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。