在不整合框架的情況下,使用jdbc從數據庫讀取數據時都得一個個的get和set,不僅累代碼還顯得不簡潔,所以利用java的反射機制寫了一個工具類,這樣用jdbc從數據庫拿數據的時候就不用那么麻煩了。
因為很多情況下數據不止一條,所以返回的是對象類的一個集合。
需要注意的地方:在這里,數據庫字段命名格式為:user_name 下划線格式,而java類型的命名格式為駝峰命名格式。
具體代碼如下:
package com.xc.sap.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import cnblogs.com.ooo0.oracle.OperateOracle; public class Test { public static void main(String[] args) { try { // oracle數據庫連接 OperateOracle oo = new OperateOracle();//https://www.cnblogs.com/ooo0/p/10225374.html Connection connection = oo.getConnection(); String mainSql = "select * from users"; PreparedStatement pstm = connection.prepareStatement(mainSql); ResultSet rs = pstm.executeQuery(); ArrayList<Users> putResult = ResultSetPropertiesSimplifyHelps.putResult(rs, Users.class); for (int i = 0; i < putResult.size(); i++) { System.out.println(putResult.get(i).toString()); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.xc.sap.util; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; /** * java jdbc ResultSet結果通過java反射賦值給java對象 * * @author xc */ public class ResultSetPropertiesSimplifyHelps { /** * 把ResultSet的結果放到java對象中 * * @param <T> * @param rs * ResultSet * @param obj * java類的class * @return */ public static <T> ArrayList<T> putResult(ResultSet rs, Class<T> obj) { try { ArrayList<T> arrayList = new ArrayList<T>(); ResultSetMetaData metaData = rs.getMetaData(); /** * 獲取總列數 */ int count = metaData.getColumnCount(); while (rs.next()) { /** * 創建對象實例 */ T newInstance = obj.newInstance(); for (int i = 1; i <= count; i++) { /** * 給對象的某個屬性賦值 */ String name = metaData.getColumnName(i).toLowerCase(); name = toJavaField(name);// 改變列名格式成java命名格式 String substring = name.substring(0, 1);// 首字母大寫 String replace = name.replaceFirst(substring, substring.toUpperCase()); Class<?> type = null; try { type = obj.getDeclaredField(name).getType();// 獲取字段類型 } catch (NoSuchFieldException e) { // Class對象未定義該字段時,跳過 continue; } Method method = obj.getMethod("set" + replace, type); /** * 判斷讀取數據的類型 */ if (type.isAssignableFrom(String.class)) { method.invoke(newInstance, rs.getString(i)); } else if (type.isAssignableFrom(byte.class) || type.isAssignableFrom(Byte.class)) { method.invoke(newInstance, rs.getByte(i));// byte 數據類型是8位、有符號的,以二進制補碼表示的整數 } else if (type.isAssignableFrom(short.class) || type.isAssignableFrom(Short.class)) { method.invoke(newInstance, rs.getShort(i));// short 數據類型是 16 位、有符號的以二進制補碼表示的整數 } else if (type.isAssignableFrom(int.class) || type.isAssignableFrom(Integer.class)) { method.invoke(newInstance, rs.getInt(i));// int 數據類型是32位、有符號的以二進制補碼表示的整數 } else if (type.isAssignableFrom(long.class) || type.isAssignableFrom(Long.class)) { method.invoke(newInstance, rs.getLong(i));// long 數據類型是 64 位、有符號的以二進制補碼表示的整數 } else if (type.isAssignableFrom(float.class) || type.isAssignableFrom(Float.class)) { method.invoke(newInstance, rs.getFloat(i));// float 數據類型是單精度、32位、符合IEEE 754標准的浮點數 } else if (type.isAssignableFrom(double.class) || type.isAssignableFrom(Double.class)) { method.invoke(newInstance, rs.getDouble(i));// double 數據類型是雙精度、64 位、符合IEEE 754標准的浮點數 } else if (type.isAssignableFrom(BigDecimal.class)) { method.invoke(newInstance, rs.getBigDecimal(i)); } else if (type.isAssignableFrom(boolean.class) || type.isAssignableFrom(Boolean.class)) { method.invoke(newInstance, rs.getBoolean(i));// boolean數據類型表示一位的信息 } else if (type.isAssignableFrom(Date.class)) { method.invoke(newInstance, rs.getDate(i)); } } arrayList.add(newInstance); } return arrayList; } catch (InstantiationException | IllegalAccessException | SQLException | SecurityException | NoSuchMethodException | IllegalArgumentException | InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 數據庫命名格式轉java命名格式 * * @param str * 數據庫字段名 * @return java字段名 */ public static String toJavaField(String str) { String[] split = str.split("_"); StringBuilder builder = new StringBuilder(); builder.append(split[0]);// 拼接第一個字符 // 如果數組不止一個單詞 if (split.length > 1) { for (int i = 1; i < split.length; i++) { // 去掉下划線,首字母變為大寫 String string = split[i]; String substring = string.substring(0, 1); split[i] = string.replaceFirst(substring, substring.toUpperCase()); builder.append(split[i]); } } return builder.toString(); } }
參考文章:
https://blog.csdn.net/a975261294/article/details/70049963
優化內容:
1.NoSuchFieldException異常處理,Class對象未定義該字段時,跳過
2.完善了大部分的基本數據類型的取值 http://www.runoob.com/java/java-basic-datatypes.html