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的怀抱. 然而在使用的过程中会 ...
随机推荐
- 小程序input组件获得焦点时placeholder内容有重影
这个问题是小程序input组件的bug,目前的解决办法可以,在input标签上加一个其他标签,显示placeholder内容,获得焦点时消失,失去焦点时候再让其显示 <view class='i ...
- YouTuboba视频搬运~哔哩哔哩
将YouTube上面的视频搬运到哔哩哔哩上面教程 1.首先选择YouTube上面一个视频,需要谷歌登录,然后保存这个视频播放链接. 2.在浏览器中输入这个网址:en.savefrom.net,点击En ...
- web页面锁屏初级尝试
因为工作需要,所以在网上找了一些素材来弄这个功能.在我找到的素材中,大多都是不完善的.虽然我的也不是很完善,但是怎么说呢.要求不是很高的话.可以直接拿来用的[需要引用jQuery].废话不多说直接上代 ...
- java多线程之堵塞的应用
线程在Running的过程中可能会遇到阻塞情况,上次的内容我们已经使用过sleep()的方法. 调用join()和sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到 ...
- Python cv2库(人脸检测)
根据访问图片识别 # coding:utf-8 import sysimport math import cv2 # 待检测的图片路径 imagepath = r'l.png' face_cascad ...
- scatter参数
列出scatter常用的一些参数: plt.scatter(x,y,c= '颜色可选',marker= '点的样式', cmap= '颜色变化',alpha=“透明度”, linewidths=“线宽 ...
- Java Integer常量池——IntegerCache内部类
个人理解,不喜勿喷,欢迎指正. 首先看下面这段代码,猜一下输出结果是什么 Integer a = 10; Integer b = 10; System.out.println(a == b); a = ...
- 浅谈redis的HyperLogLog与布隆过滤器
首先,HyperLogLog与布隆过滤器都是针对大数据统计存储应用场景下的知名算法. HyperLogLog是在大数据的情况下关于数据基数的空间复杂度优化实现,布隆过滤器是在大数据情况下关于检索一个元 ...
- 互粉的sql查询
建立表: CREATE TABLE `tb_sns_attention` ( `id` int(11) NOT NULL AUTO_INCREMENT, `to_uid` int(11) NOT NU ...
- 活代码LINQ——07
来源说明:https://blog.csdn.net/sha574810590/article/details/40738069 在LINQ中,数据源和查询结果实际上都是IEnumerable< ...