美文网首页我爱编程
MyBatis 3和Oracle存储过程

MyBatis 3和Oracle存储过程

作者: wfg西游 | 来源:发表于2016-01-30 11:05 被阅读675次

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

    相关文章

      网友评论

        本文标题:MyBatis 3和Oracle存储过程

        本文链接:https://www.haomeiwen.com/subject/fnnjkttx.html