MyBatis 3和Oracle存储过程

1.MyBatis介绍

MyBatis是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或注解,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

MyBatis的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的XML文件就显得相对简单。如果拿它跟具有相同功能的JDBC代码进行对比,你会立即发现省掉了将近95%的代码。MyBatis就是针对SQL构建的,并且比普通的方法做的更好。

SQL映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

·cache–给定命名空间的缓存配置。

·cache-ref–其他命名空间缓存配置的引用。

·resultMap–是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

·parameterMap–已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。

·sql–可被其他语句引用的可重用语句块。

·insert–映射插入语句

·update–映射更新语句

·delete–映射删除语句

·select–映射查询语句

2.存储过程和POJO类

在数据库中有两个存储过程,一个用来插入并放回插入结果,另一个用来查询返回游标。数据库系统为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

这是第一个,用来执行插入操作。

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

这是第二个,用来执行查询操作的,我没有用定制化的SQL来操作。

在POJO中定义的类中,涉及到数字、字符和图片。在POJO中图片我用的byte[]保存,而在数据库中用的是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#

中,您可以去仔细阅读。这里要介绍的是我阅读理解这些文字和实际操作过程中的经验总结。

我用到一个SELECT语句去实现上述两个存储过程的调用操作。这两个过程,几乎可以涵盖一般项目的所有需求。

这里声明一下,我之前没接触过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中已经废弃了,所以需要做一个适配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}

这里涉及了一个数据库层是BLOB,而JAVA类中byte[],MyBatis 3在配置映射器XML文件时如何操作的问题。

在存储过程调用时,参数配置是这样的。

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

这属于将JAVA对象转成jdbc对象,用于插入数据库。

在定义结果集时, 又是这样设置的。

属于将数据库返回结果集,即JDGC的结果集转换成JAVA类中的类型。

由于是新手,对应这种映射关系和处理方式很陌生。在javaType和jdbcType之间搞的很混乱。这些都是个人理解。

4.小结

XML配置起来操作数据库,确实很强大。

在MyBatis3中,调用有插入和返回的Oracle存储过程,调用有游标返回的Oracle存储过程,涉及到BLOB字段和JAVA byte[]的相互转化操作,不用另外定义typehandler处理这种两个之间的转换。(嗯,主要是我不会这个)。

这是一个只有6个月JAVA经验,对MyBatis一无所知的新手的项目笔记。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,282评论 0 4
  • 11 MyBatis一级缓存实现# 11.1 什么是一级缓存? 为什么使用一级缓存?## 每当我们使用MyBati...
    七寸知架构阅读 10,735评论 12 143
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • 读书可能大多数人都会,也不乏爱好者。每天看一些大V写的一些文章,概括性语言总结了书本中的思想,确实很有用处。我每天...
    木夏半年阅读 1,727评论 1 7
  • 楔子#### 在去南方上学之前我一直认为:“南方太暖和了,候鸟都是南飞去过冬的,终于不需要穿棉袄了。”事实是穿了棉...
    GoooIce阅读 234评论 0 1