iBATIS typeHandler selectKey
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的更多相关文章
- ibatis的selectkey
在使用ibatis插入数据进数据库的时候,会用到一些sequence的数据,有些情况下,在插入完成之后还需要将sequence的值返回,然后才能进行下一步的操作. 使用ibatis的sel ...
- ibatis实战之插入数据(自动生成主键)
ibatis实战之插入数据(自动生成主键) --------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert&g ...
- Mybatis中的@SelectKey注解
一.创建Maven项目 在pom.xml中,添加mybatis依赖,mysql-jdbc依赖,把编译版本改为1.8 你问,为啥mybatis不会自动依赖mysql-jdbc,需要手动写明?答:因为my ...
- 使用mybatis-generator生成代码
文档地址: http://mbg.cndocs.tk/index.html 以下是一个简单的配置内容. 一.在maven配置文件中添加mybatis-generator插件 1 2 3 4 5 ...
- 【转】Intellij IDEA 14中使用MyBatis-generator 自动生成MyBatis代码
Intellij IDEA 14 作为Java IDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中 ...
- idea使用generator自动生成model、mapper、mapper.xml(转)
原文链接:http://www.mamicode.com/info-detail-445217.html TEP 0.在Intellij IDEA创建maven项目(本过程比较简单,略) STEP 1 ...
- IDEA 中使用MyBatis-generator 自动生成MyBatis代码
0.在Intellij IDEA创建maven项目 1. 在maven项目的pom.xml 添加mybatis-generator-maven-plugin 插件 <build> < ...
- MyBatis学习总结(四)——MyBatis缓存与代码生成
一.MyBatis缓存 缓存可以提高系统性能,可以加快访问速度,减轻服务器压力,带来更好的用户体验.缓存用空间换时间,好的缓存是缓存命中率高的且数据量小的.缓存是一种非常重要的技术. 1.0.再次封装 ...
- idea 使用 mybaits generator
Intellij IDEA 14 作为JavaIDE 神器,接触后发现,非常好用,对它爱不释手,打算离开eclipse和myeclipse,投入Intellij IDEA的怀抱. 然而在使用的过程中会 ...
随机推荐
- 客户端与服务器之间通信收不到信息——readLine()
写服务器端和客户端之间通信,结果一直读取不到信息,在https://blog.csdn.net/yiluxiangqian7715/article/details/50173573 上找到了原因:使用 ...
- [leecode]---11.container with most water
description: Input: [1,8,6,2,5,4,8,3,7]Output: 49 思路1: 从(1,a1)开始向后算面积,需要两层n循环,时间复杂度n2 思路2: 找出数组中最大的数 ...
- Linux Mysql创建用户并分配权限
1.查看全部的用户: select user,host from mysql.user\G; 2.新建用户: create user ‘用户名’@‘主机名’ identified by ‘用户密码 ...
- 低版本IDE 打开 高版本 IDE 代码时 unit
可以用单元别名 比如Vcl.Forms=Forms 来兼容.
- MAVEN项目环境搭建
一.Maven的环境配置 apache-maven-3.5.4 Maven下载地址:http://maven.apache.org/download.cgi 选择下载 直接解压无需安装()下面配置M ...
- git版本控制系统更新
版本控制系统: 一.概念: 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 二.版本控制系统分类 1.本地版本控制 ...
- 解决eclipse的自动换行问题。
安装方法:使用Eclipse 的自动升级功能,菜单栏选Help → install new Software 点解Add按钮,在“ Name ”中填入“ wordwrap ”,“ URL ”中填入“ ...
- C++ 之sizeof运算符
sizeof运算符用来计算某个对象在内存中占用的字节数. 此运算符的使用形式为:sizeof(类型名)或sizeof(表达式). 计算结果是这个类型或者这个表达式结果在内存中占的字节数.
- webStorm activeCode
https://blog.csdn.net/qq_33183172/article/details/81491183
- Tensorflow实战系列之四:
这个是第四篇,打算写一些语义分割的内容实战.