typeHandler 是针对把数据库里面的某列的数据类型转换的应用程序中的数据类型,简单的说就是把 type=>dbType  反之把dbType=>type. 例如数据库某列的内容是longbolb类型的,实际存的就是byte[] 数组. 那我repository 通过select 以后要把longbolb 直接返回stream(流) 因为IBatis直接返回的是byte[] 那么我们就要把通过typeHandler 把byte[] 再转换成stream.

如下面例子(msyql)

表(t_temp)

列名   数据类型
_Id

char(36)

_Content

longblob

实体类

public class Temp {

    public Guid Id { get; set; }

    public Stream Content { get; set; }
}

这个时候就要把数据库的content字段转换成流.typehanlder 就上场了.转换很简单自己写一个类实现IBatis提供的接口ITypeHandlerCallback就可以了如下

public class StreamTypeHandler : ITypeHandlerCallback
{
public void SetParameter(IParameterSetter setter, object parameter)
{
if (parameter is Stream)
{
var s = (Stream) parameter;
var data = new byte[s.Length];
s.Read(data, , data.Length); setter.Value = data;
}
} public object GetResult(IResultGetter getter)
{
var bytes = getter.Value as byte[];
if (bytes != null)
{
var stream = new MemoryStream(bytes);
return stream;
} return null;
} public object ValueOf(string s)
{
return s;
} public object NullValue
{
get { return null; }
}
}

里面的get和set 就是把数据库返回的类型转换成想要的数据类型.

有了typehanler 就是在什么地方用的问题了.照API上的说的有两个地方可以放.

1,sqlmap.config 里面的

<typeHandlers>
<typeHandler type="System.IO.Stream" dbType="BLOB" callback="HS.Core.Utils.StreamTypeHandler, HS.Core" />
</typeHandlers>

在sqlmap.config里面配置以后在你要用的任意一个xxx.map.xml 文件里面都的parameterMap 或者 resultMap 标签就都可以使用了.例如

<resultMap id="temp_map" class="HS.Core.Temp,HS.Core">
<result property="id" type="guid" column="_Id"/>
<result property="Content" type="System.IO.Stream" column="_Content"/>
</resultMap>

2,在xxx.map.xml中使用 typehandler 指定.

<resultMap id="temp_map" class="HS.Core.Temp,HS.Core">
<result property="id" type="guid" column="_Id"/>
<result property="Content" typeHandler="HS.Core.Utils.StreamTypeHandler, HS.Core" column="_Content"/>
</resultMap>

之前,自己按照API的例子,做了一个Id的GUID的typeHandler.然后插入数据库.

 <alias>
<typeAlias alias="Guidchar" type="HS.Core.Utils.GuidVarcharTypeHandlerCallback,HS.Core"/>
</alias>
<parameterMaps>
<parameterMap id="terminal_pare" class="HS.Core.Terminal,HS.Core">
<parameter property="Id" column="_ID" typeHandler="Guidchar"/>
<parameter property="Name" column="_Name"/>
<parameter property="Key" column="_Key"/>
<parameter property="Ip" column="_IP"/>
<parameter property="Port" column="_Port"/>
<parameter property="AeTitle" column="_AeTitle"/>
<parameter property="Place" column="_Address"/>
<parameter property="Remark" column="_Remark"/>
<parameter property="UpdateTime" column="_UpdateTime"/>
<parameter property="State" column="_State"/>
</parameterMap>
</parameterMaps>

然后插入数据库

<insert id="InsertThermal" parameterMap="thermal_pare">
<selectKey property="Id" resultClass="guid" type="post">
<![CDATA[
select uuid() as value;
]]>
</selectKey>
<generate table="hs_printers"/>
</insert>

这里用了自动列,(selectKey)在运行时,死活说类型转换错误.

原来:selectKey 不能是 typehandler的....IBatis默认是支持guid类型的.所以自己是脱了裤子放屁....

iBATIS typeHandler selectKey的更多相关文章

  1. ibatis的selectkey

    在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作.       使用ibatis的sel ...

  2. ibatis实战之插入数据(自动生成主键)

    ibatis实战之插入数据(自动生成主键) --------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert&g ...

  3. Mybatis中的@SelectKey注解

    一.创建Maven项目 在pom.xml中,添加mybatis依赖,mysql-jdbc依赖,把编译版本改为1.8 你问,为啥mybatis不会自动依赖mysql-jdbc,需要手动写明?答:因为my ...

  4. 使用mybatis-generator生成代码

    文档地址: ​http://mbg.cndocs.tk/index.html ​ 以下是一个简单的配置内容. 一.在maven配置文件中添加mybatis-generator插件 1 2 3 4 5 ...

  5. 【转】Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码

    Intellij IDEA 14 作为Java IDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中 ...

  6. idea使用generator自动生成model、mapper、mapper.xml(转)

    原文链接:http://www.mamicode.com/info-detail-445217.html TEP 0.在Intellij IDEA创建maven项目(本过程比较简单,略) STEP 1 ...

  7. IDEA 中使用MyBatis-generator 自动生成MyBatis代码

    0.在Intellij IDEA创建maven项目 1. 在maven项目的pom.xml 添加mybatis-generator-maven-plugin 插件 <build> < ...

  8. MyBatis学习总结(四)——MyBatis缓存与代码生成

    一.MyBatis缓存 缓存可以提高系统性能,可以加快访问速度,减轻服务器压力,带来更好的用户体验.缓存用空间换时间,好的缓存是缓存命中率高的且数据量小的.缓存是一种非常重要的技术. 1.0.再次封装 ...

  9. idea 使用 mybaits generator

    Intellij IDEA 14 作为JavaIDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中会 ...

随机推荐

  1. 不安全代码只会在使用 /unsafe 编译的情况下出现

    在你的项目属性页面里面,把是否包含unsafe代码的选项选上

  2. hadoop HA学习

    一 HDFS HA架构图 二 HDFS HA组件 Active NameNode和Standby NameNode 在NameNode的HA方案中有两个不同状态的NameNode,分别为活跃态(Act ...

  3. lr介绍

    ---恢复内容开始--- loadrunner是通过agent进程来监控各种协议的客户端和服务端的通信: init和end不能进行迭代,action才能迭代(参数化才有作用) init(比如说有50个 ...

  4. mysql的报错

    这个错误是因为mysql的进程错误关闭导致的,我们需要把/var/lib/mysql/mysql.sock文件删除或者改名,之后再重启就ok

  5. 后端程序员必会常用Linux命令总结

    1. 调整终端窗口大小: ctrl + '-'  缩小, ctrl + shift + '='  放大. 2. command --help 查询命令详细 或者 man command 3.ls命令, ...

  6. C# [Win32] [GDI+] [API] Load HFONT from Memory

    // gdiplusenums.h //-------------------------------------------------------------------------- // Fo ...

  7. python机器可读数据-XML

    XML XML是一门标记语言.也就是说,它具有包含格式化数据的文档结构. XML文档本质上只是格式特殊的数据文件. 在XML文件中有两个位置可以保存数据值:2个标签之间,标签的属性. 导入XML数据 ...

  8. 第一周嵌入式程序设计(linux环境下)的学习总结

    2014025641 <嵌入式程序设计>第1周学习总结 本周学习内容 首先我们先复习下之前学习过的内容,什么是linux? Linux 就是一个操作系统,就像你多少已经了解的 Window ...

  9. Possibly two send backs are happening for the same request

    错误 wso2 WARN {org.apache.synapse.transport.passthru.SourceHandler} -  Illegal incoming connection st ...

  10. python模块和包(模块、包、发布模块)

    模块和包 目标 模块 包 发布模块 01. 模块 1.1 模块的概念 模块是 Python 程序架构的一个核心概念 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块 模块名 同样也 ...