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一無所知的新手的項目筆記歇拆。