为什么写这一篇

问题一: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. Google APAC----Africa 2010, Qualification Round(Problem C. T9 Spelling)----Perl 解法

    原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p2 问题描述: Problem The Latin alphabe ...

  2. Remove Duplicates from Sorted List 去除链表中重复值节点

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  3. MySQL 常用语句大全

    MySQL 常用语句大全 一.连接 MySQL 格式: mysql -h 主机地址 -u 用户名 -p 用户密码 1.例 1:连接到本机上的 MYSQL. 首先在打开 DOS 窗口,然后进入目录 my ...

  4. Socket for android 简单实例

    最近在实现socket通信,所以写个demo来简单实现下.我用了一种是原始的socket实现,另一种是MINA框架来实现的. 下载demo:http://download.csdn.net/detai ...

  5. prince2的市场使用规模有多大?

    PRINCE2的使用和应用非常广泛.在过去的12个月里,超过60,000人参加了PRINCE2基础资格(Foundation)或从业资格(Practitioner)考试.现在每周参加考试的人数超过了2 ...

  6. linux 下MySQL的安装

    一.安装MySQL   1.下载源码包     从mysql官网上下载linux下的source包mysql-5.0.51b.tar.gz,注意是下载GNU tar格式的,不是rpm包.    2.解 ...

  7. Selenium2学习(一)-pip降级selenium3.0

    selenium版本安装后启动Firefox出现异常:'geckodriver' executable needs to be in PATH selenium默默的升级到了3.0,然而网上的教程都是 ...

  8. Java学习---面向对象的远程方法调用[RMI]

    基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...

  9. HTML学习---基础知识学习

    1.1. HTML 1.为什么要有HTML? "Hello" "<h1>Hello</h1>" - 浏览器渲染时使用一套HTML规则, ...

  10. Apache配置支持目录浏览

      主配置文件 httpd.conf 中修改: 1)添加支持模块 LoadModule autoindex_module modules/mod_autoindex.so LoadModule dir ...