`
jstudio
  • 浏览: 8633 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

使用Jorm处理Oracle存储过程返回多个游标

阅读更多
> 引言
日常开发中,使用Oracle存储过程,有时候会处理返回多个游标的情况,下面介绍使用 Jorm 框架来处理这一情况

> 数据库准备
1.表
CREATE TABLE `t_user` (               
        `id` int(11) NOT NULL,              
        `name` varchar(50) DEFAULT NULL,    
        `sex` char(4) DEFAULT NULL,         
        `age` int(11) DEFAULT NULL,         
        `career` varchar(100) DEFAULT NULL, 
        PRIMARY KEY (`id`)                  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.存储过程
-- 定义存储过程
CREATE OR REPLACE PROCEDURE pro_query_users
(
--参数IN表示输入参数,OUT表示输入参数,类型可以使用任意Oracle中的合法类型。
in_id IN NUMBER,
out_cursor_one OUT package_one.cursor_one,
out_cursor_two OUT package_two.cursor_two    
)
AS
--定义变量
vs_id_value   NUMBER;  --变量

BEGIN
--用输入参数给变量赋初值。
vs_id_value:= in_id;

OPEN out_cursor_one FOR SELECT * FROM t_user WHERE id > vs_id_value;

OPEN out_cursor_two FOR SELECT * FROM t_user WHERE name LIKE '%a%';

--错误处理部分。OTHERS表示除了声明外的任意错误。SQLERRM是系统内置变量保存了当前错误的详细信息。
Exception
   WHEN OTHERS Then
   ROLLBACK;
   Return;
End pro_query_users;


> 代码
1.实体类 User.java

import org.javaclub.jorm.annotation.Entity;
import org.javaclub.jorm.annotation.Id;
import org.javaclub.jorm.annotation.NoColumn;
import org.javaclub.jorm.annotation.PK;

@Entity(table = "t_user", lazy = true)
@PK(value = "id")
public  class  User  {

    @Id
    private int id;

    private String name;

    private String sex;

    private Integer age;

    private String career;

    @NoColumn
    private int kvalue;

    public User() {
        super();
    }

    public User(String name, String sex, Integer age, String[] career) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.career = career;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String[] getCareer() {
        return career;
    }

    public void setCareer(String[] career) {
        this.career = career;
    }

    public int getKvalue() {
        return kvalue;
    }

    public void setKvalue(int kvalue) {
        this.kvalue = kvalue;
    }

    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("[" + id + ", " + name + ", " + sex + ", " + age + ", " + career + "]");
        return sb.toString();
    }
}

2.测试

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import org.javaclub.jorm.Jorm;
import org.javaclub.jorm.Session;
import org.javaclub.jorm.common.Numbers;
import org.javaclub.jorm.common.Strings;
import org.javaclub.jorm.demos.entity.User;
import org.javaclub.jorm.jdbc.callable.ProcedureCaller;
import org.javaclub.jorm.jdbc.sql.SqlParams;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

/**
* ProcedureTest
*
* @author Gerald Chen
* @version $Id: ProcedureTest.java 2011-8-25 下午06:18:17 Exp $
*/
public class ProcedureTest {

    static Session session;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        session = Jorm.getSession();
    }
   
    @AfterClass
    public static void destroyAfterClass() {
        Jorm.free();
    }

   
    @Test
    public void save_user() {
        session.clean(User.class);
        User user = null;
        for (int i = 0; i < 1600; i++) {
            String sex = (i % 2 == 0 ? "男" : "女");
            user = new User(Strings.fixed(5), sex, Numbers.random(98), Strings.random(8));
            session.save(user);
        }
    }
   
    @Test
    public void oracle_load_two_cursor() {
       
        save_user();
       
        final String pro = "{call pro_query_users(?, ?, ?)}";
        final List<User> gtIdUsers = new ArrayList<User>();
        final List<User> likeNameUsers = new ArrayList<User>();
       
        session.call(new ProcedureCaller() {
           
            public CallableStatement prepare() throws SQLException {
                CallableStatement cs = this.getSession().getConnection().prepareCall(pro);
                cs.setInt(1, 20);
                cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
                cs.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);
                return cs;
            }
           
            public String callback(CallableStatement cs) throws SQLException {
                cs.execute();
                ResultSet rsOne = (ResultSet) cs.getObject(2);//返回第一个游标
                ResultSet rsTwo = (ResultSet) cs.getObject(3);//返回第二个游标
                while(rsOne != null && rsOne.next()) {
                    gtIdUsers.add(session.getPersister().toBean(rsOne, User.class));
                }
                while(rsTwo != null && rsTwo.next()) {
                    likeNameUsers.add(session.getPersister().toBean(rsTwo, User.class));
                }
                return null;
            }
        });
       
        Assert.assertTrue(gtIdUsers.size() > 0);
        System.out.println(gtIdUsers.size() + " => " + gtIdUsers);
       
        Assert.assertTrue(likeNameUsers.size() > 0);
        System.out.println(likeNameUsers.size() + " => " + likeNameUsers);
    }
}

项目地址:http://javaclub.sourceforge.net/jorm.html
下载地址: http://sourceforge.net/projects/javaclub/files/jorm/
1
2
分享到:
评论

相关推荐

    p4jorm 1.0.1版本

    P4JORM,全称为“Perforce JORM”,是一款专为Java应用程序设计的对象关系映射(ORM)框架,它旨在简化数据库操作,通过提供一个高级接口来处理SQL查询和数据持久化。在P4JORM 1.0.1版本中,主要修复了一个与Java ...

    jorm-1.0.7.GA-javadoc

    jorm-1.0.7.GA-javadoc

    JORM_2.9_bin

    **JORM 2.9:Java对象存储映射框架** JORM,全称为Java Object Relational Mapping,是一款针对Java开发者的开源持久性框架。它的主要功能是为Java对象提供数据库映射服务,使得开发者可以更加方便地管理和操作...

    p4jorm 1.0.3版本

    【P4JORM 1.0.3 版本详解】 P4JORM,全称为“Perfected Java Object-Relational Mapping”,是一款基于Java语言的高效ORM(对象关系映射)框架。在1.0.3这个版本中,开发者针对用户需求和常见问题进行了重要的改进...

    p4jorm 1.6编译版本

    开始那个版本是1.7,有些同学遇到“java.lang.UnsupportedClassVersionError: Bad version ”问题,如果是jdk 1.6,请用此版本,或者自己编译一个,因为已发布源码

    jorm轻量级的orm框架

    不用写sql啦,不用创建表啦,一个比mybatis更轻量级,比hibernate好用的orm!

    java轻量级ORM实现-jorm (Just ORM)

    This project is based on Java, is a lightweight ORM model. Only concerned about the Object-Relationl Mapping, therefore more simple and easier to use, easier to control. Key support functions and ...

    p4jorm 源码 文档 示例

    你还写jdbc呢?还在反复HQL拼写工作?p4jorm让你无需写一行代码,即可进行CURD,真正的简单易学。本人用了3天时间完成,还请各位多多指点 http://blog.csdn.net/partner4java/article/details/8559661 ...

    jorm-unit:JUnit扩展可协助服务器外自动化JPA测试

    "jorm-unit" 是一个专门为 JUnit 设计的扩展库,它的主要目的是简化和增强针对 Java 持久层API(JPA)的单元测试过程。"JUnit扩展可协助服务器外自动化JPA测试" 表明这个库能够帮助开发者在不依赖于实际服务器环境的...

    java OR-Mapper-开源

    ORM支持多线程会话,这意味着在并发环境下,多个线程可以独立地操作自己的数据库会话,互不影响,提升了程序的并发处理能力。同时,它还实现了继承和接口的支持,使得继承结构的Java类能够被正确地映射到数据库中,...

    92个经典开源项目集锦

    这些项目涵盖了从操作系统、数据库管理系统、对象关系映射框架、应用服务器、消息中间件、Web 开发框架到报表生成工具等多个领域,体现了开源社区的丰富多样性和强大实力。下面,我们将详细探讨这些项目及其在 IT ...

    面向对象设计 PPT

    主要讲的ssi框架,MVC对于我们来说,已经不陌生了,它起源于20世纪80年代针对smalltalk语言的一种软件设计模式,...由于最近用了一次SSI框架,因此本文主要是对Strtus2、Spring、iBatis三个开源的MVC框架进行一个小结。

    HealthDeterminants:健康可视化的社会决定因素

    多个决定因素对健康结果的相对贡献。 (nd)。 于2016年3月14日从检索 捕获电子健康记录中的社会和行为领域和措施:第2阶段(2014年)。 华盛顿特区:国家科学院出版社。 Gruszin,S.和Jorm,L.(2010年12月)。 ...

    最近收到的书

    最近收到的书籍 ...JORM, AF 阅读和拼写障碍的心理学。 波士顿:Routledge &amp; Kegan Paul,1983 年,134 页,价格不详。 KNOWLES, D., &amp; REEVES, N. 但是奶奶不需要她的袜子吗? 爱荷华州迪比克

Global site tag (gtag.js) - Google Analytics