web項目踩坑過程

sql函數設計:mysql

一開始原本是直接用Java的jdbc直接傳輸操做語句的。但後來學了存儲過程發現存儲過程能夠提升很多的效率。就重構了本身對數據庫的操做代碼。包括:開啓,查找,修改,關閉。sql

開啓:直接使用的構造函數,之後使用的時候能夠直接把對象new成一個static的變量,能夠一直使用,直到使用關閉函數。數據庫

 

具體操做(查(find),寫(write),改(change)):編寫的思路是如今mysql數據庫裏面實現函數和存儲過程。函數

   巨坑提示1,存儲過程和函數的區別是,函數必須返回一個數據,return語句必須寫,而存儲過程能夠返回,也能夠不返回這個數據。性能

   一開始我使用的是存儲過程,實現find,可是,有個巨坑的東西(mysql的設計缺陷,那就是IN的變量,即存儲過程名旁邊的參數,不能夠直接表示字段,巨坑,還要深刻學習動態的sql才能夠表示字段),而後我就多寫了幾個函數,每一個函數實現不一樣字段的查詢,好比,findbyemail函數就是經過where email(email是字段)=參數;實現查找。學習

   而後爲了讓功能齊全,就設計了多個函數,好比findbyname,findbyphone這些函數存在數據庫裏。而後數據庫編譯好。等着Java直接調用(這裏比較方便的就是咱們的調用直接用的是調用語句 "{call 函數名(?)}",這裏的?問號,是指的你的參數。也意味着你的存儲過程或者函數有多少參數就必須用多少個問號,而後發送給數據庫。性能提升很多)spa

                              

  巨坑提示2,在發送調用存儲過程的sql語句的過程當中,有可能會出現引號(')解析錯位的尷尬錯誤,並且我還沒辦法糾正。好比writeuser存儲過程,發送過去的語句被解析錯了,就是引號錯位。卡了我一上午的時間。而後就使用的函數,放棄使用存儲過程。性能影響比較小。還能夠返回一個數據能夠判斷一下。好比個人writeuser函數,我能夠這樣寫,就不會出現這樣尷尬的錯誤了設計

                                 string  sql = 「{?=call writeuser(?????)}」;code

 1 public String WriteUser(String name,String phone,String email,String pwd,String status) throws SQLException {
 2         //使用方法:好比寫入用戶數據name,phone,email,pwd,status,咱們能夠這樣寫write('張三','110','110@qq.com','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     }
相關文章
相關標籤/搜索