ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ingmar Lötzsch <iloetz...@asci-systemhaus.de>
Subject Re: Insert help
Date Wed, 04 Feb 2009 08:59:27 GMT
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

Mime
View raw message