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. docker 创建 network 指定ip 段

    docker network create -d bridge --gateway 172.22.0.1 --subnet 172.22.0.0/16 zk_default

  2. unity工程多开Bat

    %cd%:: 源路径set sourceDir=C:\Projects\XXX:: 目标路径set destDir=C:\Projects\XXX_Clone :: 如果目标路径不存在就创建if no ...

  3. uniapp使用百度地图

    要使用第三方百度地图,首先要去百度地图官方申请一个密钥,之后引入百度地图的API文件,参考使用文档即可开发使用.而在uniapp中是没法直接引入百度地图API文件的,我们要结合uniapp中的web- ...

  4. 如何在Axure RP 8.0 中打开页面指定的动态面板

    有时在制作原型的时候,需要打开另一个页面指定的动态面板,研究了一下分享给大家 方法/步骤 1.打开Axure RP 8.0,在index面面中拖出来一个按钮,写上文字"打开page1/sta ...

  5. 最大流模板(EK,Dinic

    一.EK EK算法:用bfs找增广路直到找不到为止.找到则更新最大流和残余网络,找不到则结束. 残余网络:对于一条走过的边,其正向边权值减少相应值,反向边权值增加相应值(用于反悔). 增广路:从所求起 ...

  6. Delphi获取程序版本号

    参考: http://www.delphitop.com/html/hanshu/4627.html procedure GetVersionInfo(const FileName:string; v ...

  7. cocos2d-lua 控制台输入Lua指令方便调试

    用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试. 1 首先在行首加入lua的引用,如下 1 #in ...

  8. 关于JWT的.net 使用(简单明了直接代码)

    首先第一步:下载插件! 在ui层---控制器所在层添加一个类 然后复制如下 using Microsoft.Extensions.Configuration; using Microsoft.Iden ...

  9. 小白之Python-基础中的基础04

    继续.. ------------------------华丽的分界线----------------------------- Python-基础中的基础04 --之方法 格式:对象.方法() 1. ...

  10. postgresql生产环境三大难题

    1.逻辑复制没有高可用 2.vacuum表膨胀问题严重 3.事务ID回卷,冻结清理