前言
今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这篇主要搭建SpringMVC4.1.4和Hibernate4.3.8,之前也打了好多SpringMVC的,这部分已经非常的熟悉了,毕竟业开发过一年多SpringMVC的,这次持久层采用Hibernate,数据源采用c3p0,数据库暂采用MySQL,主要是想复习一下Hibernate。搭建SpringMVC+Hibernate的框架的思路如下:
1、设计数据库:设计好表结构,最好符合3NF,采用Hibernate tools将设计好的表自动生成对应的实体entity。
1、创建Maven项目,按需映入Maven包依赖。
2、搭建Spring:配置Spring对控件层Bean的注入。
3、搭建Hibernate:配置数据源,配置SessionFactory,配置事务,以及二级缓存ehcache的配置。
4、测试Spring+Hibernate的框架搭建,写单元测试JUnit,测试事务配置等。
5、映入SpringMVC:配置SpringMVC配置信息。
6、配置web.xml容器
7、测试三个框架的整合:Maven编译打包部署服务器,测试。
1、数据库设计
设计一个权限、角色、用户的表。自然如果一个用户可以有多个角色,一个角色多个用户所拥有;一个角色拥有多个权限,一个权限对应多个角色。所以按照数据库表结构设计,符合3NF的话我们需要5张表进行存在。表的具体信息就不列出了(可以下在源码,里面还有数据库),表关系如下:
这里面ID才用到是java的UUID(36位)
2、创建Maven项目,编写pom.xml文件
创建一个Maven的webapp项目,编写pom.xml文件,引入所需的包依赖,我这里就将所需的全部的映入了。
pom.xml文件内容如下:
<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>org.andy.sh</groupId> <artifactId>springmvc_hibernate_demo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version>
</project>1<name>springmvc\_hibernate\_demo Maven Webapp</name> 2<url>http://maven.apache.org</url> 3 4<properties> 5 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 6 <spring.version>4.1.4.RELEASE</spring.version> 7 <hibernate.version>4.3.8.Final</hibernate.version> 8 <jackson.version>2.5.0</jackson.version> 9</properties> 10 11<dependencies> 12 13 <!-- junit --> 14 <dependency> 15 <groupId>junit</groupId> 16 <artifactId>junit</artifactId> 17 <version>4.12</version> 18 <scope>test</scope> 19 </dependency> 20 21 <!-- spring --> 22 <dependency> 23 <groupId>org.springframework</groupId> 24 <artifactId>spring-core</artifactId> 25 <version>${spring.version}</version> 26 </dependency> 27 28 <dependency> 29 <groupId>org.springframework</groupId> 30 <artifactId>spring-beans</artifactId> 31 <version>${spring.version}</version> 32 </dependency> 33 34 <dependency> 35 <groupId>org.springframework</groupId> 36 <artifactId>spring-context</artifactId> 37 <version>${spring.version}</version> 38 </dependency> 39 40 <dependency> 41 <groupId>org.springframework</groupId> 42 <artifactId>spring-tx</artifactId> 43 <version>${spring.version}</version> 44 </dependency> 45 46 <dependency> 47 <groupId>org.springframework</groupId> 48 <artifactId>spring-web</artifactId> 49 <version>${spring.version}</version> 50 </dependency> 51 52 <dependency> 53 <groupId>org.springframework</groupId> 54 <artifactId>spring-test</artifactId> 55 <version>${spring.version}</version> 56 <scope>test</scope> 57 </dependency> 58 59 <!-- 使用SpringMVC需配置 --> 60 <dependency> 61 <groupId>org.springframework</groupId> 62 <artifactId>spring-webmvc</artifactId> 63 <version>${spring.version}</version> 64 </dependency> 65 66 <!-- 关系型数据库整合时需配置 如hibernate jpa等 --> 67 <dependency> 68 <groupId>org.springframework</groupId> 69 <artifactId>spring-orm</artifactId> 70 <version>${spring.version}</version> 71 </dependency> 72 73 <!-- hibernate --> 74 <dependency> 75 <groupId>org.hibernate</groupId> 76 <artifactId>hibernate-core</artifactId> 77 <version>${hibernate.version}</version> 78 </dependency> 79 80 <dependency> 81 <groupId>org.hibernate</groupId> 82 <artifactId>hibernate-ehcache</artifactId> 83 <version>${hibernate.version}</version> 84 </dependency> 85 86 <!-- 二级缓存ehcache --> 87 <dependency> 88 <groupId>net.sf.ehcache</groupId> 89 <artifactId>ehcache</artifactId> 90 <version>2.9.0</version> 91 </dependency> 92 93 <!-- log4j --> 94 <dependency> 95 <groupId>log4j</groupId> 96 <artifactId>log4j</artifactId> 97 <version>1.2.17</version> 98 </dependency> 99 100 <!-- mysql连接 --> 101 <dependency> 102 <groupId>mysql</groupId> 103 <artifactId>mysql-connector-java</artifactId> 104 <version>5.1.34</version> 105 </dependency> 106 107 <!-- c3p0数据源 --> 108 <dependency> 109 <groupId>com.mchange</groupId> 110 <artifactId>c3p0</artifactId> 111 <version>0.9.5-pre10</version> 112 </dependency> 113 114 <!-- json --> 115 <dependency> 116 <groupId>com.alibaba</groupId> 117 <artifactId>fastjson</artifactId> 118 <version>1.2.3</version> 119 </dependency> 120 121 <dependency> 122 <groupId>com.fasterxml.jackson.core</groupId> 123 <artifactId>jackson-annotations</artifactId> 124 <version>${jackson.version}</version> 125 </dependency> 126 127 <dependency> 128 <groupId>com.fasterxml.jackson.core</groupId> 129 <artifactId>jackson-core</artifactId> 130 <version>${jackson.version}</version> 131 </dependency> 132 133 <dependency> 134 <groupId>com.fasterxml.jackson.core</groupId> 135 <artifactId>jackson-databind</artifactId> 136 <version>${jackson.version}</version> 137 </dependency> 138 139 <!-- aop --> 140 <dependency> 141 <groupId>org.aspectj</groupId> 142 <artifactId>aspectjweaver</artifactId> 143 <version>1.8.4</version> 144 </dependency> 145 146 <!-- servlet --> 147 <dependency> 148 <groupId>javax.servlet</groupId> 149 <artifactId>servlet-api</artifactId> 150 <version>3.0-alpha-1</version> 151 <scope>provided</scope> 152 </dependency> 153 154 <dependency> 155 <groupId>javax.servlet</groupId> 156 <artifactId>jstl</artifactId> 157 <version>1.2</version> 158 </dependency> 159 160</dependencies> 161 162<build> 163 <finalName>springmvc\_hibernate\_demo</finalName> 164 165 <plugins> 166 <!-- Run the JUnit unit tests in an isolated classloader --> 167 <plugin> 168 <groupId>org.apache.maven.plugins</groupId> 169 <artifactId>maven-surefire-plugin</artifactId> 170 <version>2.4.2</version> 171 <configuration> 172 <skipTests>true</skipTests> 173 </configuration> 174 175 </plugin> 176 177 <plugin> 178 <groupId>org.apache.maven.plugins</groupId> 179 <artifactId>maven-war-plugin</artifactId> 180 <version>2.3</version> 181 <configuration> 182 <webXml>src/main/webapp/WEB-INF/web.xml</webXml> 183 </configuration> 184 </plugin> 185 186 <!-- generate java doc --> 187 <plugin> 188 <groupId>org.apache.maven.plugins</groupId> 189 <artifactId>maven-javadoc-plugin</artifactId> 190 <version>2.9.1</version> 191 <configuration> 192 <javadocDirectory>target/javadoc</javadocDirectory> 193 <reportOutputDirectory>target/javadoc</reportOutputDirectory> 194 <charset>UTF-8</charset> 195 <encoding>UTF-8</encoding> 196 <docencoding>UTF-8</docencoding> 197 <show>private</show> 198 </configuration> 199 </plugin> 200 201 <!-- 部署至本机 --> 202 <plugin> 203 <groupId>org.codehaus.cargo</groupId> 204 <artifactId>cargo-maven2-plugin</artifactId> 205 <version>1.0</version> 206 <configuration> 207 <container> 208 <containerId>tomcat6x</containerId> 209 <home>D:\\WebServer\\apache-tomcat-6.0.39</home> 210 </container> 211 <configuration> 212 <type>existing</type> 213 <home>D:\\WebServer\\apache-tomcat-6.0.39</home> 214 </configuration> 215 </configuration> 216 </plugin> 217 </plugins> 218 219</build>
3、引入Spring配置
编写配置文件,配置文件放在src/main/resources资源目录下(下同)。
项目所需的配置信息config.properties
#application configs
#jdbc c3p0 config jdbc.driver = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8 jdbc.username = root jdbc.password = 12345
#hibernate config hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true hibernate.format_sql = false hibernate.hbm2ddl.auto = update hibernate.cache.use_second_level_cache = true hibernate.cache.use_query_cache = true hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory hibernate.cache.provider_configuration_file_resource_path = ehcache.xml
3.1、spring配置
spring.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd"> <!-- 加载配置文件 -->
</beans>1<context:property-placeholder location="classpath:config.properties"/> 2<!-- 扫描service自动注入为bean --> 3<context:component-scan base-package="org.andy.work.service.impl,org.andy.work.dao.impl" />
上面spring配置了对应包下组件bean自动注入管理,我们需要将dao,service的实现类交由spring管理,如(@Repository,@Service)。
3.2、引入日志文件配置Log4j
log4j.properties的配置文件如下:
### set log levels ### log4j.rootLogger = INFO , C , D , E
console
log4j.appender.C = org.apache.log4j.ConsoleAppender log4j.appender.C.Target = System.out log4j.appender.C.layout = org.apache.log4j.PatternLayout log4j.appender.C.layout.ConversionPattern = [springmvc_hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
log file
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = ../logs/springmvc_hibernate_demo.log log4j.appender.D.Append = true log4j.appender.D.Threshold = INFO log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = [springmvc_hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
exception
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File = ../logs/springmvc_hibernate_demo_error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = [sspringmvc_hibernate_demo][%p] [%-d{yyyy-MM-dd HH:mm:ss}] %C.%M(%L) | %m%n
4、Hibernate配置
Hibernate的配置主要包括:配置数据源c3p0,配置SessionFactory,配置事务管理器,配置事务管理,其spring-hibernate.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: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-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
</beans>1<!-- 配置数据源 c3p0 --> 2<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 3 destroy-method="close"> 4 <property name="driverClass" value="${jdbc.driver}" /> 5 <property name="jdbcUrl" value="${jdbc.url}" /> 6 <property name="user" value="${jdbc.username}" /> 7 <property name="password" value="${jdbc.password}" /> 8 9 <!-- 请求超时时间 --> 10 <property name="checkoutTimeout" value="30000" /> 11 <!-- 每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 --> 12 <property name="idleConnectionTestPeriod" value="30" /> 13 <!-- 连接数据库连接池最大空闲时间 --> 14 <property name="maxIdleTime" value="30" /> 15 <!-- 连接池初始化连接数 --> 16 <property name="initialPoolSize" value="5" /> 17 <property name="minPoolSize" value="5" /> 18 <property name="maxPoolSize" value="20" /> 19 <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 --> 20 <property name="acquireIncrement" value="5" /> 21</bean> 22 23<!-- 配置hibernate的SessionFactory --> 24<bean id="sessionFactory" 25 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 26 <!-- 注入数据源 相关信息看源码 --> 27 <property name="dataSource" ref="dataSource" /> 28 <!-- hibernate配置信息 --> 29 <property name="hibernateProperties"> 30 <props> 31 <prop key="hibernate.dialect">${hibernate.dialect}</prop> 32 <prop key="hibernate.show\_sql">${hibernate.show\_sql}</prop> 33 <prop key="hibernate.format\_sql">${hibernate.format\_sql}</prop> 34 <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 35 36 <!-- 开启二级缓存 ehcache --> 37 <prop key="hibernate.cache.use\_second\_level\_cache">${hibernate.cache.use\_second\_level\_cache}</prop> 38 <prop key="hibernate.cache.use\_query\_cache">${hibernate.cache.use\_query\_cache}</prop> 39 <prop key="hibernate.cache.region.factory\_class">${hibernate.cache.region.factory\_class}</prop> 40 <prop key="hibernate.cache.provider\_configuration\_file\_resource\_path">${hibernate.cache.provider\_configuration\_file\_resource\_path} 41 </prop> 42 </props> 43 </property> 44 <!-- 扫描hibernate注解配置的entity --> 45 <property name="packagesToScan" value="org.andy.work.entity" /> 46</bean> 47 48<!-- 配置事务管理器 --> 49<bean id="transactionManager" 50 class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 51 <property name="sessionFactory" ref="sessionFactory" /> 52</bean> 53 54<!-- 配置事务增强处理Bean,指定事务管理器 --> 55<tx:advice id="transactionAdvice" transaction-manager="transactionManager"> 56 <!-- 配置详细事务处理语义 --> 57 <tx:attributes> 58 <tx:method name="insert\*" propagation="REQUIRED" /> 59 <tx:method name="update\*" propagation="REQUIRED" /> 60 <tx:method name="delete\*" propagation="REQUIRED" /> 61 62 <tx:method name="get\*" propagation="SUPPORTS" read-only="true" /> 63 <tx:method name="find\*" propagation="SUPPORTS" read-only="true" /> 64 <tx:method name="select\*" propagation="SUPPORTS" read-only="true" /> 65 <tx:method name="load\*" propagation="SUPPORTS" read-only="true" /> 66 67 <!-- 其他采用默认事务方式 --> 68 <tx:method name="\*" /> 69 70 </tx:attributes> 71</tx:advice> 72 73<!-- Spring aop事务管理 --> 74<aop:config> 75 <!-- 配置切入点 --> 76 <aop:pointcut id="transactionPointcut" 77 expression="execution(\* org.andy.work.service..\*Impl.\*(..))" /> 78 <!-- 指定在txAdvice切入点应用txAdvice事务增强处理 --> 79 <aop:advisor pointcut-ref="transactionPointcut" 80 advice-ref="transactionAdvice" /> 81</aop:config>
上面配置了二级缓存,ehcache,相关的具体信息查看上一篇Hibernate二级缓存以及ehcache的搭建配置,下面是二级缓存的配置。
4.1、ehcache.xml的配置
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="D:/ehcache" /> <!-- DefaultCache setting. --> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="1000000" overflowToDisk="true" memoryStoreEvictionPolicy="LRU"></ehcache>1</defaultCache> 2 3<!-- Special objects setting. --> 4 5<cache 6 name="org.andy.work.entity.AcctUser" 7 maxElementsInMemory="2" 8 memoryStoreEvictionPolicy="LRU" 9 eternal="true" 10 diskPersistent="false" 11 overflowToDisk="false" 12 maxElementsOnDisk="1000000" />
ok,到此Spring+SpringMVC+Hibernate搭建完毕。
框架/平台构成:
Maven+Springmvc + Mybatis + Shiro(权限)+ Tiles(模板) +ActiveMQ(消息队列) + Rest(服务) + WebService(服务)+ EHcache(缓存) + Quartz(定时调度)+ Html5(支持PC、IOS、Android)
用户权限系统:
组织结构:角色、用户、用户组、组织机构;权限点:页面、方法、按钮、数据权限、分级授权
项目管理新体验:
快速出原型系统、组件树、版本控制、模块移植、协同开发、实时监控、发布管理
可持续集成:
所有组件可移植、可定制、可扩充,开发成果不断积累,形成可持续发展的良性循环
支持平台平台:
Windows XP、Windows 7 、Windows 10 、 Linux 、 Unix
服务器容器:
Tomcat 5/6/7 、Jetty、JBoss、WebSphere 8.5










































