为什么写这一篇

问题一:jdbc连接数据库返回的对象是ResultSet,如何把ResultSet对象中的值转换为我们自建的各种实体类?

我估计,80%的程序员会写jdbc数据库连接,但开发项目依然用spring、hibernate、 mybatis等开源框架封装的数据库连接。

在你能写一套足够好的数据库连接池进行数据库增删改查的时候,我并不认为开源框架会比你写的数据库连接效率快多少。那大部分人为什么没有用自己写的数据库连接池?

“拿来主义”,确实让我们的工作轻松了很多。

当我们被简单的“拿来主义”充满头脑的时候,一旦出现开源框架的数据库连接不能满足我们的项目需求的时候,谁来负责底层框架的修改?

...其他的不多说了,总之每个人都有不同的推脱理由。

jdbc连接数据库返回的对象是ResultSet,如何能把ResultSet对象中的值转换为我们自建的各种实体类的值呢?

问题二:

User user = new User();
user.setName("张三");
user.setAge(20);
user.setAdress("中国山东济南");
System.out.println(user);
以上代码,
希望打印出的結果:name=张三,age=20,adress=中国山东济南
实际打印出的結果:com.keji10.core.commons.User@7852e922

总之说了这么多。只是为了体现映射在我们日常敲代码的过程中的重要性 --<-<-<@

类方法:

类代码:

package com.keji10.core.commons;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.keji10.core.exception.RefertException; /**
* 类描述:
*
* @since 1.5
* @version 1.0
* @author xuanly
*
*/
public abstract class BeanHelper { /**
* 把对象toString
*
* @param object 对象
* @return 对象转换为String的类型
* @throws Exception
*/
public static String toString(Object object) throws RefertException {
if (object == null) {
return null;
}
StringBuffer sb = new StringBuffer();
Class c = object.getClass();
Method[] methods = c.getMethods();
Field[] fields = c.getDeclaredFields();
String fieldName, methodName;
Method method;
Field field;
for (int i = 0; i < fields.length; i++) {
field = fields[i];
fieldName = field.getName();
for (int j = 0; j < methods.length; j++) {
method = methods[j];
methodName = method.getName();
if (methodName.toUpperCase().endsWith("GET" + fieldName.toUpperCase())) {
try {
sb.append(fieldName + "=" + method.invoke(object));
} catch (Exception e) {
throw new RefertException("映射新对象" + c + "失败,列名:" + fieldName + ",方法名:" + methodName + "/n" + e);
}
break;
}
}
if (i < fields.length - 1) {
sb.append(",");
}
}
return sb.toString();
} /**
* 把String类型转换成map(只需键值对)
*
* @param stringByMap 键值对的形式,中间用英文逗号分隔
* @return map
*/
public static Map refertForMap(String stringByMap) {
// 验证输入,若是空,返回null
if (Validate.isNull(stringByMap)) {
return null;
}
// 根据“,”分隔开每一组数值
String[] keyValues = stringByMap.split(",");
// 定义返回类型
Map map = new HashMap();
for (int i = 0; i < keyValues.length; i++) {
// 根据“=”分隔开key和value值
// 存放每一组数值
String[] key_value = keyValues[i].split("=");
// 如果不存在key或value则继续下次组装
if (key_value.length != 2) {
continue;
}
// 存放key和value
String key;
// 把key值去除空格,并转成大写
try {
key = key_value[0].trim().toUpperCase();
} catch (RuntimeException e) {
continue;
}
// 获取value值
String value = key_value[1];
// 存入map
map.put(key, value);
}
// 返回map
return map;
} /**
* 把String类型转换成对象
*
* @param stringByObject 键值对的形式,中间用英文逗号分隔
* @param obj 要映射的对象
* @return Object 映射后的对象
* @throws Exception
*/
public static Object refertForObject(String stringByObject, Object obj) throws RefertException {
if ("java.lang.Class".equals(obj.getClass().getName())) {
throw new RefertException("Object不应为java.lang.Class类型");
}
// 验证输入,若是空,返回null
if (Validate.isNull(stringByObject)) {
return null;
}
// 根据“,”分隔开每一组数值
String[] keyValues = stringByObject.split(",");
// 存放key和value
String key, value;
// 定义返回类型
for (int i = 0; i < keyValues.length; i++) {
// 根据“=”分隔开key和value值
// 存放每一组数值
String[] key_value = keyValues[i].split("=");
// 如果不存在key或value则继续下次组装
if (key_value.length != 2) {
continue;
}
// 把key值去除空格,并转成大写
try {
key = key_value[0].trim().toUpperCase();
} catch (RuntimeException e) {
continue;
}
// 获取value值
value = key_value[1];
// 存入map
setObject(key, value, obj);
}
// 返回map
return obj;
} /**
* 把request映射成map
*
* @param request
* @return
* @throws RefertException
*/
public static Map refertForMapByRequest(HttpServletRequest request) throws RefertException {
try {
// 获取页面上的所有name值
Enumeration pNames = request.getParameterNames();
// 存放符合条件的name-value映射值
Map initMap = new HashMap();
// 获取页面的操作类型
// 遍历页面所有的name值
while (pNames.hasMoreElements()) {
// 获取当前要验证的name值
String name = (String) pNames.nextElement();
String value = request.getParameter(name);
initMap.put(name.toUpperCase(), value);
}
// 返回map
return initMap;
} catch (Exception e) {
throw new RefertException("获取页面信息失败\n" + e);
}
} /**
* 把request映射成Object
*
* @param request
* @param obj
* @return
* @throws RefertException
*/
public static Object refertForObjectByRequest(HttpServletRequest request, Object obj) throws RefertException {
try {
Map map = refertForMapByRequest(request);
refertForObjectByMap(map, obj);
return obj;
} catch (Exception e) {
throw new RefertException(e);
}
} /**
* 把Object映射成Map
*
* @param object
* @return
* @throws RefertException
*/
public static Map<String, Object> refertForMapByObject(Object object) throws RefertException {
if (object == null) {
return null;
}
Map<String, Object> map = new HashMap<String, Object>();
Class c = object.getClass();
Method[] methods = c.getMethods();
Field[] fields = c.getDeclaredFields();
String fieldName, methodName;
Method method;
Field field;
for (int i = 0; i < fields.length; i++) {
field = fields[i];
fieldName = field.getName();
for (int j = 0; j < methods.length; j++) {
method = methods[j];
methodName = method.getName();
if (methodName.toUpperCase().endsWith("GET" + fieldName.toUpperCase())) {
try {
map.put(fieldName, method.invoke(object));
} catch (Exception e) {
throw new RefertException("映射新对象" + c + "失败,列名:" + fieldName + ",方法名:" + methodName + "/n" + e);
}
break;
}
}
}
return map;
} /**
* 把map映射成对象
*
* @param map 映射源内容
* @param obj 映射成的对象
* @return obj
* @throws RefertException
*/
public static Object refertForObjectByMap(Map<Object, Object> map, Object obj) throws RefertException {
try {
if (Validate.isNull(map))
return null;
if (Validate.isNull(obj))
return null;
if ("java.lang.Class".equals(obj.getClass().getName()))
throw new RefertException("Object不应为java.lang.Class类型");
for (Map.Entry<Object, Object> e : map.entrySet()) {
String key = e.getKey().toString();
Object value = e.getValue();
setObject(key, value, obj);
}
return obj;
} catch (Exception e) {
throw new RefertException(e);
}
} /**
* 映射对象
*
* @param name 映射的名称
* @param value 映射的值
* @param obj 映射的对象
* @return 映射完成的对象
* @throws RefertException
*/
private static Object setObject(String name, Object value, Object obj) throws RefertException {
Class c = obj.getClass();
String setName;
name = "SET" + name;
name = name.toUpperCase();
Method[] methods = c.getDeclaredMethods();
Method method;
String valueType = value.getClass().getName();
for (int i = 0; i < methods.length; i++) {
method = methods[i];
setName = method.getName().toUpperCase();
if (name.equals(setName)) {
Class[] pts = method.getParameterTypes();
if (pts.length != 1) {
throw new RefertException("映射新对象" + c + "失败,name=" + name + "的传入参数不唯一,映射失败\n");
}
String parameterType = pts[0].getTypeName();
if (parameterType.equals(valueType)) {
// 对象接收值类型与传入值类型相同
} else if ("java.util.Map".equals(parameterType) && Map.class.isAssignableFrom(value.getClass())) {
// 对象接收值类型map是传入值的父类
} else if ("java.util.List".equals(parameterType) && List.class.isAssignableFrom(value.getClass())) {
// 对象接收值类型list是传入值的父类
} else if ("java.lang.Object".equals(parameterType)) {
// 对象接收值类型object
} else if ("java.lang.String".equals(value.getClass().getName())) {
try {
if ("byte".equals(parameterType)) {
value = Byte.valueOf((String) value);
} else if ("short".equals(parameterType)) {
value = Short.valueOf((String) value);
} else if ("int".equals(parameterType)) {
value = Integer.valueOf((String) value);
} else if ("long".equals(parameterType)) {
value = Long.valueOf((String) value);
} else if ("float".equals(parameterType)) {
value = Float.valueOf((String) value);
} else if ("double".equals(parameterType)) {
value = Double.valueOf((String) value);
} else if ("char[]".equals(parameterType)) {
value = value.toString().toCharArray();
} else if ("boolean".equals(parameterType)) {
value = Boolean.valueOf((String) value);
} else if ("double".equals(parameterType)) {
value = Double.valueOf((String) value);
} else {
// map不支持(map内嵌套map,对map根据逗号进行拆分时出错)
throw new RefertException();
}
} catch (Exception e) {
StringBuffer refertLogger = new StringBuffer();
refertLogger.append("映射新对象" + c + "失败,");
refertLogger.append("name=" + name + ",");
refertLogger.append(valueType + "强转为" + parameterType + "失败");
throw new RefertException(refertLogger.toString());
}
} else {
StringBuffer refertLogger = new StringBuffer();
refertLogger.append("映射新对象" + c + "失败,");
refertLogger.append("name=" + name + ",");
refertLogger.append(valueType + "强转为" + parameterType + "失败");
throw new RefertException(refertLogger.toString());
}
try {
method.invoke(obj, value);
break;
} catch (Exception e) {
StringBuffer refertLogger = new StringBuffer();
refertLogger.append("映射新对象" + c + "失败,");
refertLogger.append("name=" + name + "。");
throw new RefertException(refertLogger.toString());
}
}
}
return obj;
}
}

生命不息,奋斗不止

映射篇:request-String-Object-Map之间相互转化(程序员的成长之路---第5篇)的更多相关文章

  1. JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换类

    <pre name="code" class="java"></pre><pre name="code" cl ...

  2. 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be

    当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...

  3. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  4. Java Bean与Map之间相互转化的实现

    目录树 概述 Apache BeanUtils将Bean转Map Apache BeanUtils将Map转Bean 理解BeanUtils将Bean转Map的实现之手写Bean转Map 概述 Apa ...

  5. Json,String,Map之间的转换

    前提是String的格式是map或json类型的 String 转Json JSONObject  jasonObject = JSONObject.fromObject(str); String 转 ...

  6. python成长之路第三篇(1)_初识函数

    目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...

  7. .Net程序员面试 每个人都应知道篇 (回答Scott Hanselman的问题)

    昨天回答了Scott Hanselman在他清单上关于C#那部分的题目,.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题),今天接着回答他在清单上列出的"每个写 ...

  8. 程序员书单_java学习基础编程篇

    Java程序设计语言.(美国)阿诺德.清晰版 http://download.csdn.net/detail/shenzhq1980/9076093 JAVA2核心技术第1卷.基础知识7th.part ...

  9. 程序员必备PC维修法(软件篇)

    学会使用专业软件检测与修复电脑硬件故障问题也是程序员的一种软技能. windows篇 情景:如何获取电脑硬件的真实信息.(如何检验选购回来的硬件是否正品) 自检:使用AIDA64软件检查电脑硬件,能详 ...

随机推荐

  1. bsgs(Baby Steps Giant Steps)算法

    BSGS算法(Baby Steps Giant Steps算法,大步小步算法,北上广深算法,拔山盖世算法) 适用问题 对于式子: $$x^y=z(mod_p)$$ 已知x,z,p,p为质数: 求解一个 ...

  2. MATLAB简易验证码识别程序介绍

    本推文主要识别的验证码是这种: 第一步: 二值化 所谓二值化就是把不需要的信息通通去除,比如背景,干扰线,干扰像素等等,只剩下需要识别的文字,让图片变成2进制点阵. 第二步: 文字分割 为了能识别出字 ...

  3. this keyword details

    学生类: package com.itheima_07; /* * 学生类 * * 起名字我们要求做到见名知意. * 而我们现在的代码中的n和a就没有做到见名知意,所以我要改进. * * 如果有局部变 ...

  4. Android N(API level 24.)废弃了Html.fromHtml(String)

    从API level 24开始,fromHtml(String)被废弃,使用fromHtml(String source, int flags) 代替 flags: FROM_HTML_MODE_CO ...

  5. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境

    1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...

  6. JS Error 内置异常类型 处理异常 Throw语句

    Exceptional Exception Handling in JavaScript       MDN资料 Anything that can go wrong, will go wrong. ...

  7. 一、angularjs基础了解

    说明:此处比较杂,目前没有统一的总结哦 angularjs 是mvvm框架 加载JS文件总是使用后缀为.min.js的文件,因为这些文件是经过压缩的,能提升应用的启动速度 模块说明: 1.config ...

  8. D3 JS study notes

    如何使用d3来解析自定义格式的数据源? var psv = d3.dsvFormat("|"); // This parser can parse pipe-delimited t ...

  9. Azure 中快速搭建 FTPS 服务

    FTP,FTPS 与 SFTP 的区别 FTP (File Transfer Protocol)是一种常用的文件传输协议,在日常工作中被广泛应用.不过,FTP 协议使用明文传输.如果文件传输发生在公网 ...

  10. Azure School 终于上线了,物联网开发课程先走一波~

    要说目前最热门的技术是什么,物联网(IoT)肯定荣登榜首!老牌科技企业早已涉足,新晋初创公司层出不穷,就连很多传统企业也开始试水这一领域…… 物联网,说小其实挺小,工业仪表.汽车飞机,甚至家用电器,专 ...