`

Spring基础:数据访问(2)

 
阅读更多
上一篇主要将了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
<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);
    }
}
分享到:
评论

相关推荐

    Spring基础:数据访问(1)

    标题“Spring基础:数据访问(1)”涉及到的是Spring框架中关于数据访问的初步知识,这通常涵盖Spring如何管理和集成各种数据存储技术,如关系型数据库(例如MySQL、Oracle等)和NoSQL数据库(如MongoDB)。...

    Spring基础:数据访问(3)

    这篇博文“Spring基础:数据访问(3)”很可能是系列教程的一部分,主要探讨了Spring在数据访问层的一些关键概念和技术。由于具体的内容没有直接提供,我会基于常规的Spring数据访问实践来详细讲解这一主题。 首先,...

    使用Spring进行数据访问

    综上所述,Spring框架提供了丰富的数据访问工具和策略,无论是在传统的JDBC基础上,还是通过ORM或JPA,都能有效地进行数据库操作。理解和掌握这些知识点,将有助于提升你在开发中的效率和代码质量。

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) .pdf

    3. **数据访问抽象层**:Spring提供了对各种持久化技术的支持,如JDBC、Hibernate等,并提供了一套统一的数据访问异常层次结构。 4. **事务管理**:Spring提供了声明式事务管理功能,使得事务管理变得更加简单易用。...

    Spring技术内幕:深入解析Spring架构与设计原理[汇编].pdf

    * Bean:Spring中的Bean是指一个 Java对象,Bean可以是任何类型的对象,例如数据访问对象、业务逻辑对象等。 * 依赖关系:Spring中的依赖关系是指Bean之间的关系,依赖关系可以是单向的或双向的。 * Context:Spring...

    Spring5.2.6源码解析

    Spring Framework 是一个功能强大且...Spring DAO: 提供对数据访问的支持。 Spring ORM: 支持与 ORM 工具集成,如 Hibernate。 Spring Web: 提供基础 Web 应用支持。 Spring MVC: 提供 Model-View-Controller 实现。

    spring高手之路.docx

    Spring基础:学习Spring框架的核心概念,如IoC容器、Bean的生命周期、依赖注入等。 2. 深入学习Spring框架 Spring Boot:学习Spring Boot,它简化了Spring应用的初始搭建以及开发过程。 Spring MVC:掌握Spring MVC...

    spring2跨数据源访问

    标题“spring2跨数据源访问”涉及到的是Spring框架在处理多数据源情况下的技术要点,主要涵盖如何在Spring应用中实现对多个数据库的灵活访问。在这个主题中,我们通常会讨论以下几个关键知识点: 1. **多数据源配置...

    Spring数据访问策略

    《Spring数据访问策略详解》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。其中,数据访问策略是Spring的重要组成部分,它为开发者提供了多种处理数据存储和检索的方法。本文将深入探讨Spring...

    spring框架:spring-framework-4.3.9.RELEASE-dist

    Spring的核心特性包括:DI、AOP、数据访问/集成、Web框架、交易管理、模型-视图-控制器(MVC)等。 二、4.3.9.RELEASE版本亮点 1. **依赖注入**:Spring 4.3.9.RELEASE在DI方面进一步优化,支持构造器注入、setter...

    spring基础进阶技巧200篇.zip

    数据访问:介绍了Spring框架对数据库访问的支持,包括JDBC、ORM框架、事务管理等。 测试和调试:介绍了如何使用Spring进行单元测试和集成测试,以及调试技巧和工具的使用。 这本资源适合已经具备一定Spring基础知识...

    Spring面试专题.md

    * Spring DAO:对JDBC的抽象,简化了数据访问异常的处理; * Spring ORM:对现有的ORM框架的支持; * Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传; * Spring MVC:提供面向Web应用的Model-View-...

    spring基础jar包.zip

    3. **数据访问**:Spring提供了对各种数据访问技术的支持,如JDBC、ORM(Object-Relational Mapping)框架如Hibernate和MyBatis。`spring-jdbc.jar`是Spring对JDBC的抽象层,简化了数据库操作。`spring-orm.jar`则为...

    精通spring:教程

    通过阅读《Spring基础教程.pdf》,你可以了解到Spring框架的详细用法,包括基本配置、Bean的声明和管理、AOP的实现、数据访问等。而《99java.com.txt》可能是某个网站的链接或教程索引,可以作为进一步学习Spring和...

    Spring 基础jar包

    4. **数据访问**:Spring支持多种数据访问技术,如JDBC、Hibernate、MyBatis等。它提供了事务管理,使得在不同数据访问技术之间进行切换变得简单。 5. **MVC框架**:Spring MVC是Spring提供的用于构建Web应用程序的...

    SingleJDBCBase 基于Spring Framework基础上搭建的一个Java基础开发套件

    SingleJDBCBase 是基于Spring Framework基础上搭建的一个Java基础开发套件,以Spring MVC为模型视图控制器,JDBC为数据访问层。 * 核心框架:Spring Framework 4.2.7 * 安全框架: * 视图框架:Spring MVC 4.2.7 * ...

    Spring-Security安全权限管理手册

    - `org.springframework:spring-dao:jar:2.0.8:compile`:数据访问抽象层支持。 - `org.springframework:spring-web:jar:2.0.8:compile`:Web支持。 - `org.springframework:spring-beans:jar:2.0.8:compile`:...

    Spring数据访问对象框架入门

    Spring Data Access Object(DAO)框架是Spring生态体系中用于数据库交互的重要部分,它简化了数据访问层的实现,使得开发者可以更专注于业务逻辑,而不是底层数据库操作。本文将深入探讨Spring DAO框架的入门知识,...

Global site tag (gtag.js) - Google Analytics