日期:2014-05-16  浏览次数:20469 次

Mysql JDBC驱动源码分析(处理结果集)五

一,现在已经返回了结果集,接下来是对返回数据的分析

ResultSet.next()只不过是对rowData集合的操作

?

public synchronized boolean next() throws SQLException {
		checkClosed();

		if (this.onInsertRow) {
			this.onInsertRow = false;
		}

		if (this.doingUpdates) {
			this.doingUpdates = false;
		}

		boolean b;

		if (!reallyResult()) {
			throw SQLError.createSQLException(
					Messages
							.getString("ResultSet.ResultSet_is_from_UPDATE._No_Data_115"),
					SQLError.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor()); //$NON-NLS-1$
		}

		if (this.thisRow != null) {
			this.thisRow.closeOpenStreams();
		}
		
		if (this.rowData.size() == 0) {
			b = false;
		} else {
          //下一行数据
			this.thisRow = this.rowData.next();
			
			if (this.thisRow == null) {
				b = false;
			} else {
				clearWarnings();
				
				b = true;
				
			}
		}

		setRowPositionValidity();
		
		return b;
	}

以ResultSet.getByte("")获取数据为例

?

?

//findColumn()方法,会找到相应的索引位置
public byte[] getBytes(String columnName) throws SQLException {
		return getBytes(findColumn(columnName));
	}

?public byte getByte(int columnIndex) throws SQLException {

		if (!this.isBinaryEncoded) {
                       //先通getString获取
			String stringVal = getString(columnIndex);

			if (this.wasNullFlag || (stringVal == null)) {
				return 0;
			}

			return getByteFromString(stringVal, columnIndex);
		}

		return getNativeByte(columnIndex);
	}
//===========
//通过索引位置获取字符串值
public String getString(int columnIndex) throws SQLException {
		String stringVal = getStringInternal(columnIndex, true);
		
		if (this.padCharsWithSpace && stringVal != null) {
			Field f = this.fields[columnIndex - 1];
			
			if (f.getMysqlType() == MysqlDefs.FIELD_TYPE_STRING ) {
				int fieldLength = (int)f.getLength() /* safe, bytes in a CHAR <= 1024 */ / 
					f.getMaxBytesPerCharacter(); /* safe, this will never be 0 */
				
				int currentLength = stringVal.length();
				
				if (currentLength < fieldLength) {
					StringBuffer paddedBuf = new StringBuffer(fieldLength);
					paddedBuf.append(stringVal);
					
					int difference = fieldLength - currentLength;
					
					paddedBuf.append(EMPTY_SPACE, 0, difference);
					
					stringVal = paddedBuf.toString();
				}
			}
		}
		
		return stringVal;
	}


//==================
	protected String getStringInternal(int columnIndex, boolean checkDateTypes)
			throws SQLException {
		if (!this.isBinaryEncoded) {
			checkRowPos();
			checkColumnBounds(columnIndex);

			if (this.fields == null) {
				throw SQLError.createSQLException(
						Messages
								.getString("ResultSet.Query_generated_no_fields_for_ResultSet_99"), //$NON-NLS-1$
						SQLError.SQL_STATE_INVALID_COLUMN_NUMBER, getExceptionInterceptor());
			}

			// JDBC is 1-based, Java is not !?
			
			int internalColumnIndex = columnIndex - 1;
			
			if (this.thisRow.isNull(internalColumnIndex)) {
				this.wasNullFlag = true;

				return null;
			}

			this.wasNullFlag = false;

			//获取到相应的字段属性类
			Field metadata = this.fields[internalColumnIndex];
			
			String stringVal = null;
			
			if (metadata.getMysqlType() == MysqlDefs.FIELD_TYPE_BIT) {
				if (metadata.isSingleBit()) {
					byte[] value = this.thisRow.getColumnValue(internalColumnIndex);
					
					if (value.length == 0) {
						return String.valueOf(convertToZeroWithEmptyCheck());
					}
					
					return String.valueOf(value[0]);
				}
				
				return String.valueOf(getNumericRepresentationOfSQLBitType(columnIndex));
			}
			
			String encoding = metadata.getCharacterSet();
                  
                        //在根据next()操作时指定的thisRow中获取相应的数据(BufferRow)
			stringVal = this.thisRow.getString(internalColumnIndex, encoding, this.connection);

			//
			// Special handling for YEAR type from mysql, some people
			// want it as a DATE, others want t