通用 实现RowMapper封装 查询结果

之前在网上搜索了许多 实现RowMapper接口 封装查询结果,其中ObjectRowMapper 对个别类的映射好用,但对某些映射是报错,根据报错发现 是ObjectRowMapper中没有对 Timestamp类型的字段结果的封装,于是研究其代码,加了一段对Timestamp类型的字段判断和封装就好了,下面是代码和测试代码,如果使用中报错,可通过测试代码找到缺少的类型的判断,在代码里加上就好。本人技术有限,言辞和注释 都是根据我个人理解,可能不对,勿怪!

→错的地方请指出,谢了,老铁们!


ObjectRowMapper (通用代码)

    package com.xdl.util;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;

import org.springframework.jdbc.core.RowMapper;

public class ObjectRowMapper implements RowMapper {
    private Class className;

    public ObjectRowMapper(Class className) {
        this.className = className;
    }

    public Object mapRow(ResultSet rs, int rowNum) throws SQLException {

        Object nt = new Object();
        Field[] fields = className.getDeclaredFields();// 只能获取自己声明的各种字段 字段名 、字段类型、包路径
        try {
            nt = className.newInstance(); // 创建此 Class 对象所表示的类的一个新实例
            // Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
            for (Field field : fields) {// field 相当于单个字段对象  可以.getName 获取字段名 
                //如果结果中没有改field项则跳过
                try {
                    // field.getName()字段名 将给定的ResultSet 列标签映射到其ResultSet 列索引
                    rs.findColumn(field.getName());
                } catch (Exception e) {
                    continue;
                }
                // 修改相应filed的权限,isAccessible 获取此对象的 accessible 标志的值。
                boolean accessFlag = field.isAccessible();
                // 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java语言访问检查。
                // 值为 false 则指示反射的对象应该实施 Java 语言访问检查。
                field.setAccessible(true);
                // .getString 以 Java 编程语言中 String 的形式获取此 ResultSet 对象的当前行中指定列的值
                String value = rs.getString(field.getName());
                value = value == null ? "" : value;
                // *******************************
                 // 调用下面的方法 nt--》为新建的object对象
                setFieldValue(nt, field, value);
                // *********************************
                // 恢复相应field的权限
                field.setAccessible(accessFlag);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return nt;
    }

    // ************************************************************************************
    public static void setFieldValue(Object form, Field field, String value) {

        //获取已转成String类型的     字段类型
        String elemType = field.getType().toString();

        //elemType 是否包含boolean 不包含 返回-1
        if (elemType.indexOf("boolean") != -1 || elemType.indexOf("Boolean") != -1) {
            try {
                //value值转换成 boolean类型
                field.set(form, Boolean.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("byte") != -1 || elemType.indexOf("Byte") != -1) {
            try {
                field.set(form, Byte.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("char") != -1 || elemType.indexOf("Character") != -1) {
            try {
                field.set(form, Character.valueOf(value.charAt(0)));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("double") != -1 || elemType.indexOf("Double") != -1) {
            try {
                field.set(form, Double.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("float") != -1 || elemType.indexOf("Float") != -1) {
            try {
                field.set(form, Float.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("int") != -1 || elemType.indexOf("Integer") != -1) {
            try {
                field.set(form, Integer.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("long") != -1 || elemType.indexOf("Long") != -1) {
            try {
                field.set(form, Long.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else if (elemType.indexOf("short") != -1 || elemType.indexOf("Short") != -1) {
            try {
                field.set(form, Short.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }// ↓↓↓↓↓↓ 下面这段就是我添加的Timestamp类型  ↓↓↓↓↓↓
        } else if (elemType.indexOf("timestamp") != -1 || elemType.indexOf("Timestamp") != -1) {
            try {
                field.set(form, Timestamp.valueOf(value));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
            //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
        else {
            try {
                // ***************************
                field.set(form, (Object) value);
                // ***************************
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}   

调试代码:

(找到ObjectRowMapper 中判断不存在的字段类型,再配上就好了!)
    @Test
    public void test3(){
        Field[] fields = XdlProduct.class.getDeclaredFields();// 只能获取自己声明的各种字段
        for (Field field : fields) {
            System.out.println("字段名:"+field.getName());
            System.out.println("字段类型:"+field.getType().toString());
            System.out.println("------------------------------");
        }
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值