sql函數設計: 一開始本來是直接用Java的jdbc直接傳輸操作語句的。但後來學了存儲過程發現存儲過程可以提高不少的效率。就重構了自己對資料庫的操作代碼。包括:開啟,查找,修改,關閉。 開啟:直接使用的構造函數,以後使用的時候可以直接把對象new成一個static的變數,可以一直使用,直到使用關閉 ...
sql函數設計:
一開始本來是直接用Java的jdbc直接傳輸操作語句的。但後來學了存儲過程發現存儲過程可以提高不少的效率。就重構了自己對資料庫的操作代碼。包括:開啟,查找,修改,關閉。
開啟:直接使用的構造函數,以後使用的時候可以直接把對象new成一個static的變數,可以一直使用,直到使用關閉函數。
具體操作(查(find),寫(write),改(change)):編寫的思路是現在mysql資料庫裡面實現函數和存儲過程。
巨坑提示1,存儲過程和函數的區別是,函數必須返回一個數據,return語句必須寫,而存儲過程可以返回,也可以不返回這個數據。
一開始我使用的是存儲過程,實現find,但是,有個巨坑的東西(mysql的設計缺陷,那就是IN的變數,即存儲過程名旁邊的參數,不可以直接表示欄位,巨坑,還要深入學習動態的sql才可以表示欄位),然後我就多寫了幾個函數,每個函數實現不同欄位的查詢,比如,findbyemail函數就是通過where email(email是欄位)=參數;實現查找。
然後為了讓功能齊全,就設計了多個函數,比如findbyname,findbyphone這些函數存在資料庫里。然後資料庫編譯好。等著Java直接調用(這裡比較方便的就是我們的調用直接用的是調用語句 "{call 函數名(?)}",這裡的?問號,是指的你的參數。也意味著你的存儲過程或者函數有多少參數就必須用多少個問號,然後發送給資料庫。性能提高不少)
巨坑提示2,在發送調用存儲過程的sql語句的過程中,有可能會出現引號(')解析錯位的尷尬錯誤,而且我還沒辦法糾正。比如writeuser存儲過程,發送過去的語句被解析錯了,就是引號錯位。卡了我一上午的時間。然後就使用的函數,放棄使用存儲過程。性能影響比較小。還可以返回一個數據可以判斷一下。比如我的writeuser函數,我可以這樣寫,就不會出現這樣尷尬的錯誤了
string sql = “{?=call writeuser(?????)}”;
1 public String WriteUser(String name,String phone,String email,String pwd,String status) throws SQLException { 2 //使用方法:比如寫入用戶數據name,phone,email,pwd,status,我們可以這樣寫write('張三','110','[email protected]','999','1') 3 4 String sql = "{? = call writeuser(?,?,?,?,?)}"; 5 6 CallableStatement cs = connection.prepareCall(sql); 7 8 cs.registerOutParameter(1,Types.CHAR);//這裡實在規定你函數裡面返回的數據類型 9 10 cs.setString(2,name);//以下都是在向問號裡面傳遞參數 11 12 cs.setString(3,phone); 13 14 cs.setString(4,email); 15 16 cs.setString(5,pwd); 17 18 cs.setString(6,status); 19 20 cs.execute(); 21 22 String value = cs.getString(1); 23 if (value=="1"){ 24 cs.close(); 25 return "ok"; 26 } 27 cs.close(); 28 return "no"; 29 }