美文网首页JAVA基础(未看)
spring-springmvc-hibernate整合

spring-springmvc-hibernate整合

作者: 广西年轻人 | 来源:发表于2018-03-24 00:09 被阅读107次

    最近一直在找工作,面试的时候提到他们公司的项目使用ssh(spring springmvc hibernate)做的,回想起来好像还真没有做过这个整合。其实想了一下,也挺简单的,就是传统ssh的webmvc层面struts2替换为springmvc,或者说是ssm的mybatis替换为hibernate作为orm框架。反正都是spring管理,挺简单的。

    做了一个demo学习一下,顺便回顾一下hibernate。

    思路:springmvc天然集成spring,难度不大,主要是集成hibernate。

    具体版本信息:
    spring:4.3.7.RELEASE
    hibernate:5.2.11.Final

    一,spring+springmvc:天然集成,具体需要配置的有:

    1. 添加依赖
    2. 配置加载spring容器和springmvc的dispatcherServlet
    3. 配置applicationContext.xml文件
    4. 配置springmvc.xml
    5. 配置resource资源文件
      二,spring+hibernate
      采用hbm映射文件的方式,具体需要的配置包含
    6. 添加依赖
    7. 配置数据源(druid)
    8. 配置sqlsessionFactory
    9. 配置一个HibernateTemplate
      4.配置事务相关

    捕获.PNG

    1.完整的pom:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.tuxianchao</groupId>
        <artifactId>spring-springmvc-hibernate-demo</artifactId>
        <packaging>war</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>spring-springmvc-hibernate-demo Maven Webapp</name>
    
        <properties>
            <spring.version>4.3.7.RELEASE</spring.version>
            <hibernate.version>5.2.11.Final</hibernate.version>
            <aspectjweaver.version>1.6.8</aspectjweaver.version>
            <mysql.version>5.1.32</mysql.version>
            <druid.version>1.0.9</druid.version>
            <jstl.version>1.2</jstl.version>
            <servlet-api.version>3.0-alpha-1</servlet-api.version>
            <jsp-api.version>2.2</jsp-api.version>
            <jackson.version>2.7.3</jackson.version>
            <commons-fileupload.version>1.3.1</commons-fileupload.version>
            <slf4j.version>1.6.4</slf4j.version>
        </properties>
        <dependencies>
            <!--spring依赖-->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.6.8</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</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-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-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</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-web</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>${spring.version}</version>
            </dependency>
    
            <!-- hibernate begin -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-validator</artifactId>
                <version>5.2.1.Final</version>
            </dependency>
            <!-- hibernate 缓存, 视情况添加-->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-ehcache</artifactId>
                <version>${hibernate.version}</version>
            </dependency>
            <!-- hibernate end -->
    
            <!-- 日志处理 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>${slf4j.version}</version>
            </dependency>
    
            <!--jsp/servlet-->
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>${jstl.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>${servlet-api.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>${jsp-api.version}</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- MySql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!-- 连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
    
            <!-- Jackson-->
            <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-annotations</artifactId>
                <version>${jackson.version}</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>${jackson.version}</version>
            </dependency>
            <!-- 文件上传组件 -->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>${commons-fileupload.version}</version>
            </dependency>
    
        </dependencies>
        <build>
            <!--资源拷贝-->
            <resources>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.hbm.xml</include>
                    </includes>
                </resource>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.properties</include>
                    </includes>
                </resource>
            </resources>
            <finalName>spring-springmvc-hibernate-demo</finalName>
            <plugins>
                <!-- 资源文件拷贝插件 解决hbm文件打包时拷贝的问题-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.7</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <!-- java编译插件,统一jdk8编译 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <!-- 配置Tomcat插件 -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <path>/</path>
                        <port>8080</port>
                        <uriEncoding>UTF-8</uriEncoding>
                    </configuration>
                </plugin>
                <!--打war包插件-->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.2</version>
                </plugin>
            </plugins>
        </build>
    </project>
    
    
    1. web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             version="2.5">
        <display-name>easybuy-manager-web</display-name>
        <welcome-file-list>
            <welcome-file>/</welcome-file>
        </welcome-file-list>
    
        <!-- 加载spring容器 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-config/applicationContext.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <!-- 解决post乱码 -->
        <!-- 字符编码过滤器,一定要放在所有过滤器之前 -->
        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceRequestEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
            <init-param>
                <param-name>forceResponseEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/</url-pattern>
        </filter-mapping>
    
        <!-- springmvc的前端控制器 -->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-config/springmvc.xml</param-value>
            </init-param>
            <!--servlet容器启动加载-->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    

    3.applicationContext.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--springIOC扫描所有组件-->
        <context:component-scan base-package="com.tuxianchao.demo">
            <!--不扫描Controller-->
            <context:exclude-filter type="annotation"
                                    expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!-- 加载配置文件 -->
        <context:property-placeholder location="classpath:resource/*.properties"/>
    
        <!-- 数据库连接池 -->
        <!-- Druid数据源 -->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
              destroy-method="close">
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="maxActive" value="10"/>
            <property name="minIdle" value="5"/>
    
            <!-- 配置获取连接等待超时的时间 -->
            <property name="maxWait" value="10000"/>
    
            <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
            <property name="timeBetweenEvictionRunsMillis" value="60000"/>
    
            <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
            <property name="minEvictableIdleTimeMillis" value="300000"/>
    
            <property name="testWhileIdle" value="true"/>
    
            <!-- 这里建议配置为TRUE,防止取到的连接不可用 -->
            <property name="testOnBorrow" value="true"/>
            <property name="testOnReturn" value="false"/>
    
            <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
            <property name="poolPreparedStatements" value="true"/>
            <property name="maxPoolPreparedStatementPerConnectionSize"
                      value="20"/>
    
            <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->
            <property name="defaultAutoCommit" value="true"/>
        </bean>
    
    
        <!--**********************配置hibernate*************************-->
        <!--无配置文件方式-->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="packagesToScan" value="com.tuxianchao.demo.entity"/>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!--hibernate根据实体自动生成数据库表-->
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>   <!--指定数据库方言-->
                    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>     <!--在控制台显示执行的数据库操作语句-->
                    <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>     <!--在控制台显示执行的数据哭操作语句(格式)-->
                </props>
            </property>
            <property name="mappingResources">
                <list>
                    <value>com/tuxianchao/demo/entity/User.hbm.xml</value>
                </list>
            </property>
        </bean>
    
    
        <!--
           配置一个hibernateTemplate对象,这个对象spring中XXXTemplate类似,代替了session,
           在需要session的地方注入hibernateTemplate,代替session来执行持久化操作。
           -->
        <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"
              depends-on="sessionFactory">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <!--配置一个事务管理器-->
        <bean id="hibernateTransactionManager"
              class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
    
        <tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
    
    
        <!-- 通知 -->
        <tx:advice id="txAdvice" transaction-manager="hibernateTransactionManager">
            <tx:attributes>
                <!-- 事务传播 -->
                <tx:method name="save*" propagation="REQUIRED"/>
                <tx:method name="insert*" propagation="REQUIRED"/>
                <tx:method name="add*" propagation="REQUIRED"/>
                <tx:method name="create*" propagation="REQUIRED"/>
                <tx:method name="delete*" propagation="REQUIRED"/>
                <tx:method name="update*" propagation="REQUIRED"/>
                <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
                <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
                <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            </tx:attributes>
        </tx:advice>
        <!-- 切面 -->
        <aop:config>
            <!-- 切入点表达式 -->
            <aop:pointcut id="pointCut" expression="execution(* com.tuxianchao.demo.*.*(..))"/>
            <!-- 配置事务增强 -->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
        </aop:config>
    </beans>
    

    4.springmvc.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--springmm IOC只扫描controller-->
        <context:component-scan base-package="com.tuxianchao.demo.controller" use-default-filters="false">
            <context:include-filter type="annotation"
                                    expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!--两个标准配置  -->
        <!-- 支持springmvc更高级的一些功能,JSR303校验,快捷的ajax...映射动态请求 -->
        <mvc:annotation-driven/>
        <!-- 将springmvc不能处理的请求交给tomcat -->
        <mvc:default-servlet-handler default-servlet-name="default"/>
    
    
        <!--视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <!--
            配置直接转发的页面,
            无需经handler方法的处理,直接根据配置的逻辑视图名解析视图
            例如:
            以下配置相当于:
                @requestMaping(value = "/index")
                public String index(){
                    //不做任何操作
                    return "index";
                }
           带来的问题:如果配置了mvc:view-controller直接解析视图,那么在正常的handler中再返回这个逻辑视图名,就404了
           解决: <mcv:annotation-driven></mcv:annotation-driven>
        -->
        <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
    
    
        <!-- 资源映射 -->
        <!--<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>-->
        <!--<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>-->
    
        <!-- 文件上传解析器 -->
        <bean id="multipartResolver"
              class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 文件默认编码 -->
            <property name="defaultEncoding" value="UTF-8"></property>
            <!-- 文件上传的最大值5MB,5*1024*1024 -->
            <property name="maxUploadSize" value="5242880"></property>
        </bean>
    </beans>
    

    完成的工程结构
    https://github.com/tuxianchao/spring-springmvc-hibernate-demo

    相关文章

      网友评论

        本文标题:spring-springmvc-hibernate整合

        本文链接:https://www.haomeiwen.com/subject/ndcfcftx.html