java servlet調用帶有多個返回結果集的存儲過程

jopen 8年前發布 | 16K 次閱讀 Servlet Java開發

一、mysql存儲過程

這里我先說下我這個功能實現的邏輯及途中遇到的一些問題。這個存儲過程一共帶兩個輸入參數,一共關聯到兩張表的查詢,每個參數都對應查詢表中的一個判斷,所以一共返回了兩個結果集(當然要返回更多結果集也是一樣的,如果需要判斷,就繼續增加存儲過程參數,如果不需要判斷就直接在存儲過程中,增加查詢的SQL語句即可)。實現這個功能還有更簡單的方法,可以寫SQL關聯語句查詢出兩張表的結果,返回一個組合的結果集。我這里當然是為了實現這個效果,所以把它的實現復雜化了。繼續說下我今天在mysql上遇到的一個問題,究竟是什么原因,其實我現在也沒弄清楚,寫這個存儲過程前,我給要查詢的表中增加了兩個字段,然后修改了一個字段的名稱,增加的字段到沒有任何影響,但是修改過名稱的字段就出問題了,在java中調用這個存儲過程時,就提示這個字段不存在。之后我將這個修改過的字段再修改回去就好了,下面貼存儲過程代碼。

1、參數

in sheetOneAccount varchar(50),in  sheetTwoAccount varchar(50)

2、代碼

 1 BEGIN
 2 /*存儲過程*/
 3 declare shareNameIsOrNoExistsVerify varchar(50);
 4    /*驗證第一個參數在第一張表中是否存在*/
 5    SELECT  name into shareNameIsOrNoExistsVerify from infosheet
 6     where sheetOneAccount=name;
 7       if(shareNameIsOrNoExistsVerify is not null) THEN
 8            /*這里給返回的查詢結果表中增加了一個字段,以便客戶端接受到之后,首先取這個字段的
 9 值來判斷,查詢這個用戶是否存在,如果存在才去取對應字段的值,減少了客戶端的工作量*/
10                    /*這里nameExists AS 0表示用戶存在與表中,而且表示第一張表*/
11         select *, 0 AS nameExists from infosheet where name=sheetOneAccount;
12       ELSE 
13                /*下面查詢人員不存在,返回的自定義字段值就為1, 1 AS nameExists,表示查詢用戶不存在,
14 而且表示第一張表 */
15 
16   /*下面表示沒查詢到該人員,雖然沒查詢到但是還是返回了一條數據,所以在取值時,需要先取nameExists 這個字段
17                 判斷查詢的人員是否存在*/
18        select name,1 AS nameExists from infosheet limit 0,1;
19      end if;
20     /*驗證第二個參數在第二張表中是否存在*/
21   set shareNameIsOrNoExistsVerify=null;
22   SELECT  name into shareNameIsOrNoExistsVerify from studentsheet
23     where name=sheetTwoAccount;
24     if(shareNameIsOrNoExistsVerify is not null) THEN
25            /*這里給返回的查詢結果表中增加了一個字段,以便客戶端接受到之后,首先取這個字段的
26 值來判斷,查詢這個用戶是否存在,如果存在才去取對應字段的值,減少了客戶端的工作量*/
27                    /*這里nameExists AS 2表示用戶存在于表中,而且表示第二張表*/
28         select *, 2 AS nameExists from studentsheet where name=sheetTwoAccount;
29       ELSE 
30        /*不存在返回的自定義字段值就為3, 3 AS nameExists,表示查詢用戶不存在,
31 而且表示第二張表 */
32 
33     /*下面表示沒查詢到該人員,雖然沒查詢到但是還是返回了一條數據,所以在取值時,需要先取nameExists 這個字段
34                 判斷查詢的人員是否存在*/
35             select name,3 AS nameExists from studentsheet limit 0,1;
36      end if;
37 END

一、java Servlet

  1、調用存儲過程方法

 1  //調用帶有多個返回結果集的存儲過程
 2      //這里雖然是查詢的結果集,但是我在數據庫中寫的判斷是,只查詢出一條數據,所以也不需要在方法中使用re.next遍歷
 3    public static     JSONArray callProcReturnMultipleSet(String sql, String[] parameters) {
 4       JSONArray  masterJSONArray = new JSONArray();
 5      JSONObject shareJSONObject=new JSONObject();
 6        try {
 7            conn = getConnection();

 8            cs = conn.prepareCall(sql);                   
 9              for(int i=0;i<parameters.length;i++)
10                 {
11                  cs.setObject(i+1, parameters[i]); 
12                 }
13              cs.execute();
14             rs = cs.getResultSet();
15             //如果是返回的多條數據這里,需要用JSONArray來接收。
16             shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);
17             masterJSONArray.put(shareJSONObject);
18            
19             //下面這個方法就是繼續循環出rs中的數據集表,java這個功能做都沒.NET好,.NET返回一個dataSet直接用下標取對應的數據集
20             //如果你還在查詢中增加了更多的表沒那么繼續用下面這個方法循環出數據集
21            if (cs.getMoreResults() == true) {
22                 rs = cs.getResultSet();
23                   shareJSONObject= ResultToJsonTool.resultSetToJsonObject(rs);
24                  masterJSONArray.put(shareJSONObject);
25                  //下面如果有第三方那個表,以此類推,同樣的方法,或則這里自己可以寫一個遞歸的方法封裝下少些代碼
26                  //if (cs.getMoreResults() == true) {
27                  
28                 // }
29                 
30             } 
31             
32             
33         }
34         catch (Exception e) {
35             e.printStackTrace();
36             throw new RuntimeException(e.getMessage());
37         }finally{
38            
39         }
40         return masterJSONArray;
41     }

2、調用

1 //調用返回多個結果集的存儲過程
2            String[] getResultSetParameter=new String[]{"hang","haha"};
3            String  executProduceStr="call getMultipleResultSetProcudure(?,?)";
4            JSONArray rest=(JSONArray) MySqlHepler.callProcReturnMultipleSet(executProduceStr, getResultSetParameter);
5            out.println(rest.toString());

3、實現截圖

   

由于本人也是才開始學java,如有不合理之處,請及時指出。

來自: http://www.cnblogs.com/xiaoliao/p/5128520.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!