JDBC之ResultSet和元数据
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和元数据的更多相关文章
- dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表
今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...
- JDBC【事务、元数据、改造JDBC工具类】
1.事务 一个SESSION所进行的所有更新操作要么一起成功,要么一起失败 举个例子:A向B转账,转账这个流程中如果出现问题,事务可以让数据恢复成原来一样[A账户的钱没变,B账户的钱也没变]. 事例说 ...
- JdbcTemplate:Jdbc模板和数据库元数据
通过 Jdbc .C3P0 .Druid 的使用我们会发现即使我们做了工具的封装,但重复性的代码依旧很多.我们可以通过 JdbcTemplate 即 Jdbc 模板来使我们的代码更加简洁,逻辑更加清晰 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- JDBC用ResultSet访问大量数据时会遇到的问题
我们经常需要JDBC来对数据库就行操作,一般流程为连接数据库.通过sql语句把需要的数据取出来保存到ResultSet,然后调用ResultSet方法的类似 getString,getInt()等方法 ...
- JDBC之ResultSet
ResultSet is a interface More gnerally,ResultSet is a class involves a table returned by executeQuer ...
- JDBC的ResultSet游标转spark的DataFrame,数据类型的映射以TeraData数据库为例
1.编写给ResultSet添加spark的schema成员及DF(DataFrame)成员 /* spark.sc对象因为是全局的,没有导入,需自行定义 teradata的字段类型转换成spark的 ...
- 获取jdbc中resultSet结果集的大小
当我们执行完一条Sql语句,获取到一个 ResultSet 对象后,有时我们需要立即知道到底返回了多少个元素,但是 ResultSet 并没有提供一个 size() 方法 or length 的属性, ...
- 将JDBC的resultSet映射到JavaBaen
// 执行赋值后SQL, rs=pstm.executeQuery(); //判断是否有返回结果,有下一行rs.next()方法为true ...
- <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
此类针对javaBean类写了一个通用的查询方法,List<javaBean> 通用查询更新中...:通过学习,深刻体会到学会反射就等于掌握了java基础的半壁江山! 一.使用JDBC驱动 ...
随机推荐
- Kmeans中文聚类
中文文本kmeans聚类原理:K就是将原始数据分为K类,Means即均值点.K-Means的核心就是将一堆数据聚集为K个簇,每个簇中都有一个中心点称为均值点,簇中所有点到该簇的均值点的距离都较到其他簇 ...
- 拼多多anti-content核心算法完全解密+修复
今天偶然看到拼多多的ant-content好奇就搞了下. 解密方法和代码 代码是用ast来解密的.利用babel处理,解密一部分+手动修复代码. AST相关的教程和文档 https://steaken ...
- Java——File类
File类 File:代表一个文件或者文件夹 方法 createNewFile() exists() getAbsolutePath() getName() getParent() isDirecto ...
- huawei--配置链路聚合
huawei--配置链路聚合 项目要求: LSW1和LSW2之间配置链路聚合,链路聚合分为手工和lacp两种模式.配置完后查看链路聚合状态. 项目实施: (vlan10 20 30的创建命令vlan ...
- 创建一个与a.txt文件同目录下的另一个文件b.txt
File file1 = new("d:\\a\\a.txt"); File file2 = new(file1.getParent(),"b.txt"): F ...
- java list的六种赋值方式
public static void main(String[] args) { //第一种赋值 List<String> list1 = Arrays.asList("stri ...
- storcli64简述
一.查询raid卡.raid组.物理硬盘信息 Controller_id:硬盘所在的raid卡的id,可以将该参数设置为all,表示查询该工具可管理的所有控制器的id Enclosure_id:硬盘所 ...
- tomcat 闪退 tomcat就是 找不到jre_home
Java环境变量 已经配置好了, 但是tomcat就是 找不到jre_home 所有就在 startup.bat 设置启动参数 SET JAVA_HOME=C:\Program Files\Java\ ...
- asp.net core 全局授权管理系统简介
大家好,我最近在做一个管理系统,我希望能做出一种授权机制,通过数据库的配置,来动态管控每个登入用于的访问权限. 因为才接触core不久,了解core的授权机制还是用了些时间的. 所以总结出来,供大家分 ...
- python菜鸟学习 : 16 pymongo和openpyxl的联合使用
# -*- coding: utf-8 -*-import pymongo, openpyxl, time# pymongo#条件删选mongodb数据def mongodb_expoter(db_n ...