1 package com.eshop.dao; 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.InvocationTargetException; 5 import java.lang.reflect.Method; 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.PreparedStatement; 9 import java.sql.ResultSet; 10 import java.sql.SQLException; 11 import java.util.ArrayList; 12 import java.util.List; 13 14 15 public class BaseDao { 16 private final String URL="jdbc:oracle:thin:@localhost:1521:orcl";//數據庫鏈接 17 private final String dRIVERString="oracle.jdbc.driver.OracleDriver"; 18 private final String USER="eshop"; 19 private final String PASSWORD="tiger"; 20 21 Connection conn=null; 22 PreparedStatement pstmt =null; 23 24 public void getConnection(){ 25 try { 26 //1.加載驅動 27 Class.forName(dRIVERString); 28 //2.鏈接數據庫 29 //只創建一次鏈接 30 //問題:若是多我的同時進入數據庫(待解決多線程的問題) 31 if(conn==null){ 32 conn= DriverManager.getConnection(URL,USER,PASSWORD); 33 } 34 35 } catch (Exception e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 } 40 41 //封裝增刪改的方法,返回受影響的行數 42 public int executeUpdate(String sql,List<Object> parm){ 43 getConnection(); 44 int count=0; 45 try { 46 pstmt = conn.prepareStatement(sql) ; 47 if(parm!=null){ 48 for(int i=0;i<parm.size();i++){ 49 pstmt.setObject(i+1, parm.get(i)); 50 } 51 } 52 //執行 53 count=pstmt.executeUpdate(); 54 55 } catch (SQLException e) { 56 // TODO Auto-generated catch block 57 e.printStackTrace(); 58 } 59 return count; 60 61 } 62 63 //封裝查詢的方法,獲取結果集 64 public ResultSet executeQuery(String sql,List<Object> parm){ 65 getConnection(); 66 try { 67 PreparedStatement pstmt = conn.prepareStatement(sql) ; 68 if(parm!=null){ 69 for(int i=0;i<parm.size();i++){ 70 pstmt.setObject(i+1, parm.get(i)); 71 } 72 } 73 //執行 74 ResultSet res=pstmt.executeQuery(); 75 return res; 76 77 } catch (SQLException e) { 78 // TODO Auto-generated catch block 79 e.printStackTrace(); 80 } 81 return null; 82 83 } 84 public <T> List<T> findModelListBySqlAndParam(String sql,List<Object> param,T t) { 85 //定義一個集合來存放須要轉成的對象集合 86 List<T> list=new ArrayList<T>(); 87 //獲取當前類 88 Class<?> c=t.getClass(); 89 //遍歷結果集,封裝成外界用戶所須要的對象集合 90 //1>獲取結果集 91 ResultSet rs=executeQuery(sql, param); 92 //2>開始遍歷 93 try { 94 while(rs.next()){ 95 //初始化對象 96 @SuppressWarnings("unchecked") 97 T obj= (T)c.newInstance(); 98 //獲取當前類一共多少個屬性啊 99 Field[] fields=c.getDeclaredFields(); 100 for(Field f:fields){ 101 //獲取當前屬性的屬性名子 102 String fname=f.getName(); 103 //獲取當前的屬性的類型(簡稱) java.lang.String 104 String type=f.getType().getSimpleName(); 105 106 //***************** 取出來當前屬性對應的數據庫的值了 **************** 107 //在此方法名中要求類的屬性名和數據庫的字段名相同 108 Object value=null; 109 if(type.equalsIgnoreCase("string")){ 110 value=rs.getString(fname); 111 }else if(type.equalsIgnoreCase("int")){ 112 value=rs.getInt(fname); 113 }else if(type.equalsIgnoreCase("Integer")){ 114 value=rs.getInt(fname); 115 }else if(type.equalsIgnoreCase("Double")){ 116 value=rs.getDouble(fname); 117 }else if(type.equalsIgnoreCase("Float")){ 118 value=rs.getFloat(fname); 119 }else if(type.equalsIgnoreCase("date")){ 120 value=rs.getDate(fname); 121 }else if(type.equalsIgnoreCase("long")){ 122 value=rs.getLong(fname); 123 } 124 //***************** 將取出來當前屬性的值設置給當前對象obj**************** 125 //1>獲取當前對象的全部set方法,並找到當前取出來的屬性對應的set方法 126 Method[] methods=c.getDeclaredMethods();//獲取全部的方法 127 for(Method m:methods){ 128 //獲取當前方法名 129 String methodName=m.getName(); 130 //判斷是否是當前屬性 131 if(methodName.equalsIgnoreCase("set"+fname)){ 132 //執行該方法 133 m.invoke(obj, value); 134 } 135 } 136 } 137 list.add(obj); 138 } 139 } catch (InstantiationException e) { 140 // TODO Auto-generated catch block 141 e.printStackTrace(); 142 } catch (IllegalAccessException e) { 143 // TODO Auto-generated catch block 144 e.printStackTrace(); 145 } catch (SecurityException e) { 146 // TODO Auto-generated catch block 147 e.printStackTrace(); 148 } catch (IllegalArgumentException e) { 149 // TODO Auto-generated catch block 150 e.printStackTrace(); 151 } catch (InvocationTargetException e) { 152 // TODO Auto-generated catch block 153 e.printStackTrace(); 154 } catch (SQLException e) { 155 // TODO Auto-generated catch block 156 e.printStackTrace(); 157 } 158 return list; 159 } 160 161 162 163 //獲取訂單編號 164 public int getSequenceIndex(String seq){ 165 String sql="select "+seq+".nextval num from dual"; 166 getConnection(); 167 ResultSet rs=executeQuery(sql, null); 168 try { 169 if(rs.next()){ 170 return rs.getInt("num"); 171 } 172 } catch (SQLException e) { 173 // TODO Auto-generated catch block 174 e.printStackTrace(); 175 } 176 177 return 0; 178 179 } 180 181 182 183 184 //關閉全部資源 185 public void closeAll(){ 186 try { 187 if(pstmt!=null){ 188 pstmt.close(); 189 pstmt=null;//促進資源快速回收 190 } 191 if(conn!=null) conn.close(); 192 193 194 } catch (SQLException e) { 195 // TODO Auto-generated catch block 196 e.printStackTrace(); 197 } 198 } 199 200 }