java resultset 映射到实例_Java中,将ResultSet映射为对象和队列及其他辅助函数

关于对象关系映射(ORM)在数据库访问中用到的最多,在Java中,很多库都试图将一个ResultSet映射为一个自定义的Java Bean对象或队列,下面是我的实现

1 从ResultSet中读取数据

首先是,如何能正确的从ResultSet中读取到自己想要的数据,包括已知列序号和已知列名的情况.

已知列序号,读取ResultSet中的数据值:

public static T ReadValue(Class t, ResultSet set, int columnIndex) throws SQLException;

已知列名,读取 ResultSet中的数据值:

public static T ReadValue(Class t, ResultSet set, Map columns, String field)

columns中存储这列索引与列名的对应关系,如果该参数为空,则自己创建这样一个队列.

下面是实现

/**

* 取得ResultSet中的值

* @param t

* @param set

* @param columnIndex

* @return

* @throws SQLException

*/

@SuppressWarnings("unchecked")

public static T ReadValue(Class t, ResultSet set, int columnIndex) throws SQLException {

if (t == null || set == null) {

return null;

}

if (t == Object.class) {

return (T)set.getObject(columnIndex);

}

if (t == Integer.class) {

Object val = set.getInt(columnIndex);

return (T)val;

}

if (t == short.class) {

Object val = set.getShort(columnIndex);

return (T)val;

}

if (t == Boolean.class) {

Object val = set.getBoolean(columnIndex);

return (T)val;

}

if (t == long.class) {

Object val = set.getLong(columnIndex);

return (T)val;

}

if (t == float.class) {

Object val = set.getFloat(columnIndex);

return (T)val;

}

if (t == double.class) {

Object val = set.getDouble(columnIndex);

return (T)val;

}

if (t == String.class) {

Object val = set.getString(columnIndex);

return (T)val;

}

if (t == java.sql.Date.class) {

Object val = set.getDate(columnIndex);

return (T)val;

}

if (t == java.sql.Time.class) {

Object val = set.getTime(columnIndex);

return (T)val;

}

if (t == java.sql.Timestamp.class) {

Object val = set.getTimestamp(columnIndex);

return (T)val;

}

if (t == Byte.class) {

Object val = set.getByte(columnIndex);

return (T)val;

}

return (T)set.getObject(columnIndex);

}

/**

* 取得ResultSet中的值

* @param t

* @param set

* @param columns

* @param field

* @return

* @throws SQLException

*/

public static T ReadValue(Class t, ResultSet set, Map columns, String field) throws SQLException {

if (columns == null) {

columns = GetFieldIndex(set);

}

if (columns == null) {

return null;

}

if (!columns.containsKey(field)) {

return null;

}

int index = columns.get(field);

return ReadValue(t, set, index);

}

/**

* 取得列名对应的列索引

* @param set

* @return

* @throws SQLException

*/

public static Map GetFieldIndex(ResultSet set) throws SQLException {

if (set == null) {

return null;

}

ResultSetMetaData meta = set.getMetaData();

if (meta == null) {

return null;

}

Map map = new HashMap();

int count = meta.getColumnCount();

for (int i = 0; i < count; i++) {

map.put(meta.getColumnName(i), i);

}

return map;

}

其实GetFieldIndex还是可以扩展的,例如包含数据的类型,暂时不需要,也没有进行扩展.

2 数据到对象的映射

下面是数据到对象的映射

接口:

/**

* 根据ResultSet装载对象

* @param cls

* @param t

* @param set

* @param columns

* @return

* @throws SQLException

*/

public static boolean FillObject(Class cls, T t, ResultSet set, Map columns) throws SQLException

实现:

/**

* 根据ResultSet装载对象

* @param cls

* @param t

* @param set

* @param columns

* @return

* @throws SQLException

*/

public static boolean FillObject(Class cls, T t, ResultSet set, Map columns) throws SQLException {

if (cls == null || t == null || set == null) {

return false;

}

if (columns == null) {

columns = GetFieldIndex(set);

}

final Map cols = columns;

return HiCBO.FillObjectEx(t, cls, new IEventRet8Param(){

@Override

public final Object OnEvent(String v) {

try {

return ReadValue(Object.class, set, cols, v);

} catch (Exception ex) {

ex.printStackTrace();

return null;

}

}

});

}

/**

* 创建并装载对象数据

* @param cls

* @param set

* @return

*/

public static T CreateObject(Class cls, ResultSet set, Map columns) {

try

{

T t = cls.newInstance();

FillObject(cls, t, set, columns);

return t;

} catch (Exception ex) {

ex.printStackTrace();

return null;

}

}

注: CreateObject中,如果T没有默认构造函数,则会存在问题,编译时期不会进行错误提示,这一点需要注意.

取得队列:

/**

* 取得Set的列表

* @param cls

* @param set

* @return

* @throws SQLException

*/

public static List GetResultsList(Class cls, ResultSet set) throws SQLException {

if (cls == null || set == null) {

return null;

}

Map columns = GetFieldIndex(set);

if (columns == null) {

return null;

}

if (!set.first()) {

return null;

}

List list = new ArrayList();

T t = GetFirst(cls, set, columns);

if (t != null) {

list.add(t);

}

while (set.next()) {

T it = CreateObject(cls, set);

if (it != null) {

list.add(it);

}

}

return list;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值