映射篇:request-String-Object-Map之间相互转化(程序员的成长之路---第5篇)
为什么写这一篇
问题一: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篇)的更多相关文章
- JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换类
<pre name="code" class="java"></pre><pre name="code" cl ...
- 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be
当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- Java Bean与Map之间相互转化的实现
目录树 概述 Apache BeanUtils将Bean转Map Apache BeanUtils将Map转Bean 理解BeanUtils将Bean转Map的实现之手写Bean转Map 概述 Apa ...
- Json,String,Map之间的转换
前提是String的格式是map或json类型的 String 转Json JSONObject jasonObject = JSONObject.fromObject(str); String 转 ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- .Net程序员面试 每个人都应知道篇 (回答Scott Hanselman的问题)
昨天回答了Scott Hanselman在他清单上关于C#那部分的题目,.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题),今天接着回答他在清单上列出的"每个写 ...
- 程序员书单_java学习基础编程篇
Java程序设计语言.(美国)阿诺德.清晰版 http://download.csdn.net/detail/shenzhq1980/9076093 JAVA2核心技术第1卷.基础知识7th.part ...
- 程序员必备PC维修法(软件篇)
学会使用专业软件检测与修复电脑硬件故障问题也是程序员的一种软技能. windows篇 情景:如何获取电脑硬件的真实信息.(如何检验选购回来的硬件是否正品) 自检:使用AIDA64软件检查电脑硬件,能详 ...
随机推荐
- SPOJ:NSUBSTR - Substrings
题面 字符串$ S \(最多包含\) 25 \(万个小写拉丁字母.我们将\) F(x) \(定义为长度为\) x \(的某些字符串出现在\) s \(中的最大次数.例如,对于字符串\) "a ...
- svg矢量图标在html中的使用, (知识点:1.通过h5中的css实现点击变色,2.一个svg文件包含多个图标)
svg矢量文件体积小,不变形,比传统的png先进,比现在流行的icon-font灵活.然而在使用过程中还是遇到了很多坑.今天花了一天时间把经验整理出来,以供后来者借鉴.如果您从本文收益,请留言mark ...
- JSTL总结摘要
一 概述 1.什么是JSTL? JSP Standard Taglib,一个定义了一系列标签的标签库,以取代在JSP页面中嵌套的java代码,经常与EL结合使用,使页面风格统一,维护方便. JSTL标 ...
- 什么是首字节时间(TTFB)
第一字节响应时间(TTFB)=从发送请求到WEB服务器的时间+WEB服务器处理请求并生成响应花费的时间+WEB服务器生成响应到浏览器花费的时间测量第一字节响应时间(TTFB)的工具:http://ww ...
- GitHub初步探索-1-使用本地代码管理工具,简化上传的过程
使用GitHub对于我们写Java的同志们来说是一个非常好的代码存储的方式,但是因为是全英文的,操作起来有一点复杂,所以我不是经常使用 ,但是最近代码越敲越多,再加上老师要求,希望使用比较简单的方法来 ...
- EJB 官方API
http://download.oracle.com/otndocs/jcp/ejb-3_0-fr-eval-oth-JSpec/
- C# Razor 小笔记和某些细节
知识小结:C# 的主要 Razor 语法规则 单独一个变量直接使用 @a 的形式,无需加分号,一般是直接使用已有变量,注意在使用 html 标签时,要和 razor 表达式加一个空格. //不能有空格 ...
- UNIX crontab自动执行脚本
crontab 是不会加载环境变量的你手动执行可以是因为登录了oracle用户加载了环境变量,你可以在脚本里添加,echo $ORACLE_HOME echo $ORACLE_SID 等等试试,看看 ...
- 深入浅出SharePoint2010——请假系统无代码篇之权限设计
首选我们需要区分3个跟权限相关的概念. 权限项目(Permission):最小的权限粒度.比如创建列表项.审批等. 权限级别(Permission Level):权限项目不能直接赋予用户或者用户组,只 ...
- Angular2 constructor VS ngOnInit
constructor和ngOnInit钩子有什么不同? constructor constructor(构造函数)是ES6类或TypeScript类中的特殊方法,而不是Angular的方法,主要用来 ...