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的怀抱. 然而在使用的过程中会 ...
随机推荐
- Envoy 源码分析--network
目录 Envoy 源码分析--network address Instance DNS cidr socket Option Socket ListenSocket ConnectionSocket ...
- kafka producer batch 发送消息
1. 使用 KafkaProducer 发送消息,是按 batch 发送的,producer 首先把消息放入 ProducerBatch 中: org.apache.kafka.clients.pro ...
- Jsp的table导出Excel
var idTmr; function getExplorer() { var explorer = window.navigator.userAgent ; //ie if (explorer.in ...
- 解决flask的502错误:upstream prematurely closed connection while reading response header from upstream
我在使用 tiangolo/uwsgi-nginx-flask 部署flask应用的时候,经常运行一会儿就出现502错误,重新启动容器后,就恢复. 且经常会出现数据更新后,刷新结果不一致. docke ...
- Windows浏览器无法连接VM虚拟机Centos并打开nginx页面
装的是centos6.7minimal版本,搜了下,需要关闭防火墙 于是 yum install iptables 然后关闭防火墙 service iptables stop 再打开浏览器,成功进入页 ...
- Python 字典删除元素clear、pop、popitem
同其它python内建数据类型一样,字典dict也是有一些实用的操作方法.这里我们要说的是字典删除方法:clear().pop()和popitem(),这三种方法的作用不同,操作方法及返回值都不相同. ...
- ansible-play中关于标签tages,handler,notify的使用
--- - hosts: webser remote_user: root tasks: - name: install httpd package yum: name=httpd tages: in ...
- css书写规范以及如何写出赏心悦目的代码
css书写规范: 1. 编码统一为utf-8;2. 协作开发及分工: i根据各个模块, 同时根据页面相似程序, 事先写好大体框架文件,同时根据页面相似程序,事先写好大体框架文件.共用css文件base ...
- python-之-深浅拷贝一
深浅拷贝 一.数据为不可变类型 (str.int.bool) import copy v1 = "abc" v2 = copy.copy(v1) v3 = copy.deepcop ...
- python笔记25-sys模块
import sys#sys.argv命令行参数List,第一个元素是程序本身路径# sys.exit('xxxxx')#退出程序,正常退出时exit(0)# print(sys.version) # ...