`
lfwer
  • 浏览: 86453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring从3.1.0升级到4.2.7

 
阅读更多

项目有一个表由于业务猛增,需要分表,分表之后就必然用到动态查询表。

项目框架为spring+springMVC+hibernate,通过重写hibernate拦截器EmptyInterceptor可以实现动态表映射。因为spring-orm还用的是3.1.0,它的LocalSessionFactoryBean不支持entityInterceptor属性,因此需要升级spring版本到4.x,这次按照网上的方法升级到了4.2.7。

 

1 spring依赖

 

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jackson.version>2.5.1</jackson.version>
        <spring.version>4.2.7.RELEASE</spring.version>
        <spring-security.version>3.0.5.RELEASE</spring-security.version>
        <hibernate.version>4.3.8.Final</hibernate.version>
</properties>

 <dependencies>
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
  <!-- jackson json -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-jaxb-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>
</dependencies> 

 

项目里还用到了spring-security,本来想一起升级,但是改动太大,最后还是沿用了之前的版本,等以后有时间再研究一下。

注意:这里需要把jackson也升级。

 

2 修改springmvc.xml,使用MappingJackson2HttpMessageConverter代替MappingJacksonHttpMessageConverter,MappingJackson2JsonView代替MappingJacksonJsonView。

 

3 修改spring.xml,在LocalSessionFactoryBean中加入entityInterceptor属性。

 

 <!-- 配置sessionFactory -->
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy"/>
        </property>
        <property name="entityInterceptor">
            <bean class="com.eversec.base.base.BaseInterceptor"/>
        </property>
 <property name="packagesToScan" value="com.eversec"/><!-- 如果多个,用“,”分隔 -->
<property name="hibernateProperties">
            <props>
                <!-- 链接释放策略 on_close | after_transaction | after_statement | auto  -->
                <prop key="hibernate.connection.release_mode">after_transaction</prop>

                <prop key="current_session_context_class">
                    org.springframework.orm.hibernate4.SpringSessionContext
                </prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
                <prop key="hibernate.connection.release_mode">after_transaction</prop>
                <prop key="transaction.auto_close_session">false</prop>
                <prop key="connection.autocommit">false</prop>
            </props>
        </property>
    </bean>

 

 

4 下面就是重写的hibernate拦截器

 

package com.eversec.base.base;

import org.hibernate.EmptyInterceptor;

/**
 * 重写Hibernate拦截器
 * 实现动态替换表名和添加时忽略重复记录
 *
 * @author gb
 * @version 2015-01-13
 */
public class BaseInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = 1L;


    /**
     * 动态替换表名
     */
    public static final String REPLACE_TABLE_NAME = "replace_table_name";
    /**
     * insert时添加ignore
     */
    public static final String ADD_IGNORE = "add_ignore";
    /**
     * insert时添加ignore并动态替换表名
     */
    public static final String ADD_IGNORE_AND_REPLACE_TABLE_NAME = "add_ignore_replace_table_name";

    // 使用ThreadLocal存放日期,保证每个线程取到自己需要动态替换表命的日期
    private static ThreadLocal<String[]> thread = new ThreadLocal<String[]>();

    /**
     * 存放SQL替换内容
     *
     * @param contents [0]关键词,[1]被替换内容,[2]替换内容<br>
     *                 1)关键词replace_table_name,替换表名<br>
     *                 2)关键词add_ignore,insert into时添加ignore<br>
     *                 3)关键词add_ignore_replace_table_name,insert into时添加ignore并替换表名<br>
     */
    public static void replace(String... contents) {
        thread.set(contents);
    }

    /**
     * SQL替换内容
     * <p>
     * [0]关键词,[1]被替换内容,[2]替换内容<br>
     * 1)关键词replace_table_name,替换表名<br>
     * 2)关键词add_ignore,insert into时添加ignore<br>
     * 3)关键词add_ignore_replace_table_name,insert into时添加ignore并替换表名<br>
     * 4)替换内容为空时,不处理SQL并返回
     * </p>
     */
    public String onPrepareStatement(String sql) {
        String[] contents = thread.get();
        if (contents == null || contents.length < 1) {
            return sql;
        }

        if (contents[0].equals(REPLACE_TABLE_NAME)) {
            sql = replaceTableName(sql, contents[1], contents[2]);
        } else if (contents[0].equals(ADD_IGNORE)) {
            sql = addIgnore(sql);
        } else if (contents[0].equals(ADD_IGNORE_AND_REPLACE_TABLE_NAME)) {
            sql = addIgnoreAndReplaceTableName(sql, contents[1], contents[2]);
        }

        thread.remove();
        //System.out.println(sql);
        return sql;
    }

    // 动态替换表名
    private String replaceTableName(String sql, String oldContent,
                                    String replaceContent) {
        sql = sql.replaceAll(oldContent, replaceContent);
        return sql;
    }

    // insert忽略重复记录
    private String addIgnore(String sql) {
        sql = sql.replaceAll("insert into", "insert ignore into");
        return sql;
    }

    // insert忽略重复记录同时替换表名
    private String addIgnoreAndReplaceTableName(String sql, String oldContent,
                                                String replaceContent) {
        sql = sql.replaceAll("insert into", "insert ignore into");
        return replaceTableName(sql, oldContent, replaceContent);
    }
}

 

 

5 最后,怎么使用呢?不用关注微信号,马上告诉你答案。

    使用起来相当的简单,只要在service或者dao层执行库操作前调用 BaseInterceptor.replace(BaseInterceptor.REPLACE_TABLE_NAME,"black_list_phone", "black_list_phone_" + groupId);即可。其中black_list_phone是模板表,groupId是我的逻辑分组,如果是1,就从black_list_phone直接映射到black_list_phone_1。

private void replaceTable(Integer groupId) {
        BaseInterceptor.replace(BaseInterceptor.REPLACE_TABLE_NAME,
                "black_list_phone", "black_list_phone_" + groupId);
    }

public void save(BlackListPhone entity, Integer groupId) {
    replaceTable(groupId);
    super.save(entity);
}

 

分享到:
评论

相关推荐

    spring-3.1.0中文版api帮助文档

    - **基于SVN库持续构建Spring源码**:介绍如何从Subversion仓库中检出源代码并进行编译。 #### 二、控制反转容器 **2.1 DI与Spring DI概述** - **面向Java ME/Java SE的BeanFactory**:解释BeanFactory在非Java ...

    spring 3.1.0 jar包

    Spring 3.1.0是该框架的一个重要版本,为开发者带来了许多改进和新特性。在这个版本中,Spring继续强化了其在企业级应用开发中的地位,尤其是在依赖注入、AOP(面向切面编程)、数据访问、Web开发以及测试等方面。 ...

    spring-framework-3.1.0.M2

    总的来说,Spring Framework 3.1.0.M2是一个强大且灵活的开发工具,它的特性覆盖了从底层的数据访问到高层的业务逻辑处理,为开发者提供了一个全面的解决方案。不断的学习和实践,是充分利用这一框架的关键。

    spring-framework-3.1.0源码

    通过深入学习和理解Spring Framework 3.1.0的源码,开发者不仅能掌握Spring的核心机制,还能了解到软件设计的优秀实践,提升自己的编程技能和架构能力。在实际项目中,结合源码分析,能够更有效地解决遇到的问题,...

    spring-framework-3.1.0.RELEASE

    《Spring Framework 3.1.0.RELEASE:深入解析与应用》 Spring Framework作为Java开发中的核心框架,自诞生以来就以其强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)特性,极大地简化了...

    spring-framework-3.1.0.M1

    《Spring Framework 3.1.0.M1:深入解析与应用》 Spring Framework作为Java开发中的核心框架,自诞生以来就以其强大的企业级应用支持、模块化设计和优秀的可扩展性赢得了开发者们的广泛青睐。本篇文章将聚焦于...

    spring3.1.0全部jar

    spring3.1.0 全部jar包 spring3.1.0 全部jar包 spring3.1.0 全部jar包 •Spring Framework 3.1.0.RELEASE is the current production release (requires Java 1.5+)

    struts2.2.3 + spring3.1.0 + mybatis3.1.0集成简单demo

    struts2.2.3 + spring3.1.0 + mybatis3.1.0集成简单demo。具体请看:http://blog.csdn.net/afgasdg/article/details/7392367

    Spring Security 3.1.0 官方文档中文.chm

    Spring Security 3.1.0 官方文档中文.chm

    spring-security-3.1.0.RC1

    《Spring Security 3.1.0.RC1:企业级安全框架详解》 ...从认证到授权,再到CSRF防护和OAuth集成,每个环节都体现了设计的细致入微。通过深入理解并充分利用这些特性,开发者可以构建出更为安全可靠的应用系统。

    spring-3.1.0中文版api帮助文档.pdf

    《Spring 3.1.0中文版API帮助文档》是针对Spring框架3.1.0版本的详尽技术指南,特别适合那些想要利用Spring进行Java EE 6开发的程序员。该文档旨在深入解析Spring 3.1.0的特性,以及如何在Java EE 6环境下有效地应用...

    spring mvc3.1.0 日期自动转换

    在Spring MVC 3.1.0版本中,它引入了许多改进和新特性,其中之一就是日期自动转换功能。日期自动转换使得开发者在处理HTTP请求参数时,无需手动进行日期格式的转换,系统会自动将字符串形式的日期转换为日期对象。 ...

    Spring 3.1.0 官网API

    Spring 3.1.0是该框架的一个重要版本,它引入了许多新特性和改进,以增强其功能和性能。下面将详细讨论Spring 3.1.0中的关键知识点。 1. **依赖注入(Dependency Injection, DI)**: Spring的核心特性之一就是...

    Spring v3.1.0.RELEASE源码

    Spring v3.1.0.RELEASE源码

    spring3.1.0.RELEASE项目源码

    Spring 3.1.0.RELEASE是该框架的一个重要版本,它引入了许多改进和新特性,旨在提升开发效率和应用程序的性能。这个源码版本提供了一个深入理解Spring内部工作原理的机会,对学习和调试Spring应用非常有帮助。 首先...

    Spring v3.1.0.RC1源码

    这里我们关注的是Spring v3.1.0.RC1的源码,这是一个重要的版本,它在Spring 3.x系列中引入了许多改进和新特性。 首先,让我们深入了解一下Spring的核心组件: 1. **IoC容器**:Spring IoC容器是Spring的核心,它...

Global site tag (gtag.js) - Google Analytics