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 }