- 浏览: 15832 次
- 性别:
- 来自: 南京
文章分类
最新评论
上一篇主要将了Spring JDBC的基本操作CURD,涉及到的类型也是基础类型,int,varchar,time,timestamp之类的简单类型,这一篇中主要说明在Spring中如何处理CLOB,BLOB类型数据。
1.操作BLOB/CLOB数据
BLOB被称作二进制对象,CLOB被称作大文本对象。他们在不同的数据库中可能名字也不相同,比如:在Sql Server中就是IMAGE/TEXT,在Mysql中就是BLOB/LONGTEXT,处理方式也不完全相同,在Mysql中LONGTEXT处理方式和VARCHAR是相同的。BLOB可能以块方式处理,也可以以流方式处理。
首先需要配置LobHandler,这个类可以专业的处理BLOB/CLOB
注意,如果使用的是Oracle 9i需要特殊处理,配置NativeJdbcExtrator,并且需要将Extrator加入到JdbcTemplate和LobHandler的对象属性中
下面我们来看下LOB的处理,
需要使用AbstractLobCreatingPreparedStatementCallback类来代替普通的Callback类,还需要向它的构造函数中传入lobHander。
以块数据的方式处理LOB数据
以byte[]的方式来处理
以流的方式来处理LOB对象
如果LOB对象很大,比如100M,如果采用块的方式来处理,将会消耗很大的内存,所以采用流的方式来处理比较好。
2.自增键和行集
自增键有两种方式,一种是Oracle基于序列的方式,一种是基于表的方式,这里仅描述针对表的方式。自增键的基类是DataFieldMaxValueIncrementer,有兴趣可以自己看下。
在DAO类中,注入以上Bean,就可以使用incre.nextIntValue()获取主键了。
行集SqlRowSet的内容不是很清楚,这里暂时跳过。
3.其他类型的JdbcTemplate
主要是NamedParameterJdbcTemplate,下面看下实例。
1.操作BLOB/CLOB数据
BLOB被称作二进制对象,CLOB被称作大文本对象。他们在不同的数据库中可能名字也不相同,比如:在Sql Server中就是IMAGE/TEXT,在Mysql中就是BLOB/LONGTEXT,处理方式也不完全相同,在Mysql中LONGTEXT处理方式和VARCHAR是相同的。BLOB可能以块方式处理,也可以以流方式处理。
首先需要配置LobHandler,这个类可以专业的处理BLOB/CLOB
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"/>
注意,如果使用的是Oracle 9i需要特殊处理,配置NativeJdbcExtrator,并且需要将Extrator加入到JdbcTemplate和LobHandler的对象属性中
下面我们来看下LOB的处理,
@Repository public class PostDao { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private LobHandler lobHandler; public void addPost(final Post post) { String sql = "INSERT INTO t_post(user_id,post_text,post_attach) VALUES(?,?,?)"; jdbcTemplate.execute(sql, new AbstractLobCreatingPreparedStatementCallback(this.lobHandler) { @Override protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException, DataAccessException { ps.setInt(1, post.getUserId()); lobCreator.setClobAsString(ps, 2, post.getPostText()); lobCreator.setBlobAsBytes(ps, 3, post.getPostAttach()); } }); } }
需要使用AbstractLobCreatingPreparedStatementCallback类来代替普通的Callback类,还需要向它的构造函数中传入lobHander。
以块数据的方式处理LOB数据
以byte[]的方式来处理
public List<Post> getAttaches(final int userId) { String sql = "SELECT post_id,post_attach,post_text FROM t_post WHERE user_id=? and post_attach IS NOT NULL"; return jdbcTemplate.query(sql, new Object[] { userId }, new RowMapper<Post>(){ public Post mapRow(ResultSet rs, int rowNum) throws SQLException { int postId = rs.getInt("post_id"); byte[] attach = lobHandler.getBlobAsBytes(rs, "post_attach"); String text = lobHandler.getClobAsString(rs, "post_text"); Post post = new Post(); post.setPostId(postId); post.setUserId(userId); post.setPostAttach(attach); post.setPostText(text); return post; } }); }
以流的方式来处理LOB对象
如果LOB对象很大,比如100M,如果采用块的方式来处理,将会消耗很大的内存,所以采用流的方式来处理比较好。
public void getAttach(final int postId, final OutputStream os) { String sql = "SELECT post_attach FROM t_post WHERE post_id=?"; jdbcTemplate.query(sql, new Object[] { postId }, new AbstractLobStreamingResultSetExtractor<Post>() { @Override protected void streamData(ResultSet rs) throws SQLException, IOException, DataAccessException { InputStream is = lobHandler.getBlobAsBinaryStream(rs, 1); if(is != null) FileCopyUtils.copy(is, os); } }); }
2.自增键和行集
自增键有两种方式,一种是Oracle基于序列的方式,一种是基于表的方式,这里仅描述针对表的方式。自增键的基类是DataFieldMaxValueIncrementer,有兴趣可以自己看下。
<bean id="incre" class="org.springframework.jdbc.support.incrementer.DerbyMaxValueIncrementer" p:incrementerName="t_post_id" p:columnName="sequence_id" p:cacheSize="10" p:dataSource-ref="basicDataSource"/>
在DAO类中,注入以上Bean,就可以使用incre.nextIntValue()获取主键了。
行集SqlRowSet的内容不是很清楚,这里暂时跳过。
3.其他类型的JdbcTemplate
主要是NamedParameterJdbcTemplate,下面看下实例。
<bean id="namedParamJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate" p:dataSource-ref="basicDataSource"/>
@Repository public class PostDao { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; public void addPostByNamedParams(final Post post) { String sql = "INSERT INTO t_post(user_id,post_text) VALUES(:userId,:postText)"; SqlParameterSource sps = new BeanPropertySqlParameterSource(post); namedParameterJdbcTemplate.update(sql, sps); } public void addPostByMapSqlParams(final Post post) { String sql = "INSERT INTO t_post(user_id,post_text) VALUES(:userId,:postText)"; SqlParameterSource sps = new MapSqlParameterSource() .addValue(":userId", post.getUserId()) .addValue(":postText", post.getPostText()); namedParameterJdbcTemplate.update(sql, sps); } }
- maventest10.zip (33.9 KB)
- 下载次数: 0
发表评论
-
Spring基础:数据访问(3)
2017-01-15 09:29 400在开源世界里,有很多ORM框架使用,比如Hibernate,还 ... -
Spring基础:数据访问(1)
2016-12-27 08:22 335Spring JDBC通过模板和回调机制大大降低了使用JDBC ... -
Spring基础:AOP编程(5)
2016-11-30 07:35 338基于Schema的AOP编程 基于AspectJ的AOP编程已 ... -
Spring基础:AOP编程(4)
2016-11-27 12:17 371基于AspectJ的AOP编程 AspectJ的切点函数非常 ... -
Spring基础:AOP编程(3)
2016-11-19 10:44 349基于切面的AOP编程 通过Advice,可以创建方法前,后, ... -
Spring基础:AOP编程(2)
2016-11-15 23:40 362基于ProxyFactory的AOP编程 Spring只支持 ... -
Spring基础:AOP编程(1)
2016-11-14 01:08 379Java编程中的代理 Spring以IoC为基础,发展了另外 ... -
Spring基础:IoC容器(2)
2016-11-12 10:00 399容器注入类型 最常见的注入类型是字面值注入,像String和 ... -
Spring基础:IoC容器(1)
2016-11-10 08:15 359在IoC容器中装配Bean 4.1.2.RELEASE版本的 ... -
Spring基础:稍显复杂的Spring Hello World
2016-11-01 00:59 358本文参考《Spring 3.x企业应用开发》这本书完成,作为自 ... -
使用Eclipse创建基于Maven Web工程
2016-06-06 19:19 409第一步:创建一个maven-webapp类型的工程 完 ...
相关推荐
NULL 博文链接:https://foreversky12.iteye.com/blog/2345479
NULL 博文链接:https://foreversky12.iteye.com/blog/2353141
数据访问:介绍了Spring框架对数据库访问的支持,包括JDBC、ORM框架、事务管理等。 测试和调试:介绍了如何使用Spring进行单元测试和集成测试,以及调试技巧和工具的使用。 这本资源适合已经具备一定Spring基础知识...
* Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; * Spring ORM:对现有的ORM框架的支持; * Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; * Spring MVC:提供面向Web应用的Model-View-...
SingleJDBCBase 是基于Spring Framework基础上搭建的一个Java基础开发套件,以Spring MVC为模型视图控制器,JDBC为数据访问层。 * 核心框架:Spring Framework 4.2.7 * 安全框架: * 视图框架:Spring MVC 4.2.7 * ...
同时,Spring还提供了强大的事务管理、数据访问、Web开发等功能,帮助开发者快速构建出高效、稳定的应用程序。 除了核心功能外,Spring框架还具有良好的扩展性,可以与其他技术栈轻松集成。无论是与数据库、消息...
│ 开篇词 从零开始:为什么要学习 Spring Boot?.mp4 │ 01 家族生态:如何正确理解 ...│ 23 数据测试:如何使用 Spring 测试数据访问层组件?.mp4 │ 24 服务测试:如何使用 Spring 测试 Web 服务层组件?.mp4
SingleMyBatis 是基于Spring Framework基础上搭建的一个Java基础开发套件,以Spring MVC为模型视图控制器,MyBatis为数据访问层。 * 核心框架:Spring Framework 4.2.7 * 安全框架: * 视图框架:Spring MVC 4.2.7 *...
SingleHibernate 是基于Spring Framework基础上搭建的一个Java基础开发套件,以Spring MVC为模型视图控制器,Hibernate为数据访问层。 * 核心框架:Spring Framework 4.2.7 * 安全框架: * 视图框架:Spring MVC ...
Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和...
Spring Boot 技术栈学习分享,涵盖了基础知识、Web开发、数据访问-spring-boot-route
spring-jdbc.jar(必须) :这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。 外部依赖spring-beans,spring-dao。 spring-web.jar(必须) :这个jar 文件包含Web 应用开发时,用到Spring 框架时所需...
-熟悉Spring基础 -熟悉Maven使用 基于SpringBoot2.3与2.4版本讲解,适用于有Spring、SpringMVC基础,初学或想深入了解SpringBoot的学习者。 教程包含核心基础、Web原理、单元测试、数据访问、指标监控等章节。
Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。Spring Data 包含多个子项目:Commons - 提供...
虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的接口和实现。 由于模板Dao的实现,使得这些具体实体的Dao层已经变的非常“薄”,有一些具体实体的Dao实现可能完全就是...
Spring Data项目就是一种简化Java应用构建的数据访问技术,它可以帮助开发人员高效地使用最新的数据处理和管理工具,同时还能够以最新的方式使用传统的数据库。 《Spring Data实战》从Spring Data背景知识、关系型...
访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 视图解析器类型 基于协商的视图解析器 目录 本地化:基础原理 本地化:...
构建于Spring IoC容器组件模型之上的这些Spring3部件提供了集成、批处理、OSGi、Ajax和Flex集成、状态式的Web应用、REST风格Web服务、富客户端用户界面、Google AppEngine开发、基于云的部署、消息、数据访问、Web...
在此基础上,Spring还提供了包括声明式事务管理,RMI或Web Services远程访问业务逻辑,以及可以多种方法进行的持久化数据库地解决方案。另外,Spring还有一个全功能的 MVC框架,并能透明的把 AOP 集成到你的软件中去...