Java数据库结果集和元数据总结及应用实例.doc_第1页
Java数据库结果集和元数据总结及应用实例.doc_第2页
Java数据库结果集和元数据总结及应用实例.doc_第3页
Java数据库结果集和元数据总结及应用实例.doc_第4页
Java数据库结果集和元数据总结及应用实例.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库结果集和元数据总结及应用实例结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。 结果集读取数据的方法主要是getXXX(),他的参数可以使整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false。使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有:基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型(BigDecimal和BigInteger等)等。还可以使用getArray(int colindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用getAsciiStream(int colindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。 结果集从其使用的特点上可以分为四类,这四类的结果集的所具备的特点都是和Statement语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以说,结果集具备何种特点,完全决定于Statement,当然我是说下面要将的四个特点,在Statement创建时包括三种类型。首先是无参数类型的,他对应的就是下面要介绍的基本的ResultSet对应的Statement。下面的代码中用到的Connection并没有对其初始化,变量conn代表的就是Connection对应的对象。SqlStr代表的是响应的SQL语句。先了解下Connection的createStatement方法(有3中建立的方法):Statement createStatement() throws SQLException创建一个 Statement 对象来将 SQL 语句发送到数据库。不带参数的 SQL 语句通常使用 Statement 对象执行。如果多次执行相同的 SQL 语句,使用 PreparedStatement 对象可能更有效。 使用返回的 Statement 对象创建的结果集在默认情况下类型为 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。已创建结果集的可保存性可调用 getHoldability() 确定。 返回:一个新的默认 Statement 对象 抛出: SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException创建一个 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象。此方法与上述 createStatement 方法相同,但它允许重写默认结果集类型和并发性。已创建结果集的可保存性可调用 getHoldability() 确定。参数:resultSetType - 结果集类型,它是 ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVE 之一resultSetConcurrency - 并发类型;它是 ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLE 之一 返回:一个新的 Statement 对象,该对象将生成具有给定类型和并发性的 ResultSet 对象 抛出: SQLException - 如果发生数据库访问错误,在关闭的连接上调用此方法,或者给定参数不是指示类型和并发性的 ResultSet 常量 SQLFeatureNotSupportedException - 如果 JDBC 驱动程序不支持此方法,或者对于指定的结果集类型和结果集并发性,此方法不受支持。Statement createStatement(int resultSetType,int resultSetConcurrency,int resultSetHoldability) throws SQLException创建一个 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象。此方法与上述 createStatement 方法相同,但它允许重写默认结果集类型、并发性和可保存性。 参数:resultSetType - 以下 ResultSet 常量之一:ResultSet.TYPE_FORWARD_ONLY、ResultSet.TYPE_SCROLL_INSENSITIVE 或 ResultSet.TYPE_SCROLL_SENSITIVEresultSetConcurrency - 以下ResultSet 常量之一:ResultSet.CONCUR_READ_ONLY 或 ResultSet.CONCUR_UPDATABLEresultSetHoldability - 以下 ResultSet 常量之一:ResultSet.HOLD_CURSORS_OVER_COMMIT 或 ResultSet.CLOSE_CURSORS_AT_COMMIT 返回:一个新的 Statement 对象,该对象将生成具有给定类型、并发性和可保存性的 ResultSet 对象 抛出: SQLException - 如果发生数据库访问错误,在关闭的连接上调用此方法,或者给定参数不是指定类型、并发性和可保存性的 ResultSet 常量 SQLFeatureNotSupportedException - 如果 JDBC 驱动程序不支持此方法,或者对于指定结果集类型、结果集可保存性和结果集并发性,此方法不受支持。1、 最基本的ResultSet。之所以说是最基本的ResultSet是因为,这个ResultSet他起到的作用就是完成了查询结果的存储功能,而且只能读去一次,不能够来回的滚动读取。这种结果集的创建方式如下: Statement st = conn.CreateStatementResultSet rs = Statement.excuteQuery(sqlStr);由于这种结果集不支持,滚动的读去功能所以,如果获得这样一个结果集,只能使用它里面的next()方法,逐个的读去数据。 2、 可滚动的ResultSet类型。这个类型支持前后滚动取得纪录next()、previous(),回到第一行first(),同时还支持要去的ResultSet中的第几行absolute(int n),以及移动到相对当前行的第几行relative(int n),要实现这样的ResultSet在创建Statement时用如下的方法。Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)ResultSet rs = st.executeQuery(sqlStr)其中两个参数的意义是:resultSetType是设置ResultSet对象的类型可滚动,或者是不可滚动。取值如下: ResultSet.TYPE_FORWARD_ONLY只能向前滚动 ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE这两个方法都能够实现任意的前后滚动,使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感。resultSetConcurency是设置ResultSet对象能够修改的,取值如下: ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。 ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。所以如果只是想要可以滚动的类型的Result只要把Statement如下赋值就行了。Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs = st.excuteQuery(sqlStr);用这个Statement执行的查询语句得到的就是可滚动的ResultSet。 3、 可更新的ResultSet这样的ResultSet对象可以完成对数据库中表的修改,但是我知道ResultSet只是相当于数据库中表的视图,所以并不是所有的ResultSet只要设置了可更新就能够完成更新的,能够完成更新的ResultSet的SQL语句必须要具备如下的属性: a、只引用了单个表。 b、不含有join或者group by子句。 c、那些列中要包含主关键字。 具有上述条件的,可更新的ResultSet可以完成对数据的修改,可更新的结果集的创建方法是:Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE)4、 可保持的ResultSet正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。不过在JDBC3.0中,我们可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建,要使用的Statement的创建要具有三个参数,这个Statement的创建方式也就是,我所说的Statement的第三种创建方式。如下:Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)ResultSet rs = st.excuteQuery(sqlStr);前两个参数和两个参数的createStatement方法中的参数是完全相同的,这里只介绍第三个参数: resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个: ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。 ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。 不过这种功能只是在JDBC3.0的驱动下才能成立。 这样的Statement的执行结果得到的就是可更新的结果集。更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用updateXXX(),这个方法XXX的含义和getXXX()是相同的。updateXXX()方法,有两个参数,第一个是要更新的列,可以是列名或者序号。第二个是要更新的数据,这个数据类型要和XXX相同。每完成对一行的update要调用updateRow()完成对数据库的写入,而且是在ResultSet的游标没有离开该修改行之前,否则修改将不会被提交。 使用updateXXX方法还可以完成插入操作。但是首先要介绍两个方法: moveToInsertRow()是把ResultSet移动到插入行,这个插入行是表中特殊的一行,不需要指定具体那一行,只要调用这个方法系统会自动移动到那一行的。 moveToCurrentRow()这是把ResultSet移动到记忆中的某个行,通常当前行。如果没有使用insert操作,这个方法没有什么效果,如果使用了insert操作,这个方法用于返回到insert操作之前的那一行,离开插入行,当然也可以通过next(),previous()等方法离开插入行。 要完成对数据库的插入,首先调用moveToInsertRow()移动到插入行,然后调用updateXXX的方法完成对,各列数据的更新,完成更新后和更新操作一样,要写到数据库,不过这里使用的是insertRow(),也要保证在该方法执行之前ResultSet没有离开插入列,否则插入不被执行,并且对插入行的更新将丢失。示例1:public void updateResultSet() try / 创建可更新且可前后滚动对修改敏感的结果集statement = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);String sql = select * from user;rs = statement.executeQuery(sql);/ 遍历整个结果集while (rs.next() System.out.println(id= + rs.getObject(id) + ;name=+ rs.getObject(name) + ;age= + rs.getObject(age)+ address= + rs.getObject(address);String name = rs.getString(name);if (name.equals(ben) / 知道需更新的列和值rs.updateInt(age, 35);/ 调用updateRow()完成对数据库的写入rs.updateRow(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();数据库元数据信息Connection 对象的数据库能够提供描述其表、所支持的 SQL 语法、存储过程、此连接功能等等的信息。此信息是使用 getMetaData 方法获得的。方法 getMetaDataDatabaseMetaData getMetaData() throws SQLException获取一个 DatabaseMetaData 对象,该对象包含关于此 Connection 对象所连接的数据库的元数据。元数据包括关于数据库的表、受支持的 SQL 语法、存储过程、此连接功能等等的信息。 返回:此 Connection 对象的一个 DatabaseMetaData 对象 抛出: SQLException - 如果发生数据库访问错误,或者在关闭的连接上调用此方法java.sql 接口 DatabaseMetaDatapublic interface DatabaseMetaData extends Wrapper关于数据库的整体综合信息。 此接口由驱动程序供应商实现,让用户了解 Database Management System (DBMS) 在与驱动程序(基于与其一起使用的 JDBCTM 技术(“JDBC 驱动程序”)相结合时的能力。不同的关系 DBMS 常常支持不同的功能,以不同方式实现这些功能,并使用不同的数据类型。此外,驱动程序可以实现 DBMS 提供的顶级功能。此接口中的方法返回的信息关系到一起工作的特定驱动程序和特定 DBMS 的能力。注意,正如此文档中所使用的那样,术语“数据库”通常既指驱动程序,又指 DBMS。 此接口的用户通常是一个需要发现如何处理底层 DBMS 的工具。对于试图与多个 DBMS 一起使用的应用程序而言尤其如此。例如,一个工具可能使用 getTypeInfo 方法找出可以在 CREATE TABLE 语句中使用的数据类型。或者用户可能调用 supportsCorrelatedSubqueries 方法查看是否可以使用相关子查询,或者调用 supportsBatchUpdates 查看是否可以使用批量更新。 有些 DatabaseMetaData 方法以 ResultSet 对象的形式返回信息列表。常规 ResultSet 方法(比如 getString 和 getInt)可用于从这些 ResultSet 对象中获取数据。如果给定形式的元数据不可用,则将返回一个空 ResultSet。对于被定义为由 ResultSet 对象的给定方法所返回的列以外的其他列,可以由 JDBC 驱动程序供应商定义,且必须通过其列标签访问。 有些 DatabaseMetaData 方法使用 String 模式的参数。这些参数都有 fooPattern 这样的名称。在模式 String 中,% 表示匹配 0 个或多个字符的任何子字符串,_ 表示匹配任何一个字符。仅返回匹配搜索模式的元数据项。如果将搜索模式参数设置为 null,则从搜索中删除参数标准。 PreparedStatement元数据信息getParameterMetaDataParameterMetaData getParameterMetaData() throws SQLException获取此 PreparedStatement 对象的参数的编号、类型和属性。 返回: 一个 ParameterMetaData 对象,它包含有关此 PreparedStatement 对象的每个参数标记的编号、类型和属性的信息 抛出: SQLException - 如果发生数据库访问错误,或者在关闭的 PreparedStatement 上调用此方法java.sql 接口 ParameterMetaDatapublic interface ParameterMetaData extends Wrapper可用于获取关于 PreparedStatement 对象中每个参数标记的类型和属性信息的对象。对于某些查询和驱动程序实现,由 ParameterMetaData 对象返回的数据在 PreparedStatement 执行前可能不可用。 某些驱动程序实现无法提供关于 CallableStatement 对象中每个参数标记的类型和属性的信息。 示例2:public void read1(String sql,Object params)try ps = conn.prepareStatement(sql);/获取PrepareStatement每个参数标记的类型和属性信息对象ParameterMetaData pmd=ps.getParameterMetaData();/获取 PreparedStatement 对象中的参数的数量int count=pmd.getParameterCount();/由于没有查询数据库,所有MYSQL无法返回正确的类型信息for(int i=1;i=count;i+)System.out.print(pmd.getParameterClassName(i)+t);System.out.print(pmd.getParameterType(i)+t);System.out.println(pmd.getParameterTypeName(i);for(int i=0;i? and age?;StringTest1 st1=new StringTest1();/st1.updateResultSet(sql);Object params=1,20;System.out.println(st1.read(sql,params);st1.close();public ListMap read(String sql,Object params)try ps = conn.prepareStatement(sql);for(int i=0;iparams.length;i+)ps.setObject(i+1, paramsi);rs=ps.executeQuery();ResultSetMetaData rsm=rs.getMetaData();/获取查询结果有多少列int count=rsm.getColumnCount();/存储查询结果的列名String strColumns=new Stringrsm.getColumnCount();/循环遍历结果集for(int i=1;i=count;i+)/返回构造其实例的 Java 类的完全限定名称/System.out.print(rsm.getColumnClassName(i)+t);/获取指定列的 SQL 类型,返回值为int类型/System.out.print(rsm.getColumnType(i)+t);/获取指定列的数据库特定的类型名称。/System.out.print(rsm.getColumnTypeName(i)+t);/获取指定列的名称。/System.out.print(rsm.getColumnName(i)+t);/*获取用于打印输出和显示的指定列的建议标题。/ * 建议标题通常由 SQL AS 子句来指定。/ * 如果未指定 SQL AS,则从 getColumnLabel 返回的值将和/ * getColumnName 方法返回的值相同。 */System.out.println(rsm.getColumnLabel(i);strColumnsi-1=rsm.getColumnLabel(i);ListMap datas=new ArrayListMap();while(rs.next()Map data=new HashMap();for(int i=0;istrColumns.length;i+)data.put(strColumnsi, rs.getObject(strColumnsi);datas.add(data);return datas; catch (Exception e) e.printStackTrace();return null;public void close() try if (rs != null) rs.close(); catch (SQLException e) e.printStackTrace(); finally try if (statement != null) statement.close();if (ps != null) ps.close(); catch (SQLException e) e.printStackTrace(); finally try if (conn != null) conn.close(); catch (SQLException e) e.printStackTrace();执行结果:主键=2, 姓名=jack, 地址=杭州, 年龄=22, 主键=3, 姓名=ben, 地址=临沂, 年龄=35应用示例:import java.lang.reflect.Method;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;/* * ibatis底层实现的简单示例 * * author SJNL * */public class BaseIbatis private static Connection conn = null;private Statement statement = null;private ResultSet rs = null;private PreparedStatement ps = null;private static String drivername = org.gjt.mm.mysql.Driver;private static String url = jdbc:mysql:/localhost:3306/test?characterEncoding=UTF-8;private static String user = root;private static String password = root;static try Class.forName(drivername);conn = DriverManager.getConnection(url, user, password); catch (ClassNotFoundException e) e.printStackTrace();System.out.println(加载数据库驱动失败); catch (SQLException e) e.printStackTrace();System.out.println(获取数据库链接失败);public static void main(String args) throws Exception String sql = select id as Id,name as Name,age as Age,address as Address from user where id=?;BaseIbatis bi = new BaseIbatis();Object params = 2 ;User user = (User) bi.getObject(sql, User.class, params);System.out.println(user.getId() + + user.getName() + + user.getAge() + + user.getAddress();bi.close();/* * * param sql * 需要执行的SQL语句 * param clazz * 需要被封装的对象的Class对象 * param params * 需要预编译的参数 * return */SuppressWarnings(unchecked)public Object getObject(String sql, Class clazz, Object params)throws Exception try ps = conn.prepareStatement(sql);/ 判断传进的需要赋值的参数是否与传进的SQL语句的?个数相等if (params.length != ps.getParameterMetaData().getParameterCount() System.out.println(参数值与SQL语句的参数数量不匹配);return null;/ 参数赋值for (int i = 0; i params.length; i+) ps.setObject(i + 1, paramsi);/ 执行查询rs = ps.executeQuery();/ 获取ResultSet元数据对象ResultSetMetaData rsmd = rs.getMetaData();/ 创建存储结果集中列名的数组String columnNames = new Stringrsmd.getColumnCount();/ 判断结果集是否存在/ 对columnNames进行赋值for (int i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论