阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

JDBC中的核心对象

109次阅读
没有评论

共计 4248 个字符,预计需要花费 11 分钟才能阅读完成。

一、JDBC 中的主要类(接口)

在 JDBC 中常用的类有:

​ DriverManager;

​ Connection;

​ Statement;

​ ResultSet。

二、DriverManager

其实我们今后只需要会用 DriverManager 的 getConnection() 方法即可:

  1. Class.forName(“com.mysql.jdbc.Driver”);// 注册驱动

  2. String url =“jdbc:mysql://localhost:3306/mydb1”;

  3. String username =“root”;

  4. String password =“123”;

  5. Connection con = DriverManager.getConnection(url, username, password);

注意,上面代码可能出现的两种异常:

  1. ClassNotFoundException:这个异常是在第 1 句上出现的,出现这个异常有两个可能:

    你没有给出 mysql 的 jar 包;

    你把类名称打错了,查看类名是不是 com.mysql.jdbc.Driver。

  2. SQLException:这个异常出现在第 5 句,出现这个异常就是三个参数的问题,往往 username 和 password 一般不是出错,所以需要认真查看 url 是否打错。

对于 DriverManager.registerDriver() 方法了解即可,因为我们今后注册驱动只会 Class.forName(),而不会使用这个方法。

三、Connection

Connection 最为重要的方法就是获取 Statement:

Statement stmt = con.createStatement();

后面在学习 ResultSet 方法时,还要学习一下下面的方法:

Statement stmt = con.createStatement(int,int);

createStatement 方法的这两个参数是用来确定创建的 Statement 能生成什么样的结果集

四、Statement

Statement 最为重要的方法是:

int executeUpdate(String sql):执行更新操作,即执行 insert、update、delete 语句,其实这个方法也可以执行 create table、alter table,以及 drop table 等语句,但我们很少会使用 JDBC 来执行这些语句;

ResultSet executeQuery(String sql):执行查询操作,执行查询操作会返回 ResultSet,即结果集。

boolean execute();// 该方法了解即可

可以执行 executeUpdate() 和 executeQuery() 两个方法能执行的 sql 语句

Statement 还有一个 boolean execute() 方法,这个方法可以用来执行增、删、改、查所有 SQL 语句。该方法返回的是 boolean 类型,表示 SQL 语句是否有结果集!。

如果使用 execute() 方法执行的是更新语句,那么还要调用 int getUpdateCount() 来获取 insert、update、delete 语句所影响的行数。

如果使用 execute() 方法执行的是查询语句,那么还要调用 ResultSet getResultSet() 来获取 select 语句的查询结果。

五、ResultSet 之滚动结果集(了解)

滚动的类别有:

  • 下一行:默认只能使用它,其他的方法存在,但不能使用!默认的结果集不可滚动!

  • 上一行

  • 下 N 行

  • 上 N 行

  • 到 N 行

ResultSet 表示结果集,它是一个二维的表格!ResultSet 内部维护一个行光标(游标),ResultSet 提供了一系列的方法来移动游标:

void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;

void afterLast():把光标放到最后一行的后面;

boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;

boolean last():把光标放到最后一行的位置上;

boolean isBeforeFirst():当前光标位置是否在第一行前面;

boolean isAfterLast():当前光标位置是否在最后一行的后面;

boolean isFirst():当前光标位置是否在第一行上;

boolean isLast():当前光标位置是否在最后一行上;

boolean previous():把光标向上挪一行;

boolean next():把光标向下挪一行;

boolean relative(int row):相对位移,当 row 为正数时,表示向下移动 row 行,为负数时表示向上移动 row 行;

boolean absolute(int row):绝对位移,把光标移动到指定的行上;

int getRow():返回当前光标所有行。

获取结果集元数据!

得到元数据:rs.getMetaData(),返回值为 ResultSetMetaData;

获取结果集列数:int getColumnCount()

获取指定列的列名:String getColumnName(int colIndex)

结果集特性

当使用 Connection 的 createStatement 时,已经确定了 Statement 生成的结果集是什么特性。

是否可滚动

是否敏感

是否可更新

con.createStatement()

生成的结果集:不滚动、不敏感、不可更新!

con.createStatement(int,int)

第一个参数:

​ ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;

​ ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;

​ ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;( 没有数据库驱动会支持它!

第二个参数:

CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;

CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。

上面方法分为两类,一类用来判断游标位置的,另一类是用来移动游标的。

如果结果集是不可滚动的,那么只能使用 next() 方法来移动游标,而 beforeFirst()、afterLast()、first()、last()、previous()、relative() 方法都不能使用!!!

结果集是否支持滚动,要从 Connection 类的 createStatement() 方法说起。也就是说创建的 Statement 决定了使用 Statement 创建的 ResultSet 是否支持滚动。

Statement createStatement(int resultSetType, int resultSetConcurrency)

resultSetType 的可选值:

ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;

ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;

ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;// 没有数据库驱动会支持它!

可以看出,如果想使用滚动的结果集,我们应该选择 TYPE_SCROLL_INSENSITIVE!其实很少有数据库驱动会支持 TYPE_SCROLL_SENSITIVE 的特性!通常我们也不需要查询到的结果集再受到数据库变化的影响。

resultSetConcurrency 的可选值:

l CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;

l CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。

通常可更新结果集这一“高级特性”我们也是不需要的!

获取滚动结果集的代码如下:

Connection con = …

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY);

String sql = …// 查询语句

ResultSet rs = stmt.executeQuery(sql);// 这个结果集是可滚动的

六、ResultSet 之获取列数据

可以通过 next() 方法使 ResultSet 的游标向下移动,当游标移动到你需要的行时,就需要来获取该行的数据了,ResultSet 提供了一系列的获取列数据的方法:

  • String getString(int columnIndex):获取指定列的 String 类型数据;

  • int getInt(int columnIndex):获取指定列的 int 类型数据;

  • double getDouble(int columnIndex):获取指定列的 double 类型数据;

  • boolean getBoolean(int columnIndex):获取指定列的 boolean 类型数据;

  • Object getObject(int columnIndex):获取指定列的 Object 类型的数据。

上面方法中,参数 columnIndex 表示列的索引, 列索引从 1 开始,而不是 0 ,这第一点与数组不同。如果你清楚当前列的数据类型,那么可以使用 getInt() 之类的方法来获取,如果你不清楚列的类型,那么你应该使用 getObject() 方法来获取。

ResultSet 还提供了一套通过列名称来获取列数据的方法:

获取一列的数据,有两种方式,getXxx(int columIndex),还有一种:getXxx(String columnName)

  • String getString(String columnName):获取名称为 columnName 的列的 String 数据;

  • int getInt(String columnName):获取名称为 columnName 的列的 int 数据;

  • double getDouble(String columnName):获取名称为 columnName 的列的 double 数据;

  • boolean getBoolean(String columnName):获取名称为 columnName 的列的 boolean 数据;

  • Object getObject(String columnName):获取名称为 columnName 的列的 Object 数据;

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计4248字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中