JavaWeb的JDBC接口的使用

本文详细介绍了JavaWeb中JDBC接口的使用,包括JDBC的概念、常用API如Driver接口、DriverManager类、Connection接口、Statement接口和PreparedStatement对象,强调了PreparedStatement的参数化SQL查询和性能优势,以及ResultSet对象的类型和并发性。通过实例展示了JDBC在数据库操作中的应用,特别是PreparedStatement的高效和安全性。
摘要由CSDN通过智能技术生成

一、学习目标
1、什么是JDBC
2、JDBC常用的API
3、PreparedStatement对象
4、ResultSet对象
二、重点知识
1、什么是JDBC
JDBC的全称是Java数据库连接(Java Dalabase Connectivity),它是一套用于执行soL语句的Java API应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、更新、新增和删除的操作。JDBC用JAVA就能连接到数据库;创建SQL或者MYSQL语句;执行SQL或MYSQL的查询数据库;查看和修改结果记录。
不同种类的数据库(如MySQL、Oracle 等)在其内部处理数据的方式是不同的。如果直接使用数据库厂商提供的访问接口操作数据库,应用程序的可移植性就会变得很差。例如,用户当前在程序中使用的是MySQL提供的接口操作数据库,如果换成Oracle数据库,则需要重新使用Oracle数据库提供的接口,这样代码的改动量会非常大。有了JDBC后,这种情况就不复存在了,因为它要求各个数据库厂商按照统一的规范来提供数据库驱动,而在程序中是由JDBC 和具体的数据库驱动联系,所以用户就不必直接与底层的数据库交互,这使得代码的通用性更强。
在这里插入图片描述
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,本文中的代码都是针对MySQL数据库实现的。
1.1JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据。
执行流程:
连接数据源,如:数据库。
为数据库传递查询和更新指令。
处理数据库响应并返回的结果。
1)架构(分为双层架构和三层架构):
(1)双层
在这里插入图片描述

作用:此架构中,Java Applet 或应用直接访问数据源。
条件:要求 Driver 能与访问的数据库交互。
机制:用户命令传给数据库或其他数据源,随之结果被返回。
部署:数据源可以在另一台机器上,用户通过网络连接,称为 C/S配置(可以是内联网或互联网)。

2、JDBC常用的API
  1.Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。在编写JDBC程序时,必须要把制定数据库驱动程序或类库加载到项目的classpath中。
2.DriverManager类
DriverManager类用于加载JDBC驱动并且创建与数据库的连接。在DriverManager类中,定义了两个比较重要的的静态方法。
在这里插入图片描述
3. Connection接口
Connection接口代表Java程序和数据库的链接,在Connection接口中,定义了一系列的方法。
在这里插入图片描述
4.Statement接口
Statement接口用于向数据库发送SQL语句,在Statement接口中,提供了三个执行SQL语句的方法。
在这里插入图片描述
3、PreparedStatement对象
PreparedStatement,是java.sql包中的接口,继承了Statement,并与之在两方面有所不同,包含已编译的 SQL 语句。
3.1 PreparedStatement与Statements相比主要有以下优点:
(1)PreparedStatement能够执行参数化的SQL语句,避免反复书写相同SQL语句的繁锁。
参数化SQL语句具体如下:SELECT sname FROM student WHERE sid = ?;
"?"是参数的占位符,程序可以传入不同的sid值完成参数化查询。
(2)PreparedStatement比Statements效率更高,因为数据库系统会对SQL语句进行预编译处理。
(3)PreparedStatement可以防止SQL注入攻击
在这里插入图片描述
3.2 PreparedStatement技术原理:
1)该 PreparedStatement接口继承Statement,并与之在两方面有所不同:
PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。
2)创建对象
以下的代码段(其中 con 是 Connection 对象)创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象:
PreparedStatement pstmt = con.prepareStatement("UPDATE table4 SET m = ? WHERE x = ?");
pstmt 对象包含语句 “UPDATE table4 SET m = ? WHERE x = ?”,它已发送给DBMS,并为执行作好了准备。
3)传递参数
在执行 PreparedStatement 对象之前,必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成,其中 XXX 是与该参数相应的类型。例如,如果参数具有Java 类型 long,则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为 123456789,第二个参数设为 100000000:
pstmt.setLong(1, 123456789);
pstmt.setLong(2, 100000000);
一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用clearParameters 方法清除它为止。在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。
如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个 PreparedStatement 可执行多次。如果这一点不成立,那么试图通过使用PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。
4、ResultSet对象
4.1 ResultSet 的三种类型
因为结果集(ResultSet)是通过 Statement 语句执行后产生的;所以结果集(ResultSet)具备何种特点,完全决定于 Statement 的创建过程。
1)基本的 Statement 创建过程
Statement connection.createStatement()
创建一个 Statement 对象来将 SQL 语句发送到数据库。这样方法创建的 Statement 对象,其执行SQL 语句获得的 ResultSet 也是最基本的。
2)考虑 ResultSet 类型和并发性
Statement connection.createStatement(int resultSetType, int resultSetConcurrency)
创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。
(1)resultSetType 参数:
设置ResultSet对象的类型标示可滚动,或者是不可滚动。
取值如下:

ResultSet.TYPE_FORWARD_ONLY 只能向前滚动(这是默认值)。
ResultSet.TYPE_SCROLL_INSENSITIVE 和 Result.TYPE_SCROLL_SENSITIVE 这两个参数都能够实现任意的前后滚动,使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感。
TYPE_SCROLL_SENSITIVE 仅针对已经取出来的记录的更改(update、delete)敏感,对新增(insert)的数据不敏感。

(2)resultSetConcurrency 参数:
设置ResultSet对象能够修改的,取值如下:

ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。
ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。

3)考虑 ResultSet 对象可保存性
Statement connection.createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。结果集(ResultSet)可保持性就是指:当 ResultSet 的结果被提交时,ResultSet是被关闭还是不被关闭。
正常情况下如果使用 Statement 执行完一个查询,又去执行另一个查询时;第一个查询的结果集就会被关闭。也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。
JDBC2.0和1.0提供的都是提交后 ResultSet 就会被关闭。在JDBC3.0中,我们可以设置ResultSet是否关闭。
(1)resultSetHoldability 参数:
表示在结果集提交后结果集是否打开,取值有两个:

ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交时ResultSet不关闭。
ResultSet.CLOSE_CURSORS_AT_COMMIT 表示修改提交时ResultSet关闭。

不过这种功能只是在JDBC3.0的驱动下才能成立。
三、实际运用
1.JDBC的使用

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DbUtil {
   
    public static final String URL = "jdbc:mysql://localhost:3306/imooc";
    public static final String USER = "liulx";
    public static final String PASSWORD = "123456";
    public static void main(String[] args) throws Exception {
   
        //1.加载驱动程序
        Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
        //3.操作数据库,实现增删改查
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT user_name, age FROM imooc_goddess"
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值