MyBatis 3和Oracle存儲過程

1.MyBatis介紹

MyBatis是支持定制化SQL旗国、存儲過程以及高級映射的優(yōu)秀的持久層框架沙绝。MyBatis避免了幾乎所有的JDBC代碼和手動設置參數(shù)以及獲取結果集。MyBatis可以對配置和原生Map使用簡單的XML或注解,將接口和Java的POJOs(Plain Old Java Objects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄质况。

MyBatis的真正強大在于它的映射語句聪富,也是它的魔力所在莺丑。由于它的異常強大,映射器的XML文件就顯得相對簡單墩蔓。如果拿它跟具有相同功能的JDBC代碼進行對比梢莽,你會立即發(fā)現(xiàn)省掉了將近95%的代碼。MyBatis就是針對SQL構建的奸披,并且比普通的方法做的更好昏名。

SQL映射文件有很少的幾個頂級元素(按照它們應該被定義的順序):

·cache–給定命名空間的緩存配置。

·cache-ref–其他命名空間緩存配置的引用阵面。

·resultMap–是最復雜也是最強大的元素葡粒,用來描述如何從數(shù)據(jù)庫結果集中來加載對象份殿。

·parameterMap–已廢棄!老式風格的參數(shù)映射嗽交。內聯(lián)參數(shù)是首選,這個元素可能在將來被移除卿嘲,這里不會記錄。

·sql–可被其他語句引用的可重用語句塊夫壁。

·insert–映射插入語句

·update–映射更新語句

·delete–映射刪除語句

·select–映射查詢語句

2.存儲過程和POJO類

在數(shù)據(jù)庫中有兩個存儲過程拾枣,一個用來插入并放回插入結果,另一個用來查詢返回游標盒让。數(shù)據(jù)庫系統(tǒng)為Oracle 10g梅肤。

create or replace procedure sp_order_insert(p_orderid in out number,

p_useridin out varchar2,

p_namein out varchar2,

p_content in out varchar2,

p_amountin out number ,

p_photo in blob

)is

這是第一個,用來執(zhí)行插入操作邑茄。

create or replace procedure sp_order_select(p_typein varchar2,

p_max_id in number,

p_min_id in number,

p_photo_inin boolean,

c_cursor OUT SYS_REFCURSOR) is

這是第二個姨蝴,用來執(zhí)行查詢操作的,我沒有用定制化的SQL來操作肺缕。

在POJO中定義的類中左医,涉及到數(shù)字、字符和圖片同木。在POJO中圖片我用的byte[]保存浮梢,而在數(shù)據(jù)庫中用的是Blob。這里先說明一下彤路。

public class Order {

private static final long serialVersionUID= 1L;

private long orderid= 0;

private User user=new User();

private String type= "";

private Integer status= 0;

private String name= "";

private String content= "";

private byte[] photo = new byte[0];

3.映射器的XML文件

關于XML文件的映射說明秕硝,在官方文檔http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#

中,您可以去仔細閱讀洲尊。這里要介紹的是我閱讀理解這些文字和實際操作過程中的經(jīng)驗總結远豺。

我用到一個SELECT語句去實現(xiàn)上述兩個存儲過程的調用操作。這兩個過程坞嘀,幾乎可以涵蓋一般項目的所有需求躯护。

這里聲明一下,我之前沒接觸過MyBatis姆吭,甚至Spring榛做,JAVA也是N多年前學習過一段時間唁盏,應該不超過6個月内狸。

在理清楚了Spring和MyBatis的結構以后,就開始配置映射器的XML文件厘擂。

我從google里昆淡,找了很多文檔,夾雜各種版本的配置刽严,不同項目的只言片語昂灵。終于搞出來一個能用的版本避凝。


"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

{call sp_order_insert(?,?,?)}

call sp_order_select(#{type ,jdbcType=VARCHAR ,mode=IN},

#{maxOrderid , jdbcType=BIGINT,mode=IN},

#{minOrderid , jdbcType=BIGINT,mode=IN},

false,

#{selectedRows, mode=OUT,jdbcType=CURSOR, javaType=ResultSet, resultMap=orderResultMap})

select orderid, userid, name from t_order_info

select orderid, photo fromt_order_info where orderid=#{orderid}

但是,這個版本對于圖片的操作沒有設置眨补,更重要的一點是parameterMap元素MyBatis 3中已經(jīng)廢棄了管削,所以需要做一個適配MyBatis 3的修改。


"http://mybatis.org/dtd/mybatis-3-mapper.dtd">



{call sp_order_insert(

#{orderid,jdbcType=BIGINT,javaType=long ,mode=INOUT},

#{user.userid ,jdbcType=VARCHAR ,javaType=string,mode=INOUT},

#{name ,jdbcType=VARCHAR,javaType=string,mode=INOUT},

#{content,jdbcType=VARCHAR,javaType=string ,mode=INOUT},

#{amount,jdbcType=DOUBLE,javaType=double ,mode=INOUT},

#{photo ,jdbcType=BINARY, javaType=[B,mode=IN}

)}

call sp_order_select(#{type ,jdbcType=VARCHAR ,mode=IN},

#{maxOrderid , jdbcType=BIGINT,mode=IN},

#{minOrderid , jdbcType=BIGINT,mode=IN},

false,

#{selectedRows, mode=OUT,jdbcType=CURSOR, javaType=ResultSet, resultMap=orderResultMap})

select orderid, userid, name fromt_order_info

select orderid, photo fromt_order_info where orderid=#{orderid}

這里涉及了一個數(shù)據(jù)庫層是BLOB撑螺,而JAVA類中byte[]含思,MyBatis 3在配置映射器XML文件時如何操作的問題。

在存儲過程調用時甘晤,參數(shù)配置是這樣的含潘。

#{photo ,jdbcType=BINARY,javaType=[B,mode=IN}

這屬于將JAVA對象轉成jdbc對象,用于插入數(shù)據(jù)庫线婚。

在定義結果集時遏弱, 又是這樣設置的。

屬于將數(shù)據(jù)庫返回結果集塞弊,即JDGC的結果集轉換成JAVA類中的類型漱逸。

由于是新手,對應這種映射關系和處理方式很陌生居砖。在javaType和jdbcType之間搞的很混亂虹脯。這些都是個人理解。

4.小結

XML配置起來操作數(shù)據(jù)庫奏候,確實很強大循集。

在MyBatis3中,調用有插入和返回的Oracle存儲過程蔗草,調用有游標返回的Oracle存儲過程咒彤,涉及到BLOB字段和JAVA byte[]的相互轉化操作,不用另外定義typehandler處理這種兩個之間的轉換咒精。(嗯镶柱,主要是我不會這個)。

這是一個只有6個月JAVA經(jīng)驗模叙,對MyBatis一無所知的新手的項目筆記歇拆。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市范咨,隨后出現(xiàn)的幾起案子故觅,更是在濱河造成了極大的恐慌,老刑警劉巖渠啊,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件输吏,死亡現(xiàn)場離奇詭異,居然都是意外死亡替蛉,警方通過查閱死者的電腦和手機贯溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門拄氯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人它浅,你說我怎么就攤上這事译柏。” “怎么了姐霍?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵艇纺,是天一觀的道長。 經(jīng)常有香客問我邮弹,道長黔衡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任腌乡,我火速辦了婚禮盟劫,結果婚禮上,老公的妹妹穿的比我還像新娘与纽。我一直安慰自己侣签,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布急迂。 她就那樣靜靜地躺著影所,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僚碎。 梳的紋絲不亂的頭發(fā)上猴娩,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音勺阐,去河邊找鬼卷中。 笑死,一個胖子當著我的面吹牛渊抽,可吹牛的內容都是我干的蟆豫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼懒闷,長吁一口氣:“原來是場噩夢啊……” “哼十减!你這毒婦竟也來了?” 一聲冷哼從身側響起愤估,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤帮辟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灵疮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體织阅,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡壳繁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年震捣,在試婚紗的時候發(fā)現(xiàn)自己被綠了荔棉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒿赢,死狀恐怖润樱,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情羡棵,我是刑警寧澤壹若,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站皂冰,受9級特大地震影響店展,放射性物質發(fā)生泄漏。R本人自食惡果不足惜秃流,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一赂蕴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舶胀,春花似錦概说、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至轩端,卻和暖如春放典,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背基茵。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工刻撒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耿导。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓声怔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舱呻。 傳聞我的和親對象是個殘疾皇子醋火,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL箱吕、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評論 0 4
  • 11 MyBatis一級緩存實現(xiàn)# 11.1 什么是一級緩存芥驳? 為什么使用一級緩存?## 每當我們使用MyBati...
    七寸知架構閱讀 10,852評論 12 143
  • 1. Java基礎部分 基礎部分的順序:基本語法茬高,類相關的語法兆旬,內部類的語法,繼承相關的語法怎栽,異常的語法丽猬,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • 讀書可能大多數(shù)人都會宿饱,也不乏愛好者。每天看一些大V寫的一些文章脚祟,概括性語言總結了書本中的思想谬以,確實很有用處。我每天...
    木夏半年閱讀 1,813評論 1 7
  • 楔子#### 在去南方上學之前我一直認為:“南方太暖和了由桌,候鳥都是南飛去過冬的为黎,終于不需要穿棉襖了⌒心”事實是穿了棉...
    GoooIce閱讀 258評論 0 1