封裝數據庫方法

 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 }
相關文章
相關標籤/搜索