干货 java jdbc ResultSet结果通过java反射赋值给java对象

在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以博主利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了。

因为很多情况下数据不止一条,所以返回的是对象类的一个集合。

需要注意的地方:在这里,数据库字段命名格式为:user_name 下划线格式,而java类型的命名格式为驼峰命名格式。

具体代码如下:

/**
	 * 把ResultSet的结果放到java对象中
	 * 
	 * @param <T>
	 * @param rs
	 *            ResultSet
	 * @param obj
	 *            java类的class
	 * @return
	 */
	public static <T> ArrayList<T> putResult(ResultSet rs, Class<T> obj) {
		try {
			ArrayList<T> arrayList = new ArrayList<T>();
			ResultSetMetaData metaData = rs.getMetaData();
			/**
			 * 获取总列数
			 */
			int count = metaData.getColumnCount();
			while (rs.next()) {
				/**
				 * 创建对象实例
				 */
				T newInstance = obj.newInstance();
				for (int i = 1; i <= count; i++) {
					/**
					 * 给对象的某个属性赋值
					 */
					String name = metaData.getColumnName(i).toLowerCase();
					name = toJavaField(name);// 改变列名格式成java命名格式
					String substring = name.substring(0, 1);// 首字母大写
					String replace = name.replaceFirst(substring, substring.toUpperCase());
					Class<?> type = obj.getDeclaredField(name).getType();// 获取字段类型
					Method method = obj.getMethod("set" + replace, type);
					/**
					 * 判断读取数据的类型
					 */
					if(type.isAssignableFrom(String.class)){
						method.invoke(newInstance, rs.getString(i));
					}else if(type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)){
						method.invoke(newInstance, rs.getInt(i));
					}else if(type.isAssignableFrom(Boolean.class) || type.isAssignableFrom(boolean.class)){
						method.invoke(newInstance, rs.getBoolean(i));
					}else if(type.isAssignableFrom(Date.class)){
						method.invoke(newInstance, rs.getDate(i));
					}
				}
				arrayList.add(newInstance);
			}
			return arrayList;

		} catch (InstantiationException | IllegalAccessException | SQLException | SecurityException
				| NoSuchMethodException | IllegalArgumentException | InvocationTargetException
				| NoSuchFieldException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return null;
	}
	/**
	 * 数据库命名格式转java命名格式
	 * 
	 * @param str
	 *            数据库字段名
	 * @return java字段名
	 */
	public static String toJavaField(String str) {


		String[] split = str.split("_");
		StringBuilder builder = new StringBuilder();
		builder.append(split[0]);// 拼接第一个字符


		// 如果数组不止一个单词
		if (split.length > 1) {
			for (int i = 1; i < split.length; i++) {
				// 去掉下划线,首字母变为大写
				String string = split[i];
				String substring = string.substring(0, 1);
				split[i] = string.replaceFirst(substring, substring.toUpperCase());
				builder.append(split[i]);
			}
		}


		return builder.toString();
	}

如何使用:

上面的方法存在C3P0PropertiesSimplifyHelps类里,putResult是一个静态方法,DeviceMsg是我自定义的po类(也是需要存放信息的po类

ArrayList<DeviceMsg> putResult = C3P0PropertiesSimplifyHelps.putResult(rs, DeviceMsg.class);

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值