我爱编程

MyBatis 3和Oracle存储过程

2016-01-30  本文已影响675人  wfg西游

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一无所知的新手的项目笔记。

上一篇下一篇

猜你喜欢

热点阅读