1 import java.lang.reflect.Method;
2 import java.math.BigDecimal;
3 import java.math.BigInteger;
4 import java.sql.ResultSet;
5 import java.sql.ResultSetMetaData;
6 import java.sql.SQLException;
7 import java.text.SimpleDateFormat;
8 import java.util.ArrayList;
9 import java.util.Date;
10 import java.util.Iterator;
11 import java.util.List;
12 import java.util.Map;
13 import java.util.Map.Entry;
14
15 import org.springframework.jdbc.core.RowMapper;
16
17 public class SpringJdbcTempletHelper {
18
19 public static <T> RowMapper<T> getRowMapper(Class<T> clazz) {
20 if (clazz == null) {
21 return null;
22 }
23
24 return new RowMapper<T>() {
25 @Override
26 public T mapRow(ResultSet rs, int rowNum) throws SQLException {
27 try {
28
29 T bean = clazz.newInstance();
30
31 Method[] mds = clazz.getDeclaredMethods();
32 ResultSetMetaData metaData = rs.getMetaData();
33 for (int i = 1; i < metaData.getColumnCount(); i++) {
34 // resultSet数据下标从1开始
35 String columnName = metaData.getColumnName(i).replace("f_", "").replace("tb_", "")
36 .replace("_", "").toLowerCase();
37
38 Object val = null;
39 for (Method method : mds) {
40 String methodName = method.getName().replace("_", "").toLowerCase();
41 if (methodName.startsWith("set") && methodName.substring(3).equals(columnName)) {
42 Class<?> type = method.getParameterTypes()[0];
43 if (type == Integer.class) {
44 val = rs.getInt(i);
45 } else if (type == Long.class || type == BigInteger.class) {
46 val = rs.getLong(i);
47 } else if (type == BigDecimal.class) {
48 val = rs.getBigDecimal(i);
49 } else if (type == Double.class) {
50 val = rs.getDouble(i);
51 } else if (type == Float.class) {
52 val = rs.getFloat(i);
53 } else if (type == Boolean.class) {
54 val = rs.getBoolean(i);
55 } else if (type == Byte.class) {
56 val = rs.getByte(i);
57 } else if (type == Short.class) {
58 val = rs.getShort(i);
59 } else if (type == String.class) {
60 val = rs.getString(i);
61 } else if (type == Date.class) {
62 val = rs.getTimestamp(i);
63 } else {
64 val = rs.getShort(i);
65 }
66 if (val == null) {
67 break;
68 } else {
69 method.invoke(bean, val);
70 }
71 }
72 }
73 }
74 return bean;
75 } catch (Exception e) {
76 e.printStackTrace();
77 }
78 return null;
79 }
80 };
81 }
82
83 public static <T> List<T> converMapListToBeanList(List<Map<String, Object>> dataList, Class<T> clazz) {
84 List<T> lst = new ArrayList<>();
85
86 if (dataList == null || dataList.size() < 1 || clazz == null) {
87 return lst;
88 }
89
90 try {
91 // 获取实体bean所有声明的方法
92 Method[] mds = clazz.getDeclaredMethods();
93
94 for (Map<String, Object> data : dataList) {
95
96 // 迭代遍历map
97 Iterator<Entry<String, Object>> iterator = data.entrySet().iterator();
98 T obj = clazz.newInstance();
99
100 // 根据map的键去找以set开头包含map的键的set方法,过程中下划线不影响查找方法,大小写不影响查找
101 while (iterator.hasNext()) {
102 Map.Entry<java.lang.String, java.lang.Object> entry = (Map.Entry<java.lang.String, java.lang.Object>) iterator
103 .next();
104 String key = entry.getKey();
105 Object val = entry.getValue();
106
107 if (key == null || val == null) {
108 continue;
109 }
110
111 Method method = findSetMethod(key, mds);
112 if (method == null) {
113 continue;
114 }
115 // 反射调用字段的set方法
116
117 Class<?> t = method.getParameterTypes()[0];
118 if (t == val.getClass()) {
119 method.invoke(obj, val);
120 } else if (Number.class.isAssignableFrom(t)) {
121 if (t == Integer.class) {
122 val = Integer.valueOf(val.toString());
123 } else if (t == Long.class) {
124 val = Long.valueOf(val.toString());
125 } else if (t == Double.class) {
126 val = Double.valueOf(val.toString());
127 } else if (t == Float.class) {
128 val = Float.valueOf(val.toString());
129 } else {
130 val = Integer.valueOf(val.toString());
131 val = t.cast(val);
132 }
133 } else if (Date.class.isAssignableFrom(t)) {
134 SimpleDateFormat[] sdf = new SimpleDateFormat[] { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
135 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"),
136 new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"), new SimpleDateFormat("yyyy-MM-dd"),
137 new SimpleDateFormat("yyyy/MM/dd"), new SimpleDateFormat("HH:mm:ss"),
138 new SimpleDateFormat("HH:mm:ss.SSS"), };
139 for (SimpleDateFormat simpleDateFormat : sdf) {
140 try {
141 val = simpleDateFormat.format(val.toString());
142 } catch (Exception e) {
143 continue;
144 }
145 }
146 } else if (Boolean.class.isAssignableFrom(t)) {
147 if (val.toString().equals("0") || val.toString().equalsIgnoreCase("false")) {
148 val = false;
149 } else {
150 val = true;
151 }
152 }
153 }
154 lst.add(obj);
155 }
156 } catch (Exception e) {
157 e.printStackTrace();
158 }
159 return lst;
160 }
161
162 private static Method findSetMethod(String key, Method[] methods) {
163
164 String methodName = "";
165 String tmpKey = "";
166
167 for (Method method : methods) {
168 methodName = method.getName().replace("_", "").toLowerCase().substring(3);
169 tmpKey = key.toLowerCase().replace("_", "");
170
171 if (methodName.startsWith("set") && tmpKey.indexOf(methodName) > -1) {
172 return method;
173 }
174 }
175 return null;
176 }
177 }

Spring JDBCTemplet通用RowMapper帮助类的更多相关文章

  1. spring 中的 RowMapper

    spring 中的 RowMapper sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类.    我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中 ...

  2. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  3. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ...

  4. spring+mybatis通用dao层、service层的实现

    个人理解: 1.mybatis-spring.jar 提供了SqlSessionTemplate类该类可以对数据库进行CRUD操作(底层其实还是SqlSession) 2.我们可以集成SqlSessi ...

  5. 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)

    JDBC模板技术: Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 template 模板 都是Spring框架提供XxxTemplate 提供了JDBC模板,Sp ...

  6. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  7. 通用数据库操作类,前端easyui-datagrid,form

    实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...

  8. Spring常用的接口和类(二)

    七.BeanPostProcessor接口 当需要对受管bean进行预处理时,可以新建一个实现BeanPostProcessor接口的类,并将该类配置到Spring容器中. 实现BeanPostPro ...

  9. 一个通用数据库访问类(C#,SqlClient)

    本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...

  10. C# 通用数据访问类(SqlHelper)

    [转]C# 通用数据访问类(SqlHelper) 注:本文转自http://www.tzwhx.com/newOperate/html/3/31/312/13080.htmlVisual C# 动态操 ...

随机推荐

  1. 深入浅出Java多线程(十一):AQS

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第十一篇内容:AQS(AbstractQueuedSynchronizer).大家觉得有用请点赞,喜欢请关注!秀才在此谢 ...

  2. Dashboard、Rancher与KubeSphere对比

    在容器技术和微服务架构日益盛行的今天,对于容器编排和管理平台的选择显得尤为重要.Kubernetes(K8s)作为容器编排的事实标准,其生态系统中涌现出了许多管理和监控工具.其中,Dashboard. ...

  3. Ambiq Micro-AMA3B2KK-KBR芯片可穿戴产品解决方案开发之RTC时钟

    一 RTC   RTC的英文全称是Real-Time Clock,翻译过来是实时时钟芯片.绝大多数mcu芯片都集成了这个功能.在可穿戴产品中,时间往往是非常重要的因素,怎么让时间保持一直在运行,那就是 ...

  4. mybatis之Mapped Statements collection does not contain value for...错误原因分析

    错误原因有几种:  1.mapper.xml中没有加入namespace:  2.mapper.xml中的方法和接口mapper的方法不对应:  3.mapper.xml没有加入到mybatis-co ...

  5. 如何用数字人技术让课堂活起来?番职院和3DCAT实时云渲染给出答案

    2023年4月20日,广州市第二届智慧教育成果巡展活动在番禺职业技术学院(下文简称番职院)举行,本次活动的主题是''智能AI助教-让课堂活起来''. 活动现场,瑞云科技受邀展示了其自主研发的瑞云数字人 ...

  6. 记录--手写vm.$mount方法

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.概述 在我们开发中,经常要用到Vue.extend创建出Vue的子类来构造函数,通过new 得到子类的实例,然后通过$mount挂载到 ...

  7. Error in beforeDestroy hook: “Error: [ElementForm]unpected width “found in

    吹水,可忽略 当我尝试吧el-form中labelWidth设为auto时,刷新页面获取到了上面的错误 百思不得其解,我貌似没有在beforeDestroy进行操作,为何会报这个错误 果断各种百度,G ...

  8. 一个基于.NET Core构建的简单、跨平台、模块化的商城系统

    前言 今天大姚给大家分享一个基于.NET Core构建的简单.跨平台.模块化.完全开源免费(MIT License)的商城系统:Module Shop. 商城后台管理端功能 商品:分类.品牌.单位.选 ...

  9. C# 通用OCR识别 文字识别 中文识别

    软件说明 基于以下两个开源项目,做了再次封装 https://github.com/paddlepaddle/PaddleOCR PaddleOCRSharp: 本项目是一个基于PaddleOCR的C ...

  10. Oracle 索引原理

    B-Tree索引 一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点. 可以用下图一来描述B树索引的结构.其中,B表示分支节点,而L表示叶子节点. 对于分支节点块(包括根节点块)来说,其所 ...