Spring JDBCTemplet通用RowMapper帮助类
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帮助类的更多相关文章
- spring 中的 RowMapper
spring 中的 RowMapper sping中的RowMapper可以将数据中的每一行数据封装成用户定义的类. 我们在数据库查询中,如果返回的类型是用户自定义的类型(其实我们在数据库查询中 ...
- spring基于通用Dao的多数据源配置详解【ds1】
spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...
- 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫
前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ...
- spring+mybatis通用dao层、service层的实现
个人理解: 1.mybatis-spring.jar 提供了SqlSessionTemplate类该类可以对数据库进行CRUD操作(底层其实还是SqlSession) 2.我们可以集成SqlSessi ...
- 解析Spring第四天(Spring中的事物、Spring框架来管理模板类)
JDBC模板技术: Spring框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单 template 模板 都是Spring框架提供XxxTemplate 提供了JDBC模板,Sp ...
- DataAccess通用数据库访问类,简单易用,功能强悍
以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...
- 通用数据库操作类,前端easyui-datagrid,form
实现功能: 左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...
- Spring常用的接口和类(二)
七.BeanPostProcessor接口 当需要对受管bean进行预处理时,可以新建一个实现BeanPostProcessor接口的类,并将该类配置到Spring容器中. 实现BeanPostPro ...
- 一个通用数据库访问类(C#,SqlClient)
本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...
- C# 通用数据访问类(SqlHelper)
[转]C# 通用数据访问类(SqlHelper) 注:本文转自http://www.tzwhx.com/newOperate/html/3/31/312/13080.htmlVisual C# 动态操 ...
随机推荐
- MyBatis的Example类详解
Example类的定义? 第一次幕课网教程看到关于这方面教时,没有懂example起什么用,感觉不用example也可以查询了,后来认真一看才知道这是查询条件生成器 mybatis-generator ...
- JS案例-网页轮播图
鼠标经过轮播图模块,左右按钮提示,离开隐藏左右按钮 点击右侧按钮一次,图片往左播放一张,以此类推,左侧按钮同理 图片播放的同时,下面小圆圈模块跟随一起变化 点击小圆圈,可以播放相应图片 鼠标不经过轮播 ...
- Github登录 2FA(Two-Factor Authentication/两因素认证) 浏览器插件-已验证
Github登录 2FA(Two-Factor Authentication/两因素认证) 浏览器插件-已验证 chrome 装下这个扩展 身份验证器 https://chromewebstore.g ...
- [VueJsDev] 日志 - nginxConfig 配置文件备份
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html nginxConfig 配置文件备份 ::: details ...
- Apollo3-Blue-MCU芯片典型硬件电路解析
一 芯片简介 1.简介 Apollo3 Blue Wireless SoC是一款超低功耗无线mcu芯片,它的运行功耗降至6μA/ MHz以下.该器件采用ARM Cortex M4F内核,运行频率高达9 ...
- Django:Could not find backend 'django_redis.cache.RedisCache': cannot import name 'six'
1.报错内容: django.core.cache.backends.base.InvalidCacheBackendError: Could not find backend 'django_red ...
- NJUPT自控第一次积分赛的小总结(一)题目感受
快开学了事情真的好多啊 -_- 忙完积分赛就赶紧要去复习期末了...线代还是依托答辩啥都不懂 先看题目吧,RT,我们队(我)选择的是第一题(仅仅是因为很简单罢啦) 一开始看题目,心想不就调调pid吗, ...
- 记录--基于css3写出的流光登录(注释超详细!)
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 完整效果 对基本的表单样式进行设置 这里设置了基本的表单样式,外层用了div进行包裹,重点是运用了两个i元素在后期通过css样式勾画出一条 ...
- 记录--这样封装列表 hooks,一天可以开发 20 个页面
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 这样封装列表 hooks,一天可以开发 20 个页面 前言 在做移动端的需求时,我们经常会开发一些列表页,这些列表页大多数有着相似的功能: ...
- .NET分布式Orleans - 3 - Grain放置
在Orleans 7中,Grain放置是指确定将Grain对象放置在Orleans集群中的哪些物理节点上的过程. Grain是Orleans中的基本单位,代表应用程序中的逻辑单元或实体.Grain放置 ...