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,如需转载请自行联系原作者


相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
6月前
|
开发框架 JSON .NET
ASP.NET Core 自定义配置警告信息
自定义配置警告信息需要在 startup 类中的 ConfigureService 方法中进行配置示例: // 注册 控制器服务 services.AddControllers(configure: setup => { setup.ReturnHttpNotAcceptable = true; ...
45 0
|
7月前
|
XML 存储 JSON
使用自定义XML配置文件在.NET桌面程序中保存设置
本文将详细介绍如何在.NET桌面程序中使用自定义的XML配置文件来保存和读取设置。除了XML之外,我们还将探讨其他常见的配置文件格式,如JSON、INI和YAML,以及它们的优缺点和相关的NuGet类库。最后,我们将重点介绍我们为何选择XML作为配置文件格式,并展示一个实用的示例。
96 0
|
4月前
|
XML API 数据库
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
|
5月前
|
Windows
基于.Net Core实现自定义皮肤WidForm窗口
基于.Net Core实现自定义皮肤WidForm窗口
49 0
|
7月前
|
存储
.NET Core - 自定义配置数据源:低成本实现定制化配置方案
.NET Core - 自定义配置数据源:低成本实现定制化配置方案
|
7月前
.NET Core-自定义配置数据源
前面,我们学习了配置框架的4种配置方式,那么你知道如何实现自定义的配置数据源吗?知道如何低成本实现定制化配置方案吗?下面我们就一起来学习一下吧。
|
10月前
|
C#
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
.NET Core反射获取带有自定义特性的类,通过依赖注入根据Attribute元数据信息调用对应的方法
122 0
|
开发框架 中间件 .NET
asp.net core 自定义中间件【以dapper为例】
asp.net core 自定义中间件【以dapper为例】
126 0
|
编解码 分布式计算 Java
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
基于 netty 封装的超简单通俗易用 服务端客户端交互框架 《net-framework》原理,源码和使用说明,开箱即用,只需要开发业务逻辑,完全自定义无限扩充 [结尾附github源码]
|
开发框架 JSON 前端开发
【C#】.net core2.1,自定义全局类对API接口和视图页面产生的异常统一处理
在开发一个网站项目时,异常处理和过滤功能是最基础的模块 本篇文章就来讲讲,如何自定义全局异常类来统一处理
207 0