JDBC连接数据以及详细的ResultSet结果集解释

一.数据库连接

(前面为jdbc的其他参数,文章下部分为ResultSet详解)
ResultSet rs = st.executeQuery(sqlStr)

 

1. java的sql框架支持多种数据库连接,不同的数据库需要使用不同的数据库连接驱动,驱动来自于数据库厂商;
 
2. 主要需要四个参数,一个驱动信息参数,三个数据库入口参数
  • driverClass:驱动信息
  • url:数据库连接参数
  • user:用户名    
  • password:密码
 
3.java语言定义了很多接口,数据库厂商统一实现这些接口,所以通用;
 
 

二.接口

1.Connection接口
  • Connection接口代表着与数据库的链接
connection接口的常用方法
返回类型 方法 功能描述
Statement createStatment() 创建一个Statment对象
Statement createStatment(int resultSetType,int resultSetConcurrency) 创建一个statment对象,该对象将生成具有给定类型并发性,和可保存的ResultSet对象
PrepareStatement prepareStatement() 创建预处理对象prepardStatement
CallableStatement prepareCall(String sql) 创建一个CallableStatment对象来调用数据库存储过程
boolean isReadOnly() 查看当前Collection对象是否为只读
boolean setReadOnly()  设置当前对象的默认读写模式
 
 
 
 
2.Statment接口
statment接口
返回类型 方法 功能描述
boolean execute(String sql) 执行静态sql语句,该语句可能返回多个结果集,(改方法看似鸡肋,其实也很鸡肋,如果该语句可以返回一个ResultSet结果集,则为true,反之false,当然,当sql语句庞大的时候,可以用这个方法来检测是否能够执行从而节省资源)
ResultSet executeQuery(String sql) 执行给定的sql语句,该语句返回单个ResultSet对象
void clearBatch() 清空这个Statement对象的sql命令列表
int[] executeButch() 将一批sql命令交给数据库类执行,如果全部成功,则返回更新计数组成的数组,数组元素的排序和sql添加的顺序相同
 
 
3.PreparedStatment接口,继承自Statment接口,因为PreparedStatment是安全的,Statment接口是不安全的
PrepareStatment接口的常用方法
方法参数 方法 功能描述
void setXXX(int index,[指定给的类型] k) 将制定位置的参数设置成XXX值
ResultSet executeQuery() 执行Sql查询,并返回对应的ResultSet结果集
void setNull(int index ,int sqlType) 设置指定的位置为SQL NUll值
int executeUpdate() 执行前面包含的参数的动态 [INSERT|UPDATE|DELETE]
void clearParameters() 清楚当前所有参数值
  • 例子
PrepareStatment ps = conn.prepareStatment("select * from emp where ename = ? ");
ps.setInt(1,'张三');
//将sql中的第一个参数设置为张三

 

 
 
 
 
 
4.CallableStatement接口
  CallableStatemnt接口继承并且扩展了PrepareStatemnt接口,用来执行对数据库的存储过程操作;
方法 功能描述
set+数据类型 将指定参数设置为java中指定的数据类型值
get+数据类型 以java中指定类型值的形式获取指定的JDBC中相应参数的类型值
 
 
 

三.ResultSet结果集详解

 
所有静态字段
int  CLOSE_CURSORS_AT_COMMIT 该常量指示提交当前事务时,具有此可保存性的打开的 ResultSet 对象将被关闭。 
int  CONCUR_READ_ONLY 该常量指示不可以更新的 ResultSet 对象的并发模式。 
int  CONCUR_UPDATABLE 该常量指示可以更新的 ResultSet 对象的并发模式。 
int  FETCH_FORWARD 该常量指示将按正向(即从第一个到最后一个)处理结果集中的行。 
int  FETCH_REVERSE 该常量指示将按逆向(即从最后一个到第一个)处理结果集中的行处理。 
int  FETCH_UNKNOWN 该常量指示结果集中的行的处理顺序未知。 
int  FETCH_UNKNOWN 该常量指示提交当前事务时,具有此可保存性的打开的 ResultSet 对象将保持开放。 
int  TYPE_FORWARD_ONLY 该常量指示光标只能向前移动的 ResultSet 对象的类型。 
int  TYPE_SCROLL_INSENSITIVE 该常量指示可滚动,再固定条件下可以修改表内容;
int  TYPE_SCROLL_SENSITIVE 该常量指示可滚动并且,不可修改表内容;

 

 
 
常用方法
返回类型 方法 功能描述
boolean next() 将光标从当前位置向下移动一行,也就是读取下一行
boolean previous() 将光标从当前位置向上移动一行,也就是读取上一行
void close() 关闭ResultSet对象
int getInt(int) 以int的形式获取结果集,以当前行指定序号的值,以列的编号或者列的名字
int getInt(String) 以下跟以上一样以此类推
float getFloat(int)  
float getFloat(String)  
String getString(int)  
String getString(String)  
int getRow() 得到光标当前所指定的行号
boolean absolute(int row) 光标移动到row指定的行
boolean relative(int rows) 光标移动到相对于当前行的指定行,上下使用+和-表示
 
        ResultSet内存结构
        
 
 
 
 
1.ResultSet对象是Statement和ParpareStatemen创建的,所以ResultSet的具体行为指令由创建他的类定义
  在jdbc中,最重要的就是ResultSet,因为他最常用,数据的中转站,很有必要弄详细;
 
 
2. ResultSet集合的主要功能使用来存储查询语句返回的结果集,注意:他存储的不是结果集内容,所以不会造成数据量过大而引发的内存溢出,
  他存储的只是查询数据的部分资料,而具体的数据信息会在调用next()时拿出来;
  以上言论是网上大佬说的,说错了,说错了,具体内容已经被保存到ResultSet里的RowDate里面了,字节的形式,打开会看到一堆二进制;
  寻找jvm可容量视化工具,请评论;
 
 
 
 
 
 
3.因为ResultSet是由其他对象来创建的,所以有有几种类型不同的Result
  • 最基本的ResultSet
    • 这个ResultSet的作用就是完成了查询结果的存储功能,并且只能读取一次,不能够来回滚动进行读取操作,如图;
  • 可滚动的ResultSet
    • 这个类型支持前后滚动取得记录的next()向下读取以一行,和previous()向上读取以一行,同时还支持absolute(int row)读取指定的一行,以
      及relative(int rows)移动到相对于当前行的指定行("-"号和"+")
    • 这种结果集的创建方式如下     
    Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency);

    ResultSet rs = st.executeQuery(sqlStr);

 

 
 
    • 要实现这种类型的ResultSet对象的,在Statement创建该对象是为其指定类型;
      •  resultSetType用来设置ResultSet类型是否支持滚动,或者是不可滚动,取值如下:
        1. ResultSet.TYPE_FORWARD_ONLY       只能向前滚动;            
        2. ResultSet.TYPE_SCROLL_INSENSITIVE 实现任意的前后滚动,即可以使用各种移动指针的方法,并且支持修改;
        3. Result.TYPE_SCROLL_SENSITIVE      实现任意的前后滚动,对修改敏感;    
 
 
      •  resultSetConcurency 是设置 ResultSet 对象能够修改的,取值如下:              
  1. ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。 
  2. ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。        

    所以如果只是想要可以滚动的类型的 Result,就要在Statement创建ResultSet是为其指定类型  
 

Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,
                          ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.excuteQuery(sqlStr);
//用这个 Statement 执行的查询语句得到的就是可滚动的 ResultSet 。

 

 
 
 
 
4.ResultSet的可更新状态
    • RresltSet不仅可以用来存储查询结果返回的数据,也可以通过修改其内中值,然后起到更新数据库内容的作用  
    • ResultSet相当于数据中的视图,他没有实体,并且,所提交的Sql语句必须满足一下几点内容
      • 只引用了单个表
      • 不包含jion和分组信息
      • 列中要包含主键信息
创建可跟新结果集的办法:
Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)  //具体的ResultSet字段信息请参考上面的字段表
 

 

 
 
 
 
 
5. 可以保持的ResultSet
  • Statement关闭结果集的方法,当前有一个结果集,又去执行了一条sql语句,会导致第一个结果集关闭,或者在commit方法的时候也会关闭结果集,可保持的意思就是不会被关闭的结果集

   Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
  ResultSet rs = st.excuteQuery(sqlStr);

 

 
 
  • 两个参数在第3. 4. 中已经阐述的参数 ,这里说明一下resultsetSetHoldability参数
    • resultsetSetHoldability参数表名,该结果集是否能够在连接关闭时打开
      • ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库.
      • ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭.
 



 



posted @ 2018-10-05 01:01  觥筹啊觥筹  阅读(33421)  评论(2编辑  收藏  举报