,此次升級為瞭解決查詢時每次都要轉成對象集合,實現方式泛型加反射(那個流行的架構又沒用到反射呢),能反射對象就能反射SQL語句,能反射SQL語句你和hibernate架構就很接近
package com.sun.dao;import java.lang.reflect.Method;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Vector;/*** @author sun bo* @version 1.3, 2015/12/21* 這次升級為瞭解決每次查詢是都要換成對象集合的煩惱*/public class BaseDao<T>{ final String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; private String ip = "localhost"; private String databaseName; private String user = "sa"; private String password = "123456"; /** * 用於構建串連資料庫 * * @param ip * 資料庫地址 * @param databaseName * 資料庫的庫名 * @param user * 資料庫登陸使用者名稱 * @param password * 資料庫密碼 */ public BaseDao(String ip, String databaseName, String user, String password) { super(); this.ip = ip; this.databaseName = databaseName; this.user = user; this.password = password; } /** * 這個構造用於串連原生資料庫 * * @param databaseName * :資料庫名 */ public BaseDao(String databaseName) { super(); this.databaseName = databaseName; } /** * 用於建立連線物件 * * @return Connection * @throws SQLException */ private Connection createConnection() throws SQLException { return DriverManager.getConnection("jdbc:sqlserver://" + ip + ":1433;database=" + databaseName, user, password); } /** * 此方法只能用於查詢 * * @param sql * :查詢sql語句 * @param obj * :SQL語句給值 * @param sun * 請傳入你要查詢的對象 * @return :list: * 在list裡放的是泛型對象, * ...obj:應用JDK1.5新特性,可以傳1個值或數組方便使用 */ public ArrayList<T> excuteQuery(String sql,Object ...obj,Class<T> sun) { Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try{ Class.forName(driver); con=createConnection(); ps=con.prepareStatement(sql); if(obj!=null&& obj.length>0) { for (int i = 0; i < obj.length; i++) { ps.setObject(i+1, obj[i]); } } rs=ps.executeQuery(); ArrayList list=new ArrayList(); if(rs!=null) { ResultSetMetaData data=rs.getMetaData(); while(rs.next()) { //建立泛型對象 Object o=Class.forName(sun.getName()).newInstance(); //獲得查詢的資料庫有多少列 int count=data.getColumnCount(); for (int i = 0; i < count; i++) { //獲得列名 String columnName=data.getColumnName(i+1);//id //獲得列值 Object value= rs.getObject(i+1); //setId //產生要執行的方法,因為方法的的第二個單詞大寫所有需要轉換大小寫 String methodName="set"+columnName.replace(columnName.charAt(0)+"", new String(columnName.charAt(0)+"").toUpperCase()); //System.out.println(columnName.replace(columnName.charAt(0)+"", new String(columnName.charAt(0)+"").toUpperCase())); //System.out.println(methodName); //利用反射機制,產生setXX()方法的Method對象並執行該setXX()方法。 Method method=o.getClass().getMethod(methodName, value.getClass()); method.invoke(o, value); } list.add(o); } return list; }else{ return null; } }catch(Exception e){ e.printStackTrace(); return null; }finally{ if(rs!=null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } /** * 此方法只能執行增刪改 * * @param sql * :查詢sql語句 * @param obj * :SQL語句給值 * @return 真假: */ public boolean excuteUpdate(String sql, Object[] obj) { Connection con = null; PreparedStatement ps = null; try { Class.forName(driver); con = createConnection(); ps = con.prepareStatement(sql); if (obj != null && obj.length > 0) { for (int i = 0; i < obj.length; i++) { ps.setObject(i + 1, obj[i]); } } int a = ps.executeUpdate(); if (a > 0) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; } finally { if(ps!=null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if(con!=null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } }}