在騰科培訓了有1個半月了,終於學完JSP+SERVLET+JAVABEAN+MYSQL,學了java的第一套web解決方案。老師要求我們6人一組開始做一個訂餐系統。這個系統沒有什麼特別的,就跟電子商城是一個樣的。由於要對資料庫做大量的增刪改查,那個代碼又多,我想能不能將資料庫操作的這一層打包起來(SqlOperDao),讓我對資料庫操作,用幾行代碼就搞定的。然後我只修改sql語句,和傳進來的參數就可以了。
增刪改屬於一類操作,都是不返回結果集的,而尋找是要返回結果集的
1)先說增刪改的操作
public int buildConn(String sql)throws Exception{
Connection conn=null;
Statement stmt=null;
int result=0;
boolean flag;
try{
conn=sqlconn.conn();
stmt=conn.createStatement();
result=stmt.executeUpdate(sql);
System.out.println("恭喜你執行成功"+result+"條記錄!");
flag=true;
}catch(Exception e){
System.out.println("抱歉!執行失敗!"+e.getMessage());
flag=false;
}finally{
stmt.close();
conn.close();
}
return result;
}
2)而對於查詢操作的就比較麻煩一點,通常我們都將查詢的結果集打包到一個javabean組合中,例如我有一個登陸的javabean裡面只有name和password,對應的表中user_list的兩列name,password.現在要將user_list中的所有資料讀出來,讀出一條,就放到一個javabean中,多條資料就放到List<javabean>中。首先我們可以講資料庫中的所有資料都用讀取字串的形式getString的方法讀出來,當然如果資料庫中表的列的屬性不是varchar類型,就不可以用此類方法。
本通用查詢只針對都是String類型的表。
/**
* 通用查詢,傳入要查詢的sql語句
* 返回一個List<String[]>
*/
public List<String[]> query(String sql) throws Exception{
this.queryList=new ArrayList<String[]>();
Statement stmt = null;
ResultSet rs = null;
Connection conn=null;
conn=this.sqlconn.conn();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
//2、取得表體資訊,要對錶體進行判斷是否存在,如果不存在則退出
while(true){
if(false == rs.next()){
break;
}
String dataList[] = new String[columnCount];
for(int body = 1; body <= columnCount; body ++){
String columnValue = rs.getString(body);
dataList[body - 1] = columnValue;
}
this.queryList.add(dataList);
}
rs.close();
stmt.close();
conn.close();
return queryList;
}
這個方法是將表中的內容讀取出來,然後存放到一個List<String[]>中,但這樣有個壞處,就是讀出來的資料還沒有打包成javabean,要自己打包,很是繁瑣。所以在這個方法的基礎上,我再寫了一個將List<String[]>打包成javabean的方法。在這裡要注意一點,就是,這個資料庫通用操作類必須是一個泛型,class SqlOperDao<T>,要不然,Object類型是無法轉化為你想要的javabean類型
/**
* 傳入一個javabean,sql查詢語句
* 查詢返回的結果集,放到一個集合中List<javaBean>
* 這是一個賦值的操作,只對String類型進行複製,如果javabean中的set方法不是傳String類型的
* 可以改寫為
* public void setAttribute(String str){
* this.attribute=Integer.parseInt(str);
* }
* T可以傳入一個JavaBean
*/
public List<Object> query(Object t,String sql)throws Exception{
List<Object> resultlist=new ArrayList<Object>();
Class cl=t.getClass();
Class mycl=Class.forName(cl.getName());
Field[] fields=mycl.getDeclaredFields();
List<String[]> querylist=this.query(sql);
for(String[] results:queryList){
Object instance=mycl.newInstance();
int i=0;
for(Field field:fields){
//採用java反射機制,擷取javabean中set方法的方法名稱,由於set方法都是由set+屬性名稱(String)構成的,所以用拼湊字串
String setMethod="set"+String.valueOf(field.getName().charAt(0)).toUpperCase()+""+field.getName().substring(1);
Method set=mycl.getMethod(setMethod,String.class);
set.invoke(instance,results[i]);
i++;
}
resultlist.add(instance);
}
return resultlist;
}
在此通用資料查詢就完成了,再來,看下如何使用?
javabean: class UserList{ private String name;
private String password; //get和set方法由myeclipse自動產生}
Dao層:要讀取資料庫中user_list中的所有資料
public static void main(String[] args0) throws Exception{
SqlOperDao sod=new SqlOperDao();
UserList t=new UserList();
String sql="SELECT * FROM user_list";
List<UserList> list=sod.query(t, sql);
for(Eatery e:list){
System.out.println(e.getEateryName());
}
//這樣三句話就可以寫完一個資料庫的查詢操作了,這樣我們寫出來的Dao層要比其他人的代碼要少70%
}