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

posted on 2009-01-19 20:07  arnold zhang  阅读(385)  评论(0编辑  收藏  举报