一直在考虑如何查找一行或多行数据,并把这些数据按需求拼成插入或者修改语句。在参考了java.sql.ResultSetMetaData的API后,总算是实现了。
再来看下它的典型应用:
- ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
- ResultSetMetaData rsmd = rs.getMetaData();
- int numberOfColumns = rsmd.getColumnCount();
- boolean b = rsmd.isSearchable(1);
其实个人认为ResultSetMetaData完全可以理解为一个列结果集,其中getColumnCount()方法用于获取这个结果集的列数
以下为一些常用方法:
- getColumnName
- String getColumnName(int column)
- throws SQLException获取指定列的名称。
- 参数:
- column - 第一列是 1,第二个列是 2,……
- 返回:
- 列名称
- 抛出:
- SQLException - 如果发生数据库访问错误
- isSearchable
- boolean isSearchable(int column)
- throws SQLException指示是否可以在 where 子句中使用指定的列。
- 参数:
- column - 第一列是 1,第二个列是 2,……
- 返回:
- 如果是这样,则返回 true;否则返回 false
- 抛出:
- SQLException - 如果发生数据库访问错误
所以可以利用这个接口完成类似于JAVA反射机制的动态获取表数据的操作,以下代码仅供参考:
- public String getInsertSql(String 列名, String 列值,String 表名) {
- Connection conn = getConnection();
- Statement st=null;
- ResultSet rs=null;
- ResultSetMetaData metaData = null;
- try{
- st=conn.createStatement();
- rs=st.executeQuery("select * from "+tableName+" where "+columnName+" = "+columnValue);
- metaData=rs.getMetaData();
- result.append("(");
- for(int i=1;i<=metaData.getColumnCount();i++){
- if(i!=metaData.getColumnCount()){
- result.append(metaData.getColumnName(i).toLowerCase()+",");
- }else{
- result.append(metaData.getColumnName(i).toLowerCase());
- }
- }
- result.append(")");
- result.append(" values (");
- for(int i=1;i<=metaData.getColumnCount();i++){
- //TODO:日期类型怎么处理?
- try{
- result.append("'"+nvlToString(rs.getString(i))+"'");
- }catch(Exception e){
- java.util.Date date=rs.getDate(i);
- result.append("'"+format.format(date)+"'");
- }
- if(i!=metaData.getColumnCount()) result.append(",");
- }
- result.append(")");
- //关闭数据库连接(略过)
- }