一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring boot調用Oracle存儲過程的兩種方式及完整代碼

Spring boot調用Oracle存儲過程的兩種方式及完整代碼

2020-08-17 00:07Tiro8183 Java教程

這篇文章主要給大家介紹了關于Spring boot調用Oracle存儲過程的兩種方式及完整代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

因工作需要將公司SSH項目改為Spingboot項目,將項目中部分需要調用存儲過程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()來獲取Session實現后發現項目訪問數據庫超過十次就會掛掉,原因是Springboot連接池數量默認為10,猜測是每次訪問數據庫后連接未釋放導致的,手動關閉session后問題解決。

解決問題的過程中又發現了另外兩種調用方式:

  • 直接用EntityManager的createStoredProcedureQuery()方法調用 (推薦)
  • 通過如下方式獲取Session來調用,這種方式不需要手動關閉Session來釋放連接,具體原因我也沒搞明白,有知道的朋友歡迎指點
    Session session = entityManager.unwrap(Session.class);

完整代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.hzjd.produre.repository;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.StoredProcedureQuery;
 
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.procedure.ProcedureCall;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import com.hzjd.produre.bean.QueryResponse;
import com.hzjd.produre.utils.Assistant;
 
@Repository
public class ProdureDAO {
    public final static String PUBLIC_PAG_SYS_GETNEXTID = "PUBLIC_PAG.SYS_GETNEXTID";
    public final static String PSBC_QUERYBILL = "PSBCPAY.QUERYBILL";
    @PersistenceContext
    EntityManager entityManager;
    @Autowired
    EntityManagerFactory entityManagerFactory;
 
    public Session getSession() {
        return entityManagerFactory.unwrap(SessionFactory.class).openSession();
    }
 
    /**
     * 使用entityManager調用存儲過程
     *
     * @param pay_ID
     * @return
     */
    public QueryResponse queryBill1(String pay_ID) throws Exception {
        QueryResponse queryResponse = new QueryResponse();
        StoredProcedureQuery call = entityManager.createStoredProcedureQuery(PSBC_QUERYBILL);
        call.registerStoredProcedureParameter(1, String.class, ParameterMode.IN).setParameter(1, pay_ID);
        call.registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(3, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(4, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(5, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(6, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(7, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(8, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(9, String.class, ParameterMode.OUT);
        call.registerStoredProcedureParameter(10, String.class, ParameterMode.OUT);
        call.execute();
        queryResponse.getBody().setPAY_ID(pay_ID);
        queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputParameterValue(2)));
        queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputParameterValue(3)));
        queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(5)));
        queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(6)));
        queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputParameterValue(8)));
        int errorcode = Assistant.nullToInt(call.getOutputParameterValue(9));
        String errormsg = Assistant.nullToEmpty(call.getOutputParameterValue(10));
        if (errorcode == 0) {
            return queryResponse;
        } else {
            throw new Exception(errormsg);
        }
    }
 
    /**
     * 使用sessionFactory開啟Session調用存儲過程
     *
     * @param pay_ID
     * @return
     */
    public QueryResponse queryBill2(String pay_ID) throws Exception {
        QueryResponse queryResponse = new QueryResponse();
        // 調用完成后需關閉Session否則會出現連接失效
        try (Session session = getSession();) {
            ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);
            call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);
            call.registerParameter(2, String.class, ParameterMode.OUT);
            call.registerParameter(3, String.class, ParameterMode.OUT);
            call.registerParameter(4, String.class, ParameterMode.OUT);
            call.registerParameter(5, String.class, ParameterMode.OUT);
            call.registerParameter(6, String.class, ParameterMode.OUT);
            call.registerParameter(7, String.class, ParameterMode.OUT);
            call.registerParameter(8, String.class, ParameterMode.OUT);
            call.registerParameter(9, String.class, ParameterMode.OUT);
            call.registerParameter(10, String.class, ParameterMode.OUT);
            queryResponse.getBody().setPAY_ID(pay_ID);
            queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2)));
            queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3)));
            queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5)));
            queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6)));
            queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));
            int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));
            String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));
            if (errorcode == 0) {
                return queryResponse;
            } else {
                throw new Exception(errormsg);
            }
        }
    }
 
    /**
     * 使用sessionFactory開啟Session調用存儲過程
     *
     * @param pay_ID
     * @return
     */
    public QueryResponse queryBill3(String pay_ID) throws Exception {
        QueryResponse queryResponse = new QueryResponse();
        Session session = entityManager.unwrap(Session.class);
        ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);
        call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);
        call.registerParameter(2, String.class, ParameterMode.OUT);
        call.registerParameter(3, String.class, ParameterMode.OUT);
        call.registerParameter(4, String.class, ParameterMode.OUT);
        call.registerParameter(5, String.class, ParameterMode.OUT);
        call.registerParameter(6, String.class, ParameterMode.OUT);
        call.registerParameter(7, String.class, ParameterMode.OUT);
        call.registerParameter(8, String.class, ParameterMode.OUT);
        call.registerParameter(9, String.class, ParameterMode.OUT);
        call.registerParameter(10, String.class, ParameterMode.OUT);
        queryResponse.getBody().setPAY_ID(pay_ID);
        queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2)));
        queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3)));
        queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5)));
        queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6)));
        queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));
        int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));
        String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));
        if (errorcode == 0) {
            return queryResponse;
        } else {
            throw new Exception(errormsg);
        }
    }
}

總結

到此這篇關于Spring boot調用Oracle存儲過程的兩種方式及完整代碼的文章就介紹到這了,更多相關Springboot調用Oracle存儲過程內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/tiro996/p/13485980.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 视频大全在线观看网址 | 边摸边吃奶边做爽gif动态图 | 女毛片 | 波多野结衣中文字幕乱七八糟 | 国产三区二区 | 亚洲 日韩 国产 中文视频 | 亚洲精品中文字幕第一区 | 亚洲一区二区日韩欧美gif | 日本人成大片在线 | jk制服蕾丝超短裙流白浆 | 美女脱了内裤让男生玩屁股 | av中文字幕在线 | 湿好紧太硬了我太爽了 | 国产福利视频一区二区微拍 | 国产高清在线播放免费观看 | 国产在视频线精品视频 | 日韩国产成人资源精品视频 | 亚洲国产韩国欧美在线不卡 | 日韩视频一区二区 | 欧美成人乱弄视频 | 日本高清中文字幕一区二区三区 | 亚洲激情视频在线 | 久久精品美女 | 体检小说 | 极品一区| 啪啪无尽3d动漫漫画免费网站 | 亚洲人影院 | 男女一级簧色带 | 99久久国语露脸精品国产 | 国产日产在线观看 | 高h全肉np触手 | 小舞同人18av黄漫网站 | 99av麻豆| 亚洲欧洲日产v特级毛片 | 国产精品怡红院永久免费 | 国产亚洲精品91 | 欧美精品日韩 | 亚洲情欲网 | 91久久偷偷做嫩草影院免费看 | 国产国语videosex另类 | 国产在线xvideos |