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# 动态操 ...
随机推荐
- .Net 5.0 程序在 Linux 环境访问 SqlServer 2008R2 莫名报错:Connection reset by peer
〇.问题详情 同样的代码,在 Windows 上运行的好好的,拿到 CentOS 7 上运行就出现如下报错: [ex.message]:A connection was successfully es ...
- GaussDB(DWS)集群通信:详解pooler连接池
本文分享自华为云社区<GaussDB(DWS) 集群通信系列一:pooler连接池>,作者:半岛里有个小铁盒. 1.前言 适用版本:[8.1.0(及以上)] GaussDB(DWS) 为M ...
- git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决
git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决 当多人写一个项目,最好还是关掉vscode ...
- 引领汽车营销新趋势,3DCAT实时云渲染助力汽车三维可视化
当前,汽车产业发展正从电动化的上半场,向智能化的下半场迈进.除了车机技术体验的智能化之外,观车体验的智能化也不容忽视. 这是因为,随着数字化.智能化.个性化的趋势,消费者对汽车的需求和期待也越来越高, ...
- python基础四(字符编码)
一 了解字符编码的知识储备 计算机基础知识 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都 ...
- JDBC反序列化
JDBC反序列化攻击 介绍 JDBC(Java DataBase Connectivity)是一种用于执行Sql语句的Java Api,即Java数据库连接,是Java语言中用来规范客户端程序如何来访 ...
- 使用MFT进行加密文件传输的7个好处
至少,托管文件传输(MFT)解决方案是一种产品,它包含入站和出站文件传输的所有方面,同时使用行业标准的网络协议和无缝加密.它可以从单个集中管理点在您的网络,系统,应用程序,贸易伙伴和云环境中自动化和传 ...
- 标准库unsafe:带你突破golang中的类型限制
本文分享自华为云社区<突破语言golang中的类型限制>,作者:码乐. 1 简介 在使用c语言编程时,常常因为类型的问题大伤脑筋,而其他语言比如java,python默认类型又是难以改变的 ...
- 【Learning eBPF-1】什么是 eBPF?为什么它很吊?
本书中, eBPF 被称为一种 革命性的 内核技术,被广泛应用于网络.观测 和 安全工具中. 这种技术允许你在不重新编译内核的情况下,使能你的自定义工具,与内核数据进行交互.听起来很厉害. 1.1 追 ...
- List和ObservableCollection的转换
1.我们后台查询全部List数据的时候,前台需要ObservableCollection展示 这个时候List需要转换成ObservableCollection public static Obser ...