MyRowMapper

package com.oracle.jdbc;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;

import org.springframework.jdbc.core.RowMapper;

/**
 * 
 * @author lxw
 */
public class MyRowMapper<T> implements RowMapper<T> {

	/**
	 * 添加字段註釋.
	 */
	private Class<?> targetClazz;

	/**
	 * 添加字段註釋.
	 */
	private HashMap<String, Field> fieldMap;

	/**
	 * 構造函數.
	 * 
	 * @param targetClazz
	 *            .
	 */
	public MyRowMapper(Class<?> targetClazz) {
		this.targetClazz = targetClazz;
		fieldMap = new HashMap<>();
		Field[] fields = targetClazz.getDeclaredFields();
		for (Field field : fields) {
			// 同時存入大小寫,如果表中列名區分大小寫且有列ID和列iD,則會出現異常。
			// 阿里開發公約,建議表名、字段名必須使用小寫字母或數字;禁止出現數字開頭,禁止兩個下劃線中間只出現數字。
			fieldMap.put(field.getName(), field);
			// fieldMap.put(getFieldNameUpper(field.getName()), field);
		}
	}

	/**
	 * {@inheritDoc}.
	 */
	@Override
	public T mapRow(ResultSet rs, int arg1) throws SQLException {
		T obj = null;

		try {
			obj = (T) targetClazz.newInstance();

			final ResultSetMetaData metaData = rs.getMetaData();
			int columnLength = metaData.getColumnCount();
			String columnName = null;

			for (int i = 1; i <= columnLength; i++) {
				columnName = metaData.getColumnName(i);
				Class fieldClazz = fieldMap.get(columnName).getType();
				Field field = fieldMap.get(columnName);
				field.setAccessible(true);

				// fieldClazz == Character.class || fieldClazz == char.class
				if (fieldClazz == int.class || fieldClazz == Integer.class) { // int
					field.set(obj, rs.getInt(columnName));
				} else if (fieldClazz == boolean.class || fieldClazz == Boolean.class) { // boolean
					field.set(obj, rs.getBoolean(columnName));
				} else if (fieldClazz == String.class) { // string
					field.set(obj, rs.getString(columnName));
				} else if (fieldClazz == float.class) { // float
					field.set(obj, rs.getFloat(columnName));
				} else if (fieldClazz == double.class || fieldClazz == Double.class) { // double
					field.set(obj, rs.getDouble(columnName));
				} else if (fieldClazz == BigDecimal.class) { // bigdecimal
					field.set(obj, rs.getBigDecimal(columnName));
				} else if (fieldClazz == short.class || fieldClazz == Short.class) { // short
					field.set(obj, rs.getShort(columnName));
				} else if (fieldClazz == Date.class) { // date
					field.set(obj, rs.getDate(columnName));
				} else if (fieldClazz == Timestamp.class) { // timestamp
					field.set(obj, rs.getTimestamp(columnName));
				} else if (fieldClazz == Long.class || fieldClazz == long.class) { // long
					field.set(obj, rs.getLong(columnName));
				}

				field.setAccessible(false);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return obj;
	}

	/**
	 * 方法首字母大寫.
	 * 
	 * @param fieldName
	 *            字段名.
	 * @return 字段名首字母大寫.
	 */
	private String getFieldNameUpper(String fieldName) {
		char[] cs = fieldName.toCharArray();
		cs[0] -= 32; // 方法首字母大寫
		return String.valueOf(cs);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章