- 浏览: 533181 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
rgqancy:
终于明白为啥XML里要带jdbcType=XXXX了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
rzh0001:
Thanks a lot
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
guji528:
学习了,谢谢
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
AKka:
彻底清楚这个错误的原因了。向楼主学习了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
远去的渡口:
武汉小吃,我最爱热干面和鸭脖,想念啊~~
过年时候还学习编程, ...
过年的心情
这几天仔细看了一下ibatis的文档,发现2.2后,ibatis的改变还是挺大的。对于自定义类型支持的也不错,这样对于blob和clob数据的处理也就简单多了。
不过在spring 中已经提供了很好的实现,所以这又省去了很多的功夫,接下来看看ibatis是如何支持clob和blob的。
ibatis提供了TypeHandler接口,用于处理数据类型,基本的实现类为BaseTypeHandler
在spring 中,提供了AbstractLobTypeHandler作为基础类,并且提供了相应的模版方法,所有的工作由LobHandler处理。
BlobByteArrayTypeHandler 主要用于处理blob类型数据,使用byte[]来映射相应的blob
ClobStringTypeHandler 用于处理clob类型数据,使用字符串来映射Clob
有一点需要注意的是,AbstractLobTypeHandler中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。
下面是一个简单的例子:
java 代码
public class Food {
private String content;
private String id;
private byte[] image;
private String name;
...
}
xml如下:说明一下,在resultMap中可以通过typeHandler来指定具体的handler.在inline变量中,可以通过handler来定义相应的typeHandler
xml 代码
<sqlMap namespace="Food">
<typeAlias alias="Food" type="org.esoft.hdb.bo.Food"/>
<resultMap id="foodResult" class="Food">
<result property="id" column="C_ID"/>
<result property="name" column="C_NAME"/>
<result property="content" column="C_content"
typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/>
<result property="image" column="C_image"
typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/>
</resultMap>
<sql id="foodFragment">select C_ID,C_NAME,C_CONTENT,C_IMAGE from T_FOOD</sql>
<select id="getAll" resultMap="foodResult">
<include refid="foodFragment"/>
</select>
<select id="selectById" parameterClass="string" resultMap="foodResult">
<include refid="foodFragment"/> where C_ID=#id#</select>
<insert id="insert" parameterClass="Food"> insert into T_FOOD ( C_ID,
C_NAME,C_CONTENT, C_IMAGE) values ( #id#,
#name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,
#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)
</insert>
<update id="update" parameterClass="Food"> update T_FOOD set C_NAME = #name#,
C_CONTENT =
#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,
C_IMAGE =
#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#
where C_ID = #id# </update>
<delete id="deleteById" parameterClass="string"> delete from T_FOOD where C_ID = #id#
</delete>
</sqlMap>
java 代码
public interface FoodService {
void save(Food food);
Food get(String id);
/**
* @param food
*/
void update(Food food);
}
public class FoodServiceImpl implements FoodService {
private FoodDAO foodDAO;
private DaoCreator creator;
public void setCreator(DaoCreator creator) {
this.creator = creator;
}
protected FoodDAO getFoodDAO() {
if (foodDAO == null) {
foodDAO = (FoodDAO) creator.createDao(FoodDAO.class, Food.class);
}
return foodDAO;
}
public Food get(String id) {
return getFoodDAO().get(id);
}
public void save(Food food) {
getFoodDAO().save(food);
}
public void update(Food food) {
getFoodDAO().update(food);
}
}
spring xml 配置:
xml 代码
。。。
<bean id="lobHandler"
class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>SqlMapConfig.xml</value>
</property>
<property name="lobHandler" ref="lobHandler"/>
</bean>
<bean id="daoCreate" class="org.esoft.hdb.ibatis.IbatisDaoCreator">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="foodService" class="org.esoft.hdb.service.FoodServiceImpl">
<property name="creator" ref="daoCreate"/>
</bean>
<aop:config>
<aop:pointcut id="foodServiceMethods"
expression="execution(* org.esoft.hdb.service.FoodService.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="foodServiceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
简单的测试:
java 代码
save :
Food food = new Food();
food.setPk("1");
food.setName("food1");
BufferedInputStream in = new BufferedInputStream(getClass()
.getResourceAsStream("/1.gif"));
byte[] b = FileCopyUtils.copyToByteArray(in);
food.setImage(b);
in = new BufferedInputStream(getClass().getResourceAsStream(
"/hibernate.cfg.xml"));
b = FileCopyUtils.copyToByteArray(in);
food.setContent(new String(b));
foodService.save(food);
update:
Food food = foodService.get("1");
BufferedInputStream in = new BufferedInputStream(getClass()
.getResourceAsStream("/jdbc.properties"));
byte[] b = FileCopyUtils.copyToByteArray(in);
food.setContent(new String(b));
foodService.update(food);
food = foodService.get("1");
assertNotNull(food.getImage());
不过在spring 中已经提供了很好的实现,所以这又省去了很多的功夫,接下来看看ibatis是如何支持clob和blob的。
ibatis提供了TypeHandler接口,用于处理数据类型,基本的实现类为BaseTypeHandler
在spring 中,提供了AbstractLobTypeHandler作为基础类,并且提供了相应的模版方法,所有的工作由LobHandler处理。
BlobByteArrayTypeHandler 主要用于处理blob类型数据,使用byte[]来映射相应的blob
ClobStringTypeHandler 用于处理clob类型数据,使用字符串来映射Clob
有一点需要注意的是,AbstractLobTypeHandler中实现了事务支持,需要用来释放相应的资源,所以一定需要在事务环境中进行。
下面是一个简单的例子:
java 代码
public class Food {
private String content;
private String id;
private byte[] image;
private String name;
...
}
xml如下:说明一下,在resultMap中可以通过typeHandler来指定具体的handler.在inline变量中,可以通过handler来定义相应的typeHandler
xml 代码
<sqlMap namespace="Food">
<typeAlias alias="Food" type="org.esoft.hdb.bo.Food"/>
<resultMap id="foodResult" class="Food">
<result property="id" column="C_ID"/>
<result property="name" column="C_NAME"/>
<result property="content" column="C_content"
typeHandler="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/>
<result property="image" column="C_image"
typeHandler="org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler"/>
</resultMap>
<sql id="foodFragment">select C_ID,C_NAME,C_CONTENT,C_IMAGE from T_FOOD</sql>
<select id="getAll" resultMap="foodResult">
<include refid="foodFragment"/>
</select>
<select id="selectById" parameterClass="string" resultMap="foodResult">
<include refid="foodFragment"/> where C_ID=#id#</select>
<insert id="insert" parameterClass="Food"> insert into T_FOOD ( C_ID,
C_NAME,C_CONTENT, C_IMAGE) values ( #id#,
#name#,#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,
#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#)
</insert>
<update id="update" parameterClass="Food"> update T_FOOD set C_NAME = #name#,
C_CONTENT =
#content,handler=org.springframework.orm.ibatis.support.ClobStringTypeHandler#,
C_IMAGE =
#image,handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler#
where C_ID = #id# </update>
<delete id="deleteById" parameterClass="string"> delete from T_FOOD where C_ID = #id#
</delete>
</sqlMap>
java 代码
public interface FoodService {
void save(Food food);
Food get(String id);
/**
* @param food
*/
void update(Food food);
}
public class FoodServiceImpl implements FoodService {
private FoodDAO foodDAO;
private DaoCreator creator;
public void setCreator(DaoCreator creator) {
this.creator = creator;
}
protected FoodDAO getFoodDAO() {
if (foodDAO == null) {
foodDAO = (FoodDAO) creator.createDao(FoodDAO.class, Food.class);
}
return foodDAO;
}
public Food get(String id) {
return getFoodDAO().get(id);
}
public void save(Food food) {
getFoodDAO().save(food);
}
public void update(Food food) {
getFoodDAO().update(food);
}
}
spring xml 配置:
xml 代码
。。。
<bean id="lobHandler"
class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation">
<value>SqlMapConfig.xml</value>
</property>
<property name="lobHandler" ref="lobHandler"/>
</bean>
<bean id="daoCreate" class="org.esoft.hdb.ibatis.IbatisDaoCreator">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="foodService" class="org.esoft.hdb.service.FoodServiceImpl">
<property name="creator" ref="daoCreate"/>
</bean>
<aop:config>
<aop:pointcut id="foodServiceMethods"
expression="execution(* org.esoft.hdb.service.FoodService.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="foodServiceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
简单的测试:
java 代码
save :
Food food = new Food();
food.setPk("1");
food.setName("food1");
BufferedInputStream in = new BufferedInputStream(getClass()
.getResourceAsStream("/1.gif"));
byte[] b = FileCopyUtils.copyToByteArray(in);
food.setImage(b);
in = new BufferedInputStream(getClass().getResourceAsStream(
"/hibernate.cfg.xml"));
b = FileCopyUtils.copyToByteArray(in);
food.setContent(new String(b));
foodService.save(food);
update:
Food food = foodService.get("1");
BufferedInputStream in = new BufferedInputStream(getClass()
.getResourceAsStream("/jdbc.properties"));
byte[] b = FileCopyUtils.copyToByteArray(in);
food.setContent(new String(b));
foodService.update(food);
food = foodService.get("1");
assertNotNull(food.getImage());
发表评论
-
四位计算机的原理及其实现
2015-09-05 19:23 939你是否想过,计算机为什么会加减乘除?或者更直接一点,计算机的原 ... -
ubuntu13.04安装mysql5.6RPM包1、使用的安装包MySQL-5.6.12-2.l
2014-11-20 23:08 1031ubuntu13.04安装mysql5.6 RPM包 1、 ... -
字典树相关代码
2014-08-10 18:21 1011package com.myway.study; i ... -
两有序数组求交集
2014-05-01 00:27 1077package com.myway.study; i ... -
JVM垃圾收集器异同
2014-04-22 09:48 1267VM 垃圾收集器有3类,这里主要介绍我们常用的 并行和并发收集 ... -
idea 11 如何实现热部署
2014-02-17 13:37 1043idea 如何配置 热部署呢? 如图: 然后配置 t ... -
java位操作符总结
2013-08-04 20:42 936二进制负数以它正值的 ... -
快速排序简要算法
2013-07-21 22:21 1112package math; import jav ... -
memcached安装
2013-03-10 09:32 4861今天 ,心血来潮 想安装下memcached 先给自己测试一下 ... -
温习温习 aop的原理
2013-02-11 22:23 1443在我工作这几年里,spring aop 用得最多的有两点 1 ... -
URL编码以及GET和POST提交乱码解决方案
2012-09-14 16:59 16951. 什么是URL编码。 ... -
Struts2 IF 判断 SESSION值
2012-08-16 15:12 1210<s:if test="ticke ... -
@me 如何处理
2012-07-28 22:37 1168红薯 分享了这个代码 ,我觉得很好 在这个社区与大家分享 。 ... -
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
2012-07-27 22:59 161786前天遇到一个问题 异常显示如下: 引用 Exception i ... -
猜测 javaye的分页设计
2012-07-05 21:32 1144非常喜欢javaeye的分页 ,自己也写了一个 按照逻辑测试了 ... -
java控制事务级别
2012-06-18 20:40 1170JDBC事务并发产生的问题和事务隔离级别 原子操作使用事务,一 ... -
ibatis / mybatis 存储过程调用 区别 以及例子
2012-06-11 21:16 1589ibatis: 如下: xml配置文件: 请看 ... -
java timerTask timer分析
2012-06-07 20:37 1570首先看一看 timer timerTask如何调用 ? ... -
MapWrapper 学习
2012-01-04 16:25 1580MetaObject 有一个 setValue方法 这个方 ... -
mybatis 学习
2011-12-24 22:59 2450这篇博客是我学习mybatis的心得。也是对自己的鞭策。 这些 ...
相关推荐
本文将深入探讨如何判断一个BLOB字段是否为空,这是一个在数据库操作中极为实用且关键的技术点。 ### BLOB字段简介 BLOB类型用于存储大量的二进制数据。不同于传统的字符型数据,BLOB可以存储诸如图片、音频文件或...
delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段delphi读写BLOB字段...
BLOB字段主要用于存储大量的二进制数据,如图像、音频、视频或任何其他非文本格式的数据。Java对Oracle数据库中BLOB字段的处理涉及多个层面,包括读取、写入、更新以及跨数据库操作等。 ### Java处理Oracle BLOB...
oracle中对blob字段的处理方法,包括增加,删除,修改,更新等操作。
写入Blob字段时,先创建`OracleParameter`对象,将其Direction设置为` ParameterDirection.Input `,OracleDbType设置为`OracleDbType.Blob`,然后赋值。以下是一个示例: ```csharp // 读取Blob字段 using ...
批量导出Oracle数据库中的BLOB字段生成图片,是一项常见的需求,尤其对于那些需要将数据库中的图片资源导出到本地文件系统的情况。下面将详细介绍这一过程及其相关知识点。 首先,我们需要理解BLOB类型。BLOB...
本篇文章将详细介绍如何通过SQL查询语句获取存储在Blob字段中的JPEG格式照片的像素大小。 ### 1. 了解Blob数据类型 在Oracle数据库中,Blob(Binary Large Object)类型用于存储大容量的二进制数据,比如图像、音频...
### Oracle Blob字段上传与下载详解 #### 一、概述 在数据库系统中,二进制大对象(Binary Large Object,简称BLOB)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。Oracle数据库支持Blob...
### Oracle中BLOB字段的读取与操作 #### 一、引言 在数据库系统中,BLOB(Binary Large Object)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。在Oracle数据库中,BLOB类型特别适用于处理...
1. **数据准备**:确保ORACLE数据库中的BLOB字段包含所需的数据,并且是完整的。可能需要进行数据验证,以确保所有数据都能被正确读取。 2. **数据导出**:使用ORACLE提供的工具,如SQL*Plus或者PL/SQL Developer,...
本篇文章将深入探讨如何在Delphi中对Oracle数据库的BLOB字段进行读写操作。 首先,你需要在Delphi项目中引入Oracle数据库访问的相关组件,如DBExpress或ADO。DBExpress是Delphi内置的一个轻量级数据库访问框架,而...
本教程将详细讲解如何批量导出Oracle数据库中的BLOB字段并生成文件,适用于需要定期或一次性处理大量图片或其他BLOB数据的场景。 首先,确保你已经在本地安装了Oracle客户端。Oracle客户端提供了SQL*Plus和其他工具...
kettle通过java代码将数据库blob 字段抽取到本地文件
### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...
"基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案" 本文介绍了一种基于JSP访问ORACLE数据库BLOB字段并显示图形的解决方案。该方案使用JSP技术读取ORACLE数据库中的BLOB字段存储的坐标点,然后将坐标传递到...
Python如何操作Oracle的Blob字段,
在这个特定的案例中,"Delphi将图片以二进制方式存储在数据库BLOB字段中"是一个常见的实践,用于高效、安全地保存图片数据。BLOB(Binary Large Object)字段是数据库系统中用来存储大量二进制数据的类型,非常适合...
spring+mybatis下BLOB字段的图片存取代码,仅整理了Controller层的代码,service和dao的代码很简单,所以没有整理
本教程将深入探讨如何使用Java进行Blob字段的操作,以实现将图片或文件保存到数据库中。 1. **Blob字段的理解** Blob是SQL标准定义的一种数据类型,它能够存储大量的二进制数据,如图像、音频文件、PDF文档等。在...
在本例中,我们假设已经有一个名为`images`的表,其中包含一个名为`image_data`的BLOB字段。使用`sqlite3_prepare_v2()`函数编译SQL语句,如下所示: ```cpp const char *sql = "INSERT INTO images (image_data) ...