ibatis 循环list处理for循环保存数据

ibatis+struts2处理blob字段文件上传总结
公司用的是ibatis+struts2,所以就练习了ibatis+struts2框架下的文件上传功能,针对了两种方法进行练习,一种是用blob字段保存二进制图片流,另一种是在数据库中保存图片的路径,数据库用的是oracle。先说说将图片保存在数据库中的操作。其实ibatis处理blob字段不像网上说的那么复杂,也就和普通字段一样。
实体类中用到的就是& private
byte[] photo这个属性,其对应数据库中的blob字段。
insert操作。
1.jsp页面的代码
&form enctype="multipart/form-data"
action="${pageContext.request.contextPath}/xxx.action"
method="post"&
&input& type="file"
name="photo"&
2.在相应action类中添加如下属性
& private File photo;//得到上传的文件
String photoContentT//得到文件的类型
String photoFileN//得到文件的名称
并设置相应的set和get方法以便得到jsp页面中传入的图片的相应信息。
3.将读取到的photo文件转化为byte[]存放到数据库中(其中twb是实体类的一个引用)
&byte[] byte_photo =
FileCopyUtils.copyToByteArray(getPhoto());
&&&&&twb.setPhoto(byte_photo);
itnewsContentService.saveContent(twb);
这样就完成了blob字段的插入。
更新操作和插入类似就只是执行update语句,主要就是数据库数据的回显。
jsp页面中通过下面这句话调用相应的action把数据库的图片通过输出流显示出来。
src="news_showphoto.action?nnewsid=&s:property
value="#request.tnews.nnewsid"/&"&
下面是相应action的代码
TnewscontentWithBLOBs tcb = itnewsContentService
&&&&&.findByNewId(new
Long(getNnewsid()));
ServletOutputStream sout = ServletActionContext.getResponse()
&&&&&.getOutputStream();
&&&sout.write(tcb.getPhoto());
&&&sout.flush();
&&&sout.close();
接下去的删除操作就是delete一句话
现在是在数据库中存放路径的练习,这个就更简单了。
insert操作
1.jsp页面代码如上
2.在action中添加相应属性如上
3.将图片保存在本地并将路径保存在数据库代码如下
String path = "e:/ibatis/photo/hbx/images";
File file = new File(path);
if (!file.exists())
file.mkdirs();
&&&FileUtils.copyFile(getPhoto(),
new File(file, getPhotoFileName()));
&&&twb.setRealPath(path+"/"+getPhotoFileName());
&&&itnewsContentService.saveContent(twb);
修改操作和insert操作类似。
img中src的路径改成realpath字段中的内容。
删除就直接delete就可以了。
这些就是基本的上传操作,挺简单的
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。iBatis整理——Spring环境下批处理实现 - Snowolf的意境空间! - ITeye技术网站
博客分类:
最近做一个小项目,用到Spring+iBatis。突然遇到一个很久远,却很实在的问题:在Spring下怎么使用iBatis的批处理实现?
大概是太久没有写Dao了,这部分真的忘得太干净了。
从4个层面分析这部分实现:
iBatis的基本实现
基于事务的iBatis的基本实现
基于事务的Spring+iBatis实现
基于回调方式的Spring+iBatis实现
1.iBatis的基本实现
iBatis通过SqlMapClient提供了一组方法用于批处理实现:
startBatch() 开始批处理
executeBatch() 执行批处理
代码如下:
public void create(List&Reply& replyList) {
// 开始批处理
sqlMapClient.startBatch();
for (Reply reply: replyList) {
// 插入操作
sqlMapClient.insert("Reply.create", reply);
// 执行批处理
sqlMapClient.executeBatch();
} catch (Exception e) {
e.printStackTrace();
这是基于iBatis的最基本实现,如果你一步一步debug,你会发现:其实,数据库已经执行了插入操作!
因此,除了这两个核心方法外,你还需要开启事务支持。否则,上述代码只不过是个空架子!
2.基于事务的iBatis的基本实现
事务处理:
startTransaction() 开始事务
commitTransaction() 提交事务
endTransaction() 结束事务
我们以insert操作为例,把它们结合到一起:
public void create(List&Reply& replyList) {
// 开始事务
sqlMapClient.startTransaction();
// 开始批处理
sqlMapClient.startBatch();
for (Reply reply: replyList) {
// 插入操作
sqlMapClient.insert("Reply.create", reply);
// 执行批处理
sqlMapClient.executeBatch();
// 提交事务
mitTransaction();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 结束事务
sqlMapClient.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
replyList是一个List,要把这个List插入到数据库,就需要经过这三个步骤:
开始批处理 startBatch()
插入&&&&& insert()
执行批处理 executeBatch()
如果要在Spring+iBatis中进行批处理实现,需要注意使用同一个sqlMapClient!同时,将提交事务的工作交给Spring统一处理!
3.基于事务的Spring+iBatis实现
public void create(List&Reply& replyList) {
if (!CollectionUtils.isEmpty(replyList)) {
// 注意使用同一个SqlMapClient会话
SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();
// 开始事务
sqlMapClient.startTransaction();
// 开始批处理
sqlMapClient.startBatch();
for (Reply reply : replyList) {
// 插入操作
sqlMapClient.insert("Reply.create", reply);
// 执行批处理
sqlMapClient.executeBatch();
// 提交事务 交给Spring统一控制
// mitTransaction();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 结束事务
sqlMapClient.endTransaction();
} catch (SQLException e) {
e.printStackTrace();
注意使用同一个sqlMapClient:
SqlMapClient sqlMapClient = sqlMapClientTemplate.getSqlMapClient();
如果直接sqlMapClientTemplate执行insert()方法,将会造成异常!
想想,还有什么问题?其实问题很明显,虽然解决了批处理实现的问题,却造成了事务代码入侵的新问题。 这么做,有点恶心!
除此之外,异常的处理也很恶心,不能够简单的包装为 DataAccessException 就无法被Spring当作统一的数据库操作异常做处理。
4.基于回调方式的Spring+iBatis实现
如果观察过Spring的源代码,你一定知道,Spring为了保持事务统一控制,在实现ORM框架时通常都采用了回调模式,从而避免了事务代码入侵的可能!
修改后的代码如下:
@SuppressWarnings("unchecked")
public void create(final List&Reply& replyList) {
// 执行回调
sqlMapClientTemplate.execute(new SqlMapClientCallback() {
// 实现回调接口
public Object doInSqlMapClient(SqlMapExecutor executor)
throws SQLException {
// 开始批处理
executor.startBatch();
for (Reply reply : replyList) {
// 插入操作
executor.insert("Reply.create", reply);
// 执行批处理
executor.executeBatch();
注意,待遍历的参数replyList需要加入final标识!即,待遍历对象不能修改!
引用public void create(final List&Reply& replyList)
这样做,就将事务处理的控制权完全交给了Spring!
SqlMapClientCallback 回调接口
doInSqlMapClient(SqlMapExecutor executor) 回调实现方法
DataAccessException 最终可能抛出的异常
通过上述修改,最终能够解决第三种实现方式中的种种不足!
Spring对iBatis提供的支持还是不够完善,即便是现在最新的Spring3.0.4。最开始,本打算用Spring3.0+iBatis3.0,结果Spring报错,说找不到“com.ibatis.xxxxx”完全是iBatis2.x的包路径!汗颜~ 还是Hibernate比较得宠!
做个小记录,呵呵!
浏览 12163
sunjichao 写道Copperfield 写道哥们,咨询个问题:第四种我试了一下, 在执行executor.executeBatch();时,一旦遇到异常,数据没有批量回滚,10条数据有2条异常,则正常插入8条数据,这个很是不解。。。 遇到同样的问题,求解释。有没有配置事务层?这段代码很久了,我都是在service用配置事务。如果没有事务控制,不会回滚!贴一下代码,看看是如果操作的
Copperfield 写道哥们,咨询个问题:第四种我试了一下, 在执行executor.executeBatch();时,一旦遇到异常,数据没有批量回滚,10条数据有2条异常,则正常插入8条数据,这个很是不解。。。 遇到同样的问题,求解释。有没有配置事务层?这段代码很久了,我都是在service用配置事务。如果没有事务控制,不会回滚!
哥们,咨询个问题:
第四种我试了一下, 在执行executor.executeBatch();时,一旦遇到异常,数据没有批量回滚,10条数据有2条异常,则正常插入8条数据,这个很是不解。。。
遇到同样的问题,求解释。
我就是有的第三种来处理的& 第四种方法没太看明白。代码入侵的问题,如果用回调方式,你不需要考虑捕获异常。
LZ是指第三种方式时直接使用SqlMapClientTemplate报错么?不好意思理解有误,第三种还没有试过,有时间也试一下 主要不是异常问题的考虑,主要是考虑事务统一处理!
。。。。。。。SPRING,自动拦截事务就可以了。无需回调这么麻烦。真正的事务处理仍然在spring中的aop控制之中,当然是通过声明式事务自动拦截!你可能没明白我的意思,或者说我没听明白你的涵义!起初,我也只是调用批处理,心想只要我做了声明式事务,就能够做到事务控制,但却发现:不加事务代码,SqlMapClient 不会执行批处理,反而是简单的单条数据插入!所以,开始加事务代码,发现很繁琐,又要手动控制事务,又要破获异常,仔细看Spring源码,才恍然大悟——spring中所有的ORM实现都是用了回调方式,目的就是要兼容事务控制,包括我所需要的批处理!PS:如果你有更好的办法,麻烦给点提示,我再测试测试!
浏览: 2006022 次
来自: 北京
xiaomizhg 写道公匙能够解密私匙加密的内容么 ? 这样 ...
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
正要找得解决方案,给力,
3.1版本,俩个超时时间已经移到params里面了client ...
公匙能够解密私匙加密的内容么 ? 这样不合理啊, 所有人都有公 ...ibatis处理日期_百度知道
ibatis处理日期
大伙儿都用什么办法解决这样的问题~C#里面日期类型DateTime不能为空而且默认最小值比sqlserver2000的要小!求指教~,如果想给数据库里面的日期字段赋空值该怎么弄呢~!用Nullable&lt,又不知道可行不,也不知道compareValue=“”这种写法可以不~;DateTime&的话ToString()方法好像又不能固定格式(“yyyy-MM-dd”)之类的~!我有个想法用ibatis 的isGreaterThan来判断
提问者采纳
isEqual&gt.这个很好控制啊 办法也很多比如 你ibatis插入的时候 用&lt.
提问者评价
恩~!非常感谢~!ibatis 的isequal之类的判断真心很好用啊~!
来自团队:
其他类似问题
为您推荐:
ibatis的相关知识
其他2条回答
插入的时候不插入该时间字段不就OK了1.想要空值.数据库字段默认可以为空2
但是插入数据的时候parameterClass用的是封装的一个类~!类里面有个属性是DateTime的~!天生不能为空~!还有个默认值是 吧貌似~!插入数据库就数据溢出~!这个只能用ibatis判断吧~!?貌似我现在用isGreaterThan 实现了~!大于就插入值~!否则就插入null~!
ibatis?数据库保存datatime和ibatis有什么关系?
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
ibatis 数据缓存
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口IBatisNet调用Oracle的存储过程,返回数据集
作者:chakman 日期:
写在前面:IBatisNet是在.NET下使用IBatis的开源项目,一般用了ORM映射,它的功能很强大,可以较好地实现对象与数据之间的映射,简单的说就是使用IBatisNet格式的映射文件,把该定的sql保存在配置中,调用时返回对象。IBatis是java项目中使用得很多,不过在.NET中使用得不是很多。下面介绍到调用Oracle存储过程返回数据集的信息。为什么.NET中IBatisNET使用得还不多,至少没有在Java平台那么流行,笔者窃以为是.NET或Windows平台下的东西实在太简单好用,太人性化,令开发员也变得傻瓜化,对于配置太多的东西,实在不好处理,也不知道怎处理。而Java平台上,连安装个IDE都配置都晕,那使用IBatis有什么难度呢?呵呵。配置性的东西肯定是功能灵活,不过所有问题都有对立面的,功能灵活但是很不直观。1, oracle的存储过程返回数据集是要使用Package的定义一个Package也不是一个简单的事,网上找一个例子,有时候也不容易。下面提供一个网址,介绍Package返回数据集实质上Package使用了Cursor来返回数据集。2, IBatisNET的配置下面是IBatisNet配置,Oracle的存储过程返回数据集。&?xml version="1.0" encoding="UTF-8"?&&sqlMap namespace="Mynamespace" xmlns="" xmlns:xsi=""&&&&!--重命名类--&&&&alias&&&&&&typeAlias alias="MyTestEntity" type="Mynamespace.MyTestEntity,Mynamespace" /&&&&/alias&&&&parameterMaps&&&&&&!--设置存储过程的输入输出--&&&&&&parameterMap id="GetMyProcParam" &&&&&&&&parameter property="param1" column="ID" dbType="Int32" type="int" direction="Input"/&&&&&&&&!--设置返回的数据,数据库类型为Cursor--&&&&&&&&parameter property="result" column="RETURNTABLE"&&dbType="Cursor"&&direction="Output"/&&&&&&/parameterMap&&&&/parameterMaps&&&&resultMaps&&&&&&!--返回的结果类--&&&&&&resultMap id="MyTestEntityMap" class="MyTestEntity" &&&&&&&&result property="TestId" column="TestId"&&/&&&&&&&&result property="TestName" column="TestName"&&/&&&&&&&&&&/resultMap&&&&/resultMaps&&&&statements&&&&&&!--设置存储过程--&&&&&&procedure id="GetMyProc" parameterMap="GetMyProcParam" resultMap="MyTestEntityMap"&&&&&&&GetMyProc&&&&&/procedure&&&&/statements&&/sqlMap&上面的配置是根据实际情况修改出来的,不排除有部分的错误,如果是人工写上面的文件,很容易会让人发狂的。这也是之前说的,很容易就出错了。
[本日志由 chakman 于
09:56 PM 更新]
上一篇: 下一篇:
| 查看次数: -
密 码: 游客发言不需要密码.
邮 箱: 邮件地址支持头像,邮箱地址不会公开.
网 址:= 0 && this.value.substring(0, 7) != 'http://'){this.value = 'http://' + this.value}" onblur="if (this.value.length >= 0 && this.value.substring(0, 7) != 'http://'){this.value = 'http://' + this.value}else{if (this.value == 'http://'){this.value = ''}}" /> 输入网址便于回访.
禁止表情转换
禁止自动转换链接
禁止自动转换关键字
虽然发表评论不用注册,但是为了保护您的发言权,建议您.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭

我要回帖

更多关于 ibatis批处理 的文章

 

随机推荐