Hello Rahul,

here an example for Date[]/date[]

Can any one tell me how to use typehandlercallback implementation with sqlmap while doing insert

public void insert(Planschichteinheit record)
{
        getSqlMapClientTemplate().insert("planschichteinheit.insert", record);
}

and one more thing how would I map my array data type in my sqlmap

<insert id="insert" parameterClass="com.asci.nef.types.disposition.Planschichteinheit">
        INSERT INTO planschichteinheit
        (
                id,
                planschichtid,
                auftragstage
        )
        VALUES
        (
                #id:INTEGER#,
                #planschicht.id:INTEGER#,
                #auftragstage,handler=DateArrayTypeHandler#,
        )
</insert>

The same as with the <select>.

I know I can map my class for int but how I would do it for short array which holds the different account numbers which a person holds

At my Backend AccountNumbers field map to varchar , so to overcome this I can use custom TypeHandlerCallback implementation but how would

Declare this in my sqlmap and I am not allowed to change my data type in DB.

<typeAlias alias="DateArrayTypeHandler" type="com.asci.common.ibatis.DateArrayTypeHandler" /> <typeAlias alias="BitNTypeHandler" type="com.asci.common.ibatis.BitNTypeHandler" /> <typeAlias alias="IntArrayTypeHandler" type="com.asci.common.ibatis.IntArrayTypeHandler" />
...

Say I have following class

public class Person
{
      int age;

      short [] Accountnumbers;

      public short[] getAccountnumbers()
      {
            return Accountnumbers;
      }

      public void setAccountnumbers(short[] accountnumbers)
      {
            Accountnumbers = accountnumbers;
      }

      public int getAge()
      {
            return age;
      }

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

OK.

import java.sql.SQLException;

import java.sql.Types;

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

public class ArraysToStringTypeHandler implements TypeHandlerCallback
{
      public Object getResult(ResultGetter arg0) throws SQLException
      {
            return null;
      }

public void setParameter(ParameterSetter setter, Object parameter) throws SQLException
      {
            if (parameter == null) {
                  setter.setNull(Types./CHAR/);
        } else {
            setter.setString(ArraysToString( parameter));
        }
      }

      public Object valueOf(String arg0)
      {
            return null;
      }

      private String ArraysToString(Object obj)
      {
            if (obj == null)
            {
throw new IllegalArgumentException ("Could not convert null to a String value. " +
                  "Valid argument is an array of type short Only ");
            }
            else if (obj instanceof short[])
            {
                  short[] ourData = (short []) obj;
                  int length = ourData.length;

                  StringBuffer dataHolderSb = new StringBuffer();
                  for (int i = 0; i < length; i++)
                  {
                        dataHolderSb.append(ourData[i]);
                  }

                  return dataHolderSb.toString();
            }
            else {
return null; }
      }
}

Dependend on your type of DBMS and its configuration you need to use an java.sql.Array implementation.

Here is an working example for int[] and PostgreSQL 8.1:

package com.asci.common.ibatis;

import java.sql.Array;
import java.sql.SQLException;
import java.util.Collection;

import com.asci.common.jdbc.IntArray;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

public class IntArrayTypeHandler
implements TypeHandlerCallback
{
        public void setParameter(ParameterSetter setter, Object parameter)
        throws SQLException
        {
                Collection<Integer> keys = (Collection<Integer>) parameter;
                IntArray intArray = new IntArray(keys);
                setter.setArray(intArray);
        }
        
        public Object getResult(ResultGetter getter)
        throws SQLException
        {
                Array array = getter.getArray();
                return array;
        }
        
        public Object valueOf(String string)
        {
                return string;
        }
}

package com.asci.common.jdbc;

import java.sql.SQLException;
import java.sql.Types;
import java.util.Collection;

public class IntArray
extends SqlArrayAdapter
{
        private static final Integer[] emptyArray = new Integer[0];
        
        private int[] array;
        
        public IntArray(int[] array)
        {
                if (array == null)
                {
                        throw new IllegalArgumentException("parameter array should 
not be null");
                }
                this.array = array;
        }
        
        public IntArray(Collection<Integer> set)
        {
                if (set == null)
                {
                        throw new IllegalArgumentException("parameter set should not 
be null");
                }
                Integer[] keys = set.toArray(emptyArray);

                this.array = new int[keys.length];
                for (int i = 0; i < keys.length; ++i)
                {
                        Integer key = keys[i];
                        this.array[i] = key.intValue();
                }
        }
        
        @Override
        public int getBaseType()
        throws SQLException
        {
                return Types.INTEGER;
        }

        /**
         * This method is called by driver ver. 8 but not by ver. 7.
         */
        @Override
        public String getBaseTypeName()
        throws SQLException
        {
                return "int4";
        }
        
        /**
         * This method is called by both drivers ver. 8 and 7.
         */
        @Override
        public String toString()
        {
                String result = "{";
                for (int i = 0; i < this.array.length; ++i)
                {
                        if (i > 0)
                        {
                                result += ",";
                        }
                        result += this.array[i];
                }
                result += "}";
                return result;
        }
}

package com.asci.common.jdbc;

import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;

/**
* Die Klasse implementiert java.sql.Array, so dass man in davon abgeleiteten Klassen nur die
 * benötigten Methoden überschreiben muss.
 *
 * @author IngmarL
 */
public abstract class SqlArrayAdapter
implements Array
{
        public Object getArray() throws SQLException
        {
                return null;
        }
        
        public Object getArray(long index, int count) throws SQLException
        {
                return null;
        }
        
public Object getArray(long index, int count, Map<String, Class< ? >> map) throws SQLException
        {
                return null;
        }
        
        public Object getArray(Map<String, Class< ? >> map) throws SQLException
        {
                return null;
        }
        
        public int getBaseType() throws SQLException
        {
                return 0;
        }
        
        public String getBaseTypeName() throws SQLException
        {
                return null;
        }
        
        public ResultSet getResultSet() throws SQLException
        {
                return null;
        }
        
        public ResultSet getResultSet(long index, int count) throws SQLException
        {
                return null;
        }
        
public ResultSet getResultSet(long index, int count, Map<String, Class< ? >> map) throws SQLException
        {
                return null;
        }
        
public ResultSet getResultSet(Map<String, Class< ? >> map) throws SQLException
        {
                return null;
        }
}

<insert id="Person" parameterClass="com.foo.Contact">
           insert into personTable (age,Accountnumbers)
values (#age #,#what to declare for short array here for Accountnumber field, handler=ArraysToStringTypeHandler #)
</insert>

You didn't show us the class Contact. If there is the same method getAccountnumbers() as in Person, write

values (#age#, #accountnumbers,handler=ArraysToStringTypeHandler#)

I didn't try, if the spaces are correct in

#age #

and

#accountnumbers, handler=ArraysToStringTypeHandler #

Ingmar

Reply via email to