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. HTML中的置换元素和非置换元素

    我们都知道,行内元素不能够定义宽度和高度,但 img,input,button等标签作为行内元素却可以定义宽高,为什么呢?这就牵扯到了置换元素和非置换元素. 置换元素: w3c官方解释:“An ele ...

  2. php国家或者编码英文字母排序

    1.直接复制传入需要排序的字符,然后可以把返回的数据当key,传送给前台function getFirstCharter($str){ if(empty($str)){return '';} $fch ...

  3. linux上docker安装centos7.2

    1.安装 docker pull centos:7.2.1511 2.启动镜像 docker run -d -i -t <IMAGE ID> /bin/bash 3.进入容器 docker ...

  4. SQL-在Update中进行子查询和左联查询

    以下总结源自后边的三个参考思索和测试而来: 我们有一张行政区划表,为了查询速度的优化,我们需要在这张表中,将每个乡镇的记录中写入其所属的省.市.县, 表如下: 当然,我们可以使用游标或在存储过程中使用 ...

  5. 【转】Binlog 基本操作

    MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. 一般 ...

  6. crontab 每分钟、每小时、每天、每周、每月、每年执行

    每分钟执行 * * * * * 每小时执行 0 * * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 * * 每年执行 0 0 1 1 * 每小时的第3和第 ...

  7. linux常用命令 echo输出命令

    echo输出命令 'echo [选项] [输出内容]' 选项 '-e' 支持反斜线控制的字符转换 控制字符​ \a 输出警告音 \b 退格键,也就是向左删除键 \n 换行符 \r 回车键 \t 制表符 ...

  8. maven 项目提示找不到javax.servlet.xxx问题解决

    1.https://search.maven.org/search?q=g:javax.servlet%20AND%20a:javax.servlet-api&core=gav 2.下载3.1 ...

  9. Nginx实现404页面的几种方法

    一个网站项目,肯定是避免不了404页面的,通常使用Nginx作为Web服务器时,有以下集中配置方式,一起来看看. 第一种:Nginx自己的错误页面 Nginx访问一个静态的html 页面,当这个页面没 ...

  10. 关于Ubuntu使用笔记

    Ubuntu vm tools 安装 sudo apt install open-vm-tools-desktop 在安装程序时Ubuntu会将安装目录锁定,安装结束后会解除锁定,中断安装后无法再安装 ...