ResultSet

从名字上就可以看到是结果集,表示的是查询出来的结果集。

JDBC用ResultSet来封装结果集,查询结果表的对象。

查询结果分为两种情况:

单值

单个结果,比如说SQL如下:

select count(*) from account;
select max(id) from account;
select min(id) from account;

查询出来的是一个数字

多值

普遍来说是多个字段,这个时候对象就可以发挥效果。

select id,name,address from account where id = 1;

重点

游标

在ResultSet有一个游标的概念

提供一个游标,默认游标指向结果集第一行之前。调用一次next(),游标向下移动一行。提供一些get方法。

根据while循环的使用经验,如果不知道有多少条,那么使用while进行判断即可。

get方法

既然获取出来的有结果,那么就需要得到对应的值。ResultSet也提供了对应的方法

ResultSet接口常用API

  • boolean next();将光标从当前位置向下移动一行
  • int getInt(int colIndex)以int形式获取ResultSet结果集当前行指定列号值
  • int getInt(String colLabel)以int形式获取ResultSet结果集当前行指定列名值
  • float getFloat(int colIndex)以float形式获取ResultSet结果集当前行指定列号值
  • float getFloat(String colLabel)以float形式获取ResultSet结果集当前行指定列名值
  • String getString(int colIndex)以String 形式获取ResultSet结果集当前行指定列号值
  • String getString(String colLabel)以String形式获取ResultSet结果集当前行指定列名值
  • Date getDate(int columnIndex); 以Date 形式获取ResultSet结果集当前行指定列号值
  • Date getDate(String columnName);以Date形式获取ResultSet结果集当前行指定列名值
  • void close()关闭ResultSet 对象

JDBC中定义了数据库中的数据类型和java数据类型的映射,用于数据库和Java数据类型之间的转换。在使用ResultSet去记录中的某一列值的时候,用户要根据数据库对应列的数据类型地应的java数据类型,否则的话有可能抛出异常。下图定义了数据库和Java类型之间的映射:

SQL JDBC/Java setXXX updateXXX

VARCHAR java.lang.String setString updateString

CHAR java.lang.String setString updateString

LONGVARCHAR java.lang.String setString updateString

BIT boolean setBoolean updateBoolean

NUMERIC java.math.BigDecimal setBigDecimal updateBigDecimal

TINYINT byte setByte updateByte

SMALLINT short setShort updateShort

INTEGER int setInt updateInt

BIGINT long setLong updateLong

REAL float setFloat updateFloat

FLOAT float setFloat updateFloat

DOUBLE double setDouble updateDouble

VARBINARY byte[ ] setBytes updateBytes

BINARY byte[ ] setBytes updateBytes

DATE java.sql.Date setDate updateDate

TIME java.sql.Time setTime updateTime

TIMESTAMP java.sql.Timestamp setTimestamp updateTimestamp

CLOB java.sql.Clob setClob updateClob

BLOB java.sql.Blob setBlob updateBlob

ARRAY java.sql.Array setARRAY updateARRAY

REF java.sql.Ref SetRef updateRef

STRUCT java.sql.Struct SetStruct updateStruct

SQL_Type JDBC/Java java设置setXXX
VARCHAR java.lang.String setString
CHAR java.lang.String setString
LONGVARCHAR java.lang.String setString
BIT boolean setBoolean
NUMERIC java.math.BigDecimal setBigDecimal
TINYINT byte setByte
SMALLINT short setShort
INTEGER int setInt
BIGINT long setLong
REAL float setFloat
FLOAT float setFloat
DOUBLE double setDouble
VARBINARY byte[ ] setBytes
BINARY byte[ ] setBytes
DATE java.sql.Date setDate
TIME java.sql.Time setTime
TIMESTAMP java.sql.Timestamp setTimestamp
CLOB java.sql.Clob setClob
BLOB java.sql.Blob setBlob
ARRAY java.sql.Array setARRAY
REF java.sql.Ref SetRef
STRUCT java.sql.Struct SetStruct

使用示例

public class User implement Serializable{

    private int id;
private String username;
private String password;
private String nickname; //提供get/set/toString方法 Alt+Insert
}

对应的JDBC代码如下所示

List<User> list = new ArrayList<User>();

while (resultSet.next()) {
//每遍历一次, 就是1条记录, 就封装成一个User对象
User user = new User(resultSet.getInt("id"),
resultSet.getString("username"),
resultSet.getString("password"),
resultSet.getString("nickname")
);
list.add(user); }

元数据

数据库的元数据就是 数据库、表、列的定义信息。

​ ① 由PreparedStatement对象的getParameterMetaData ()方法获取的是ParameterMetaData对象。

  ② 由ResultSet对象的getMetaData()方法获取的是ResultSetMetaData对象。

ParameterMetaData

ParameterMetaData是由preparedStatement对象通过getParameterMetaData方法获取而来,ParameterMetaData可用于获取有关PreparedStatement对象和其预编译sql语句 中的一些信息. eg:参数个数,获取指定位置占位符的SQL类型

获得ParameterMetaData:

ParameterMetaData parameterMetaData =  preparedStatement.getParameterMetaData ();

API

方法名称
int getParameterCount(); 获得参数个数
int getParameterType(int param) 获取指定参数的SQL类型。 (注:MySQL不支持获取参数类型)
String getParameterClassName(int param) 返回第n个参数的参数类型
......
@Test
public void testPs() throws SQLException {
String url = "jdbc:mysql://localhost:3306/mysql_index_test?useSSL=true";
Connection connection = DriverManager.getConnection(url, "root","root");
String sql = "insert into user values(null , ? , ?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "aa");
ps.setString(2, "aa");
ps.setString(3, "aa");
//得到元数据
ParameterMetaData md = ps.getParameterMetaData();
System.out.println("参数的个数:" + md.getParameterCount());
//后续的这些方法会报错。
System.out.println("第一个的参数类型名称:"+md.getParameterClassName(1));
}

ResultSetMetaData

ResultSetMetaData是由ResultSet对象通过getMetaData方法获取而来,ResultSetMetaData可用于获取有关ResultSet对象中列的类型和属性的信息。

API

方法名称 说明
getColumnCount() 获取结果集中列项目的个数
getColumnName(int column) 获得数据指定列的列名
getColumnTypeName() 获取指定列的SQL类型
getColumnClassName() 获取指定列SQL类型对应于Java的类型
@Test
public void testResultSetMetaData() throws SQLException {
Connection conn = C3p0Util.getConn();
String sql = "select * from user where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 45);
ResultSet rs = ps.executeQuery();
//重点关注元数据
ResultSetMetaData md = rs.getMetaData();
System.out.println("列的个数:" + md.getColumnCount());
System.out.println("第1列的名字:"+md.getColumnName(1));
System.out.println("第2列的数据库类型:"+md.getColumnTypeName(2));
System.out.println("第2列的java类型:"+md.getColumnClassName(2));
}

JDBC之ResultSet和元数据的更多相关文章

  1. dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表

    今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...

  2. JDBC【事务、元数据、改造JDBC工具类】

    1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样[A账户的钱没变,B账户的钱也没变]. 事例说 ...

  3. JdbcTemplate:Jdbc模板和数据库元数据

    通过 Jdbc .C3P0 .Druid 的使用我们会发现即使我们做了工具的封装,但重复性的代码依旧很多.我们可以通过 JdbcTemplate 即 Jdbc 模板来使我们的代码更加简洁,逻辑更加清晰 ...

  4. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. JDBC用ResultSet访问大量数据时会遇到的问题

    我们经常需要JDBC来对数据库就行操作,一般流程为连接数据库.通过sql语句把需要的数据取出来保存到ResultSet,然后调用ResultSet方法的类似 getString,getInt()等方法 ...

  6. JDBC之ResultSet

    ResultSet is a interface More gnerally,ResultSet is a class involves a table returned by executeQuer ...

  7. JDBC的ResultSet游标转spark的DataFrame,数据类型的映射以TeraData数据库为例

    1.编写给ResultSet添加spark的schema成员及DF(DataFrame)成员 /* spark.sc对象因为是全局的,没有导入,需自行定义 teradata的字段类型转换成spark的 ...

  8. 获取jdbc中resultSet结果集的大小

    当我们执行完一条Sql语句,获取到一个 ResultSet 对象后,有时我们需要立即知道到底返回了多少个元素,但是 ResultSet 并没有提供一个 size() 方法 or length 的属性, ...

  9. 将JDBC的resultSet映射到JavaBaen

    // 执行赋值后SQL,            rs=pstm.executeQuery();            //判断是否有返回结果,有下一行rs.next()方法为true          ...

  10. <五>JDBC_利用反射及JDBC元数据编写通用的查询方法

    此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...

随机推荐

  1. grafana二次开发环境配置(windows10)

    安装说明: 由于在windows环境安装grafana,第一次安装的是8.2.2版本,后端编译时一直报错,故安装了8.1.7 该错误在 grafana 的源码问题中可以找到,但针对 windows 暂 ...

  2. error:0308010C:digital envelope routines::unsupported

    Node.js v18.14.1 运行项目 node:internal/crypto/hash:71 this[kHandle] = new _Hash(algorithm, xofLen); ^ E ...

  3. SAR成像(四):多普勒频移的计算

    雷达系统中,雷达与目标间的相互运动会使回波信号产生频移,称为多普勒效应,对应的频移称为多普勒频率. 假设雷达发射信号为单频连续波, f ( t ) = c o s ( 2 π f 0 t + ϕ ) ...

  4. 神奇的Object.assign()

    Object.assign() 方法用于将所有可枚举的属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 1.Object.assign()可以在对象为一层的时候,实现简单的"深拷 ...

  5. unity3D mirror网络游戏开发笔记

    最近想开发一款多人在线网络游戏,使用unity3d的mirror插件可以提高开发效率,并且该插件免费. 但是由于使用插件开发效率太低,经过研究,ummorpg开发模板是居于该插件开发而来,使用它可以提 ...

  6. Linux 关闭系统时间同步-timedatectl的使用

    源于一次项目需要修改系统时间,但是每次修改后又被同步回网络时间,找了好久发现是这个原因: NTP即Network Time Protocol(网络时间协议),是一个互联网协议,用于同步计算机之间的系统 ...

  7. db2存储过程 动态拼接sql 、输出数据集示例

    *****部分都是表名.因为隐私关系,替换为*了. 1 CREATE PROCEDURE "BI_DM"."SP_GCYP_REPORT" ( 2 startd ...

  8. Pytorch实战学习(七):高级CNN

    <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili Advanced CNN 一.GoogLeNet Inception Module:而为了减少代码的冗余,将由(卷积(C ...

  9. python+ffmpeg,批量转换手机中的m3u8文件

    前段时间,有朋友找我帮忙,自述其手机上使用UC浏览器,缓存的电影有近千个,手机存储不够了,想把这些电影转存到PC机上,并且将其转换为Mp4文件.小事情,安排! 一.分析情况,确定方案. 首先连接手机, ...

  10. 软件工程日报一——Andriod的安装与配置

    建民老师给我们布置了一个编写记事本app的任务,因此需要我们下载andriod studio,下面是我的下载过程 在下载andriod studio之前,需要我们配置Java环境 进入控制面板,输入 ...