異曲同工 7個Android應用程序源代碼打包下載(與10個不一樣)

http://www.eoeandroid.com/thread-34054-1-1.html

 

http://www.javaeye.com/topic/390347

 

http://www.eoeandroid.com/thread-22331-1-1.html

                                     zxh--有用

 

 

1.               建立對象.由於要操作的都是對象或者對象組成的列表,所以需要在java代碼中和oracle中定義相對應的對象.這裏以STBid集合爲例,首先是數據庫端定義字符串(stbid)對象

CREATE OR REPLACE TYPE TYPE_STB_ID AS OBJECT

(

  STBID VARCHAR2(64)

)

                再定義字符串(stbid)集合

                     CREATE OR REPLACE TYPE STB_ID_CONNECTIONS

AS TABLE OF TYPE_STB_ID

                接下來在java中定義與字符串對象對應的對象:

import java.sql.Connection;

import java.sql.SQLException;

import oracle.jdbc.OracleTypes;

import oracle.jpub.runtime.MutableStruct;

import oracle.sql.Datum;

import oracle.sql.ORAData;

import oracle.sql.ORADataFactory;

import oracle.sql.STRUCT;

 

public class StbUpdate implements ORAData, ORADataFactory

{

   

    public static final String _SQL_NAME = "TYPE_STB_ID";

   

    private String stbId = "";// NOPMD

   

    public String getStbId()

    {

        return stbId;

    }

   

    public void setStbId(String stbId)

    {

        this.stbId = stbId;

        try

        {

            _struct.setAttribute(0, this.stbId);

        }

        catch (final SQLException e)

        {

           

        }

    }

   

    /**

     * toString

     *

     * @return String

     */

    @Override

    public String toString()

    {

        return this.stbId;

    }

   

    public static final int _SQL_TYPECODE = OracleTypes.STRUCT;

   

    protected MutableStruct _struct;

   

    static int[] _sqlType = {OracleTypes.VARCHAR};

   

    static ORADataFactory[] _factory = new ORADataFactory[1];

   

    static StbUpdate _stbUpdate=new StbUpdate();

   

    public StbUpdate(String stbid)

    {

        _struct = new MutableStruct(new Object[1], _sqlType, _factory);

        this.stbId = stbid;

        try

        {

            _struct.setAttribute(0, this.stbId);

        }

        catch (final SQLException e)

        {

           

        }

    }

   

    public Datum toDatum(final Connection conn)

        throws SQLException

    {

        if (null == _struct)

        {

            _struct = new MutableStruct(new Object[1], _sqlType, _factory);

            try

            {

                _struct.setAttribute(0, this.stbId);

            }

            catch (final SQLException e)

            {

               

            }

        }

        final Datum d = _struct.toDatum(conn, _SQL_NAME);

        return d;

    }

   

    public ORAData create(final Datum d, final int sqlType)

        throws SQLException

    {

        return create(null, d, sqlType);

    }

   

    protected ORAData create(StbUpdate o, final Datum d, final int sqlType)

        throws SQLException

    {

        if (d == null)

        {

            return null;

        }

        if (o == null)

        {

            o = new StbUpdate();

        }

        o._struct = new MutableStruct((STRUCT)d, _sqlType, _factory);

        return o;

    }

   

    public static ORADataFactory getORADataFactory()

    {

        return _stbUpdate;

    }

   

}

這裏需要引進兩個oracle的包,一個是ojdbc.jar(MQMC用的是dbchecker.jar),上面所引的oracle下的類全都是來自這個包,還有一個是charsets.jar,這個是oracle的多語言包,用來解決varchar類型字段編碼亂碼問題的.

              至於Java代碼中與字符串集合對應的對象,要在調用存儲過程的方法中設置.

2.               Oracle中的存儲過程,總體思路就是先將獲得的stbid集合放入一張臨時表中,再根據關聯關係將數據查詢出來存放進另一個集合中,最後將該集合返回.

CREATE OR REPLACE PROCEDURE PRC_QUERY_STB_INFOS

(

   STBIDS IN STB_ID_CONNECTIONS,

   STBINFOS OUT STB_INFO_CONNECTIONS

)

IS

   V_TOTALCOUNT number(10);

   TSTBIDS          const.varchararraytyp;

   MSTATES          const.numarraytyp;

   MSRIGHTS         const.numarraytyp;

   MPRECISIONSTATES const.numarraytyp;

   MLEVELS          const.numarraytyp;

   ASTATES          const.numarraytyp;

   AISRIGHTS        const.numarraytyp;

   ALEVELS          const.numarraytyp;

   SSTATES          const.numarraytyp;

   SASTATES         const.numarraytyp;

   SLEVELS          const.numarraytyp;

   v_sql            VARCHAR2(4096);

BEGIN

     v_sql        := 'insert into T_STB_ID_TMP(stbid) values (:1)';

     V_TOTALCOUNT := STBIDS.COUNT;

     STBINFOS     := STB_INFO_CONNECTIONS();

 

     FOR i IN 1 .. V_TOTALCOUNT LOOP

        EXECUTE IMMEDIATE v_sql

          using STBIDS(i).STBID;

     END LOOP;

 

     v_sql := 'SELECT t.stbid, t.manualstate,t.manualisright,t.manualprecisionstate,t.manuallevel,t.autostate,

       t.autoisright,t.autolevel,t.signalstate,t.samplestate,t.samplelevel from T_STB_ID_TMP s,T_TASK_STB t

       where t.stbid=s.stbid';

 

     EXECUTE IMMEDIATE v_sql BULK COLLECT

             INTO TSTBIDS, MSTATES, MSRIGHTS, MPRECISIONSTATES, MLEVELS, ASTATES, AISRIGHTS, ALEVELS, SSTATES, SASTATES, SLEVELS;

     FOR i IN 1..TSTBIDS.COUNT LOOP

           STBINFOS.extend;

           STBINFOS(STBINFOS.count) := TYPE_STB_INFO(TSTBIDS(i),MSTATES(i),MSRIGHTS(i),MPRECISIONSTATES(i),

                                      MLEVELS(i),ASTATES(i),AISRIGHTS(i),ALEVELS(i),SSTATES(i),SASTATES(i),SLEVELS(i));

     END LOOP;

 

     COMMIT;

EXCEPTION

     WHEN OTHERS THEN

          STBINFOS:=STB_INFO_CONNECTIONS();

END PRC_QUERY_STB_INFOS;

 

3.               java代碼調用存儲過程並獲得查詢結果.這裏分兩種情況說明.

a.       JDBC調用,代碼如下:

 

public static void callprocedure()

    {

        Connection conn = null;

        PreparedStatement ps = null;

        CallableStatement callableStatement = null;

        ResultSet rs = null;

        try

        {

            // 獲取數據庫連接

            conn = DriverManager.getConnection("jdbc:oracle:thin:@10.40.70.10:1521:orcl", "sqmlwx", "sqmlwx");

            if (null == conn)

            {

                System.out.println("get conn is null");

                return;

            }

            else

            {

                System.out.println("get conn not null");

            }

            // 預調用存儲過程

            callableStatement = conn.prepareCall("{ call PRC_QUERY_STB_INFOS(?,?)}");

           

            // 構造傳入參數

            List<String> lstStb=new ArrayList<String>();

            for (int i = 1; i <= 700; i++)

            {

                lstStb.add("stb_ptest_" + i);

            }

            StbUpdate[] strArray=new StbUpdate[700];

            for (int i = 0; i < strArray.length; i++)

            {

                strArray[i] = new StbUpdate(lstStb.get(i));

            }

           

            // stbid集合對象

            ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STB_ID_CONNECTIONS",

                conn);

            // 構造ARRAY

            ARRAY  parameter = new ARRAY(desc, conn, strArray);

            // 設置傳入參數

            callableStatement.setArray(1, parameter);

            // 設置返回結果

            callableStatement.registerOutParameter(2, Types.ARRAY, "STB_INFO_CONNECTIONS");        

           

            // 獲取操作結果

            Array array = (Array)callableStatement.getObject(2);

            // 爲空校驗

            if (null == array)

            {

                System.out.println(" array is null");

            }

            // 不爲空則打印獲得結果

            else

            {

                System.out.println(" array is not null");

                Object obj;

                String ss="";

                //獲取存儲過程返回的結果集

                final Object[] reasonValueList = (Object[])array.getArray();

                //判斷返回的結果集是否爲空,如果不爲空則輸出結果集記錄條數

                System.out.println(reasonValueList==null ? "null " : " not null: "+reasonValueList.length);

                for (final Object reasonValueResult : reasonValueList)

                {

                    final Struct s = (Struct)reasonValueResult;

                    obj=s.getAttributes()[0];

                    ss=obj.toString();

                    System.out.println("=======================================: "+ss+" : "+s.getAttributes()[1]);

                }

            }  

        }

        catch (SQLException e)

        {

            e.printStackTrace();

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

        finally

        {

            try

            {

                if (null != rs)

                {

                    rs.close();

                }

                if (ps != null)

                {

                    ps.close();

                }

                if (null != conn)

                {

                    conn.close();

                }

            }

            catch (SQLException e)

            {

                e.printStackTrace();

            }

        }

}

採用這種方式獲得的集合reasonValueList裏面存放的是stb對象的屬性集合,需要自己將其再封裝成對應的對象(Stb).

b.       IBATIS調用,首先要配置sql文件

 

<parameterMap id="queryStbTaskidMap" class="java.util.HashMap">

        <parameter property="idList" jdbcType="STB_ID_CONNECTIONS"

            javaType="java.util.ArrayList" mode="IN"  

            typeHandler="com.netom.common.device.StbInfoHandler" /> 

        <parameter property="result" jdbcType="ARRAY" javaType="java.sql.Array"

            typeName="STB_INFO_CONNECTIONS" mode="OUT"

            typeHandler="com.netom.common.device.StbInfoHandler" />

    </parameterMap>

    <procedure id="queryStbTaskidListInfo" parameterMap="queryStbTaskidMap">

        { call PRC_QUERY_STB_INFOS(?, ?) }

</procedure>

先是參數映射關係parameterMap,其中包含兩個參數,一個爲傳入參數,另一個爲結果參數,都爲集合,最後一個是定義存儲過程procedure.

其次,需要多寫一個對象處理類(即配置文件中的StbInfoHandler),裏面主要是兩個方法:第一個是傳入參數重新編碼的方法,另一個是獲得集合後封裝對象的方法.

import java.math.BigDecimal;

import java.sql.Array;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.Struct;

import java.util.ArrayList;

import java.util.List;

 

import oracle.jdbc.OracleTypes;

import oracle.sql.ARRAY;

import oracle.sql.ArrayDescriptor;

 

import com.ibatis.sqlmap.client.extensions.ParameterSetter;

import com.ibatis.sqlmap.client.extensions.ResultGetter;

import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;

import com.netom.interceptor.logger.Logger;

 

public class StbInfoHandler implements TypeHandlerCallback

{

   

    private static final String EMP_SALARY_REC ="TYPE_STB_ID";

    private static final String EMP_SALARY_TAB = "STB_ID_CONNECTIONS";

    static

    {

        JdbcTypeRegistry.setType(EMP_SALARY_REC, OracleTypes.STRUCT);

        JdbcTypeRegistry.setType(EMP_SALARY_TAB, OracleTypes.ARRAY);

    };

   

    /**

     * 獲得結果

     *

     * @param getter 結果

     * @return Object

     * @throws SQLException 異常

     */

    @Override

    public Object getResult(ResultGetter getter) throws SQLException

    {

        final List<Stb> result = new ArrayList<Stb>();

        Stb stbInfo = null;

        try

        {

           

            final Array array = (Array)getter.getObject();

            final Object[] reasonValueList = (Object[])array.getArray();

            for (final Object reasonValueResult : reasonValueList)

            {

                final Struct s = (Struct)reasonValueResult;

               

                try

                {

                    final int two = 2;

                    final int three = 3;

                    final int four = 4;

                    final int five = 5;

                    final int six = 6;

                    final int seven = 7;

                    final int eight = 8;

                    final int nine = 9;

                    final int ten = 10;

                    stbInfo = new Stb();

                    stbInfo.setStbID((String)s.getAttributes()[0]);

                    stbInfo.setManualState(((BigDecimal)s.getAttributes()[1]).intValue());

                    stbInfo.setManualIsRight(((BigDecimal)s.getAttributes()[two]).intValue());

                    stbInfo.setManualPrecisionState(((BigDecimal)s.getAttributes()[three]).intValue());

                    stbInfo.setManualLevel(((BigDecimal)s.getAttributes()[four]).intValue());

                    stbInfo.setAutoState(((BigDecimal)s.getAttributes()[five]).intValue());

                    stbInfo.setAutoIsRight(((BigDecimal)s.getAttributes()[six]).intValue());

                    stbInfo.setAutoLevel(((BigDecimal)s.getAttributes()[seven]).intValue());

                    stbInfo.setSignalState(((BigDecimal)s.getAttributes()[eight]).intValue());

                    stbInfo.setSampleState(((BigDecimal)s.getAttributes()[nine]).intValue());

                    stbInfo.setSampleLevel(((BigDecimal)s.getAttributes()[ten]).intValue());

                   

                    result.add(stbInfo);

                }

                catch (final Exception e)

                {

                    // 可能由於底層數據不合格,導致空指針異常

                    // 避免一條記錄失敗引起全部記錄失敗

                    Logger.error("Reason Error:" + stbInfo);

                }

            }

           

        }

        catch (final Exception e)

        {

            Logger.error("VMOSLevelHandler Error:" + e.getMessage());

        }

        return result;

    }

 

    /**

     * 設置參數

     *

     * @param ps 設置

     * @param param 參數

     * @throws SQLException 異常

     */

    @SuppressWarnings("unchecked")

    public void setParameter(final ParameterSetter setter, Object parameter)

        throws SQLException

    {

        if (parameter instanceof ArrayList)

        {

            final List<StbUpdate> arr = (ArrayList<StbUpdate>)parameter;

            StbUpdate[] strArray=new StbUpdate[arr.size()];

            for (int i = 0; i < strArray.length; i++)

            {

                strArray[i] = arr.get(i);

            }

            final Statement stmt = setter.getPreparedStatement();

            final org.apache.commons.dbcp.PoolableConnection conn = (org.apache.commons.dbcp.PoolableConnection)stmt.getConnection();

            final java.sql.Connection realConn = conn.getDelegate();

            final ArrayDescriptor desc = ArrayDescriptor.createDescriptor(EMP_SALARY_TAB,

                    realConn);

            parameter = new ARRAY(desc, realConn, strArray);

        }

        setter.setObject(parameter);

       

    }

 

    @Override

    public Object valueOf(String arg0)

    {

        // TODO Auto-generated method stub

        return null;

    }

}

 

最後,調用存儲過程的方法中的代碼

 

// 獲取stbid隊列

            for (final StbTaskBean stbTaskBean : lstUpdate)

            {

                tmpStbID = stbTaskBean.getStbRegisterReq().getStbId();

                idList.add(new StbUpdate(tmpStbID));

                reqMap.put(tmpStbID,

                    stbTaskBean.getStbRegisterReq());

            }

            final Map<String, Object> conditions = new HashMap<String, Object>();

            conditions.put("idList", idList);

            // 查詢stb信息

            final Map result = dbHelper.dynamicQueryMap("Device.queryStbTaskidListInfo",

                conditions);

            if (!result.isEmpty())

            {

                stbList = (List<Stb>) result.get(IndexConstants.KEY_RESULT);

               

                if (null != stbList)

                {

                    ……

                }

            }

1.               建立對象.由於要操作的都是對象或者對象組成的列表,所以需要在java代碼中和oracle中定義相對應的對象.這裏以STBid集合爲例,首先是數據庫端定義字符串(stbid)對象

CREATE OR REPLACE TYPE TYPE_STB_ID AS OBJECT

(

  STBID VARCHAR2(64)

)

                再定義字符串(stbid)集合

                     CREATE OR REPLACE TYPE STB_ID_CONNECTIONS

AS TABLE OF TYPE_STB_ID

                接下來在java中定義與字符串對象對應的對象:

import java.sql.Connection;

import java.sql.SQLException;

import oracle.jdbc.OracleTypes;

import oracle.jpub.runtime.MutableStruct;

import oracle.sql.Datum;

import oracle.sql.ORAData;

import oracle.sql.ORADataFactory;

import oracle.sql.STRUCT;

 

public class StbUpdate implements ORAData, ORADataFactory

{

   

    public static final String _SQL_NAME = "TYPE_STB_ID";

   

    private String stbId = "";// NOPMD

   

    public String getStbId()

    {

        return stbId;

    }

   

    public void setStbId(String stbId)

    {

        this.stbId = stbId;

        try

        {

            _struct.setAttribute(0, this.stbId);

        }

        catch (final SQLException e)

        {

           

        }

    }

   

    /**

     * toString

     *

     * @return String

     */

    @Override

    public String toString()

    {

        return this.stbId;

    }

   

    public static final int _SQL_TYPECODE = OracleTypes.STRUCT;

   

    protected MutableStruct _struct;

   

    static int[] _sqlType = {OracleTypes.VARCHAR};

   

    static ORADataFactory[] _factory = new ORADataFactory[1];

   

    static StbUpdate _stbUpdate=new StbUpdate();

   

    public StbUpdate(String stbid)

    {

        _struct = new MutableStruct(new Object[1], _sqlType, _factory);

        this.stbId = stbid;

        try

        {

            _struct.setAttribute(0, this.stbId);

        }

        catch (final SQLException e)

        {

           

        }

    }

   

    public Datum toDatum(final Connection conn)

        throws SQLException

    {

        if (null == _struct)

        {

            _struct = new MutableStruct(new Object[1], _sqlType, _factory);

            try

            {

                _struct.setAttribute(0, this.stbId);

            }

            catch (final SQLException e)

            {

               

            }

        }

        final Datum d = _struct.toDatum(conn, _SQL_NAME);

        return d;

    }

   

    public ORAData create(final Datum d, final int sqlType)

        throws SQLException

    {

        return create(null, d, sqlType);

    }

   

    protected ORAData create(StbUpdate o, final Datum d, final int sqlType)

        throws SQLException

    {

        if (d == null)

        {

            return null;

        }

        if (o == null)

        {

            o = new StbUpdate();

        }

        o._struct = new MutableStruct((STRUCT)d, _sqlType, _factory);

        return o;

    }

   

    public static ORADataFactory getORADataFactory()

    {

        return _stbUpdate;

    }

   

}

這裏需要引進兩個oracle的包,一個是ojdbc.jar(MQMC用的是dbchecker.jar),上面所引的oracle下的類全都是來自這個包,還有一個是charsets.jar,這個是oracle的多語言包,用來解決varchar類型字段編碼亂碼問題的.

              至於Java代碼中與字符串集合對應的對象,要在調用存儲過程的方法中設置.

2.               Oracle中的存儲過程,總體思路就是先將獲得的stbid集合放入一張臨時表中,再根據關聯關係將數據查詢出來存放進另一個集合中,最後將該集合返回.

CREATE OR REPLACE PROCEDURE PRC_QUERY_STB_INFOS

(

   STBIDS IN STB_ID_CONNECTIONS,

   STBINFOS OUT STB_INFO_CONNECTIONS

)

IS

   V_TOTALCOUNT number(10);

   TSTBIDS          const.varchararraytyp;

   MSTATES          const.numarraytyp;

   MSRIGHTS         const.numarraytyp;

   MPRECISIONSTATES const.numarraytyp;

   MLEVELS          const.numarraytyp;

   ASTATES          const.numarraytyp;

   AISRIGHTS        const.numarraytyp;

   ALEVELS          const.numarraytyp;

   SSTATES          const.numarraytyp;

   SASTATES         const.numarraytyp;

   SLEVELS          const.numarraytyp;

   v_sql            VARCHAR2(4096);

BEGIN

     v_sql        := 'insert into T_STB_ID_TMP(stbid) values (:1)';

     V_TOTALCOUNT := STBIDS.COUNT;

     STBINFOS     := STB_INFO_CONNECTIONS();

 

     FOR i IN 1 .. V_TOTALCOUNT LOOP

        EXECUTE IMMEDIATE v_sql

          using STBIDS(i).STBID;

     END LOOP;

 

     v_sql := 'SELECT t.stbid, t.manualstate,t.manualisright,t.manualprecisionstate,t.manuallevel,t.autostate,

       t.autoisright,t.autolevel,t.signalstate,t.samplestate,t.samplelevel from T_STB_ID_TMP s,T_TASK_STB t

       where t.stbid=s.stbid';

 

     EXECUTE IMMEDIATE v_sql BULK COLLECT

             INTO TSTBIDS, MSTATES, MSRIGHTS, MPRECISIONSTATES, MLEVELS, ASTATES, AISRIGHTS, ALEVELS, SSTATES, SASTATES, SLEVELS;

     FOR i IN 1..TSTBIDS.COUNT LOOP

           STBINFOS.extend;

           STBINFOS(STBINFOS.count) := TYPE_STB_INFO(TSTBIDS(i),MSTATES(i),MSRIGHTS(i),MPRECISIONSTATES(i),

                                      MLEVELS(i),ASTATES(i),AISRIGHTS(i),ALEVELS(i),SSTATES(i),SASTATES(i),SLEVELS(i));

     END LOOP;

 

     COMMIT;

EXCEPTION

     WHEN OTHERS THEN

          STBINFOS:=STB_INFO_CONNECTIONS();

END PRC_QUERY_STB_INFOS;

 

3.               java代碼調用存儲過程並獲得查詢結果.這裏分兩種情況說明.

a.       JDBC調用,代碼如下:

 

public static void callprocedure()

    {

        Connection conn = null;

        PreparedStatement ps = null;

        CallableStatement callableStatement = null;

        ResultSet rs = null;

        try

        {

            // 獲取數據庫連接

            conn = DriverManager.getConnection("jdbc:oracle:thin:@10.40.70.10:1521:orcl", "sqmlwx", "sqmlwx");

            if (null == conn)

            {

                System.out.println("get conn is null");

                return;

            }

            else

            {

                System.out.println("get conn not null");

            }

            // 預調用存儲過程

            callableStatement = conn.prepareCall("{ call PRC_QUERY_STB_INFOS(?,?)}");

           

            // 構造傳入參數

            List<String> lstStb=new ArrayList<String>();

            for (int i = 1; i <= 700; i++)

            {

                lstStb.add("stb_ptest_" + i);

            }

            StbUpdate[] strArray=new StbUpdate[700];

            for (int i = 0; i < strArray.length; i++)

            {

                strArray[i] = new StbUpdate(lstStb.get(i));

            }

           

            // stbid集合對象

            ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STB_ID_CONNECTIONS",

                conn);

            // 構造ARRAY

            ARRAY  parameter = new ARRAY(desc, conn, strArray);

            // 設置傳入參數

            callableStatement.setArray(1, parameter);

            // 設置返回結果

            callableStatement.registerOutParameter(2, Types.ARRAY, "STB_INFO_CONNECTIONS");        

           

            // 獲取操作結果

            Array array = (Array)callableStatement.getObject(2);

            // 爲空校驗

            if (null == array)

            {

                System.out.println(" array is null");

            }

            // 不爲空則打印獲得結果

            else

            {

                System.out.println(" array is not null");

                Object obj;

                String ss="";

                //獲取存儲過程返回的結果集

                final Object[] reasonValueList = (Object[])array.getArray();

                //判斷返回的結果集是否爲空,如果不爲空則輸出結果集記錄條數

                System.out.println(reasonValueList==null ? "null " : " not null: "+reasonValueList.length);

                for (final Object reasonValueResult : reasonValueList)

                {

                    final Struct s = (Struct)reasonValueResult;

                    obj=s.getAttributes()[0];

                    ss=obj.toString();

                    System.out.println("=======================================: "+ss+" : "+s.getAttributes()[1]);

                }

            }  

        }

        catch (SQLException e)

        {

            e.printStackTrace();

        }

        catch (Exception e)

        {

            e.printStackTrace();

        }

        finally

        {

            try

            {

                if (null != rs)

                {

                    rs.close();

                }

                if (ps != null)

                {

                    ps.close();

                }

                if (null != conn)

                {

                    conn.close();

                }

            }

            catch (SQLException e)

            {

                e.printStackTrace();

            }

        }

}

採用這種方式獲得的集合reasonValueList裏面存放的是stb對象的屬性集合,需要自己將其再封裝成對應的對象(Stb).

b.       IBATIS調用,首先要配置sql文件

 

<parameterMap id="queryStbTaskidMap" class="java.util.HashMap">

        <parameter property="idList" jdbcType="STB_ID_CONNECTIONS"

            javaType="java.util.ArrayList" mode="IN"  

            typeHandler="com.netom.common.device.StbInfoHandler" /> 

        <parameter property="result" jdbcType="ARRAY" javaType="java.sql.Array"

            typeName="STB_INFO_CONNECTIONS" mode="OUT"

            typeHandler="com.netom.common.device.StbInfoHandler" />

    </parameterMap>

    <procedure id="queryStbTaskidListInfo" parameterMap="queryStbTaskidMap">

        { call PRC_QUERY_STB_INFOS(?, ?) }

</procedure>

先是參數映射關係parameterMap,其中包含兩個參數,一個爲傳入參數,另一個爲結果參數,都爲集合,最後一個是定義存儲過程procedure.

其次,需要多寫一個對象處理類(即配置文件中的StbInfoHandler),裏面主要是兩個方法:第一個是傳入參數重新編碼的方法,另一個是獲得集合後封裝對象的方法.

import java.math.BigDecimal;

import java.sql.Array;

import java.sql.SQLException;

import java.sql.Statement;

import java.sql.Struct;

import java.util.ArrayList;

import java.util.List;

 

import oracle.jdbc.OracleTypes;

import oracle.sql.ARRAY;

import oracle.sql.ArrayDescriptor;

 

import com.ibatis.sqlmap.client.extensions.ParameterSetter;

import com.ibatis.sqlmap.client.extensions.ResultGetter;

import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

import com.ibatis.sqlmap.engine.type.JdbcTypeRegistry;

import com.netom.interceptor.logger.Logger;

 

public class StbInfoHandler implements TypeHandlerCallback

{

   

    private static final String EMP_SALARY_REC ="TYPE_STB_ID";

    private static final String EMP_SALARY_TAB = "STB_ID_CONNECTIONS";

    static

    {

        JdbcTypeRegistry.setType(EMP_SALARY_REC, OracleTypes.STRUCT);

        JdbcTypeRegistry.setType(EMP_SALARY_TAB, OracleTypes.ARRAY);

    };

   

    /**

     * 獲得結果

     *

     * @param getter 結果

     * @return Object

     * @throws SQLException 異常

     */

    @Override

    public Object getResult(ResultGetter getter) throws SQLException

    {

        final List<Stb> result = new ArrayList<Stb>();

        Stb stbInfo = null;

        try

        {

           

            final Array array = (Array)getter.getObject();

            final Object[] reasonValueList = (Object[])array.getArray();

            for (final Object reasonValueResult : reasonValueList)

            {

                final Struct s = (Struct)reasonValueResult;

               

                try

                {

                    final int two = 2;

                    final int three = 3;

                    final int four = 4;

                    final int five = 5;

                    final int six = 6;

                    final int seven = 7;

                    final int eight = 8;

                    final int nine = 9;

                    final int ten = 10;

                    stbInfo = new Stb();

                    stbInfo.setStbID((String)s.getAttributes()[0]);

                    stbInfo.setManualState(((BigDecimal)s.getAttributes()[1]).intValue());

                    stbInfo.setManualIsRight(((BigDecimal)s.getAttributes()[two]).intValue());

                    stbInfo.setManualPrecisionState(((BigDecimal)s.getAttributes()[three]).intValue());

                    stbInfo.setManualLevel(((BigDecimal)s.getAttributes()[four]).intValue());

                    stbInfo.setAutoState(((BigDecimal)s.getAttributes()[five]).intValue());

                    stbInfo.setAutoIsRight(((BigDecimal)s.getAttributes()[six]).intValue());

                    stbInfo.setAutoLevel(((BigDecimal)s.getAttributes()[seven]).intValue());

                    stbInfo.setSignalState(((BigDecimal)s.getAttributes()[eight]).intValue());

                    stbInfo.setSampleState(((BigDecimal)s.getAttributes()[nine]).intValue());

                    stbInfo.setSampleLevel(((BigDecimal)s.getAttributes()[ten]).intValue());

                   

                    result.add(stbInfo);

                }

                catch (final Exception e)

                {

                    // 可能由於底層數據不合格,導致空指針異常

                    // 避免一條記錄失敗引起全部記錄失敗

                    Logger.error("Reason Error:" + stbInfo);

                }

            }

           

        }

        catch (final Exception e)

        {

            Logger.error("VMOSLevelHandler Error:" + e.getMessage());

        }

        return result;

    }

 

    /**

     * 設置參數

     *

     * @param ps 設置

     * @param param 參數

     * @throws SQLException 異常

     */

    @SuppressWarnings("unchecked")

    public void setParameter(final ParameterSetter setter, Object parameter)

        throws SQLException

    {

        if (parameter instanceof ArrayList)

        {

            final List<StbUpdate> arr = (ArrayList<StbUpdate>)parameter;

            StbUpdate[] strArray=new StbUpdate[arr.size()];

            for (int i = 0; i < strArray.length; i++)

            {

                strArray[i] = arr.get(i);

            }

            final Statement stmt = setter.getPreparedStatement();

            final org.apache.commons.dbcp.PoolableConnection conn = (org.apache.commons.dbcp.PoolableConnection)stmt.getConnection();

            final java.sql.Connection realConn = conn.getDelegate();

            final ArrayDescriptor desc = ArrayDescriptor.createDescriptor(EMP_SALARY_TAB,

                    realConn);

            parameter = new ARRAY(desc, realConn, strArray);

        }

        setter.setObject(parameter);

       

    }

 

    @Override

    public Object valueOf(String arg0)

    {

        // TODO Auto-generated method stub

        return null;

    }

}

 

最後,調用存儲過程的方法中的代碼

 

// 獲取stbid隊列

            for (final StbTaskBean stbTaskBean : lstUpdate)

            {

                tmpStbID = stbTaskBean.getStbRegisterReq().getStbId();

                idList.add(new StbUpdate(tmpStbID));

                reqMap.put(tmpStbID,

                    stbTaskBean.getStbRegisterReq());

            }

            final Map<String, Object> conditions = new HashMap<String, Object>();

            conditions.put("idList", idList);

            // 查詢stb信息

            final Map result = dbHelper.dynamicQueryMap("Device.queryStbTaskidListInfo",

                conditions);

            if (!result.isEmpty())

            {

                stbList = (List<Stb>) result.get(IndexConstants.KEY_RESULT);

               

                if (null != stbList)

                {

                    ……

                }

            }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章