IBatis.Net学习笔记八--把字段映射成一个自定义对象
在ibatis.net中,查询后的结果会自动将每一个字段映射成domain中的一个属性值,这个映射的过程是通过typehandlerfactory类进行的,在程序初始化时注册了一些系统类和类型转换类之间的关系:
handler = new nullablebooleantypehandler();
this.register(typeof(bool?), handler);
handler = new nullablebytetypehandler();
this.register(typeof(byte?), handler);
handler = new nullablechartypehandler();
this.register(typeof(char?), handler);
handler = new nullabledatetimetypehandler();
this.register(typeof(datetime?), handler);
handler = new nullabledecimaltypehandler();
this.register(typeof(decimal?), handler);
handler = new nullabledoubletypehandler();
this.register(typeof(double?), handler);
handler = new nullableguidtypehandler();
this.register(typeof(guid?), handler);
handler = new nullableint16typehandler();
this.register(typeof(int16?), handler);
handler = new nullableint32typehandler();
this.register(typeof(int32?), handler);
handler = new nullableint64typehandler();
this.register(typeof(int64?), handler);
handler = new nullablesingletypehandler();
this.register(typeof(single?), handler);
handler = new nullableuint16typehandler();
this.register(typeof(uint16?), handler);
handler = new nullableuint32typehandler();
this.register(typeof(uint32?), handler);
handler = new nullableuint64typehandler();
this.register(typeof(uint64?), handler);
handler = new nullablesbytetypehandler();
this.register(typeof(sbyte?), handler);
handler = new nullabletimespantypehandler();
this.register(typeof(timespan?), handler);
那么如果想将数据库中的一个字段映射成我们自己的一个类,在这个类中进行一些个性化处理,应该怎么办呢?
本来我想仿照stringtypehandler类写一个自己的类型处理类,但是通过查看ibatis的源代码,就算写好了自己的
类型处理类,好像也找不到注册的接口(如果哪位兄弟找到了接口,望告知)
另一种方式是通过已经注册的customtypehandler类型,实行其中的itypehandlercallback接口来实现的,具体实现方式如下:
我这里实现的只是一个演示程序,演示将数据库中的account_lastname和account_email字段映射成自定义的property类型,同时把它们放入一个hashtable中。
1、自定义property类
namespace gspring.common
{
public class property
{
private string _datavalue;
public string datavalue
{
get { return _datavalue; }
set { _datavalue = value; }
}
private string _datatype;
public string datatype
{
get { return _datatype; }
set { _datatype = value; }
}
}
}2、实现itypehandlercallback接口的类
namespace gspring.common
{
public sealed class propertytypehandler : itypehandlercallback
{
public object valueof(string value)
{
property obj = new property();
obj.datavalue = value;
return obj;
}
public object getresult(iresultgetter getter)
{
property obj = new property();
if (getter.value != null && getter.value != system.dbnull.value)
{
obj.datavalue = (string)getter.value;
}
return obj;
}
public void setparameter(iparametersetter setter, object parameter)
{
setter.value = ((property)parameter).datavalue;
}
public object nullvalue
{
get { return null; }
}
}
}
主要是其中的getresult和setparameter方法,实现和数据库之间的存取操作。
3、修改对应的domain类,加入两个属性:
public hashtable ht = new hashtable();
property _emailaddress1 = new property();
public property emailaddress1
{
get
{
return _emailaddress1;
}
set
{
_emailaddress1.datatype = "string";
_emailaddress1.datavalue = value.datavalue;
ht["邮件"] = _emailaddress1;
}
}
property _lastname1 = new property();
public property lastname1
{
get
{
return _lastname1;
}
set
{
_lastname1.datatype = "string";
_lastname1.datavalue = value.datavalue;
ht["姓名"] = _lastname1;
}
}
4、修改配置文件:
<resultmap id="account-result" class="account" >
<result property="id" column="account_id"/>
<result property="firstname" column="account_firstname"/>
<result property="lastname1" column="account_lastname" typehandler="gspring.common.propertytypehandler"/>
<result property="emailaddress1" column="account_email" typehandler="gspring.common.propertytypehandler"/>
</resultmap>
主要是利用了其中的typehandler属性来指定一个类型转换器。
原文地址: http://www.cnblogs.com/firstyi/archive/2007/09/04/881446.html