开发工具:idea
运行环境 :jetty
项目构建工具:maven
项目代码地址:https://github.com/ftinglee/ezssm.git
接上一篇博文:java_web结合spring
http://blog.csdn.net/u010468602/article/details/53307320
首先加入mysql及druid的maven依赖
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.26</version>
</dependency>
然后配置spring配置文件
配置属性占位符,从外部文件读取数据库配置
<!-- 配置属性占位符-->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
使用阿里巴巴druid数据源
具体可参照github,
https://github.com/alibaba/druid
里面有具体的解释
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${druid.initialSize}"/>
<property name="minIdle" value="${druid.minIdle}"/>
<property name="maxActive" value="${druid.maxActive}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${druid.maxWait}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="${druid.validationQuery}"/>
<property name="testWhileIdle" value="${druid.testWhileIdle}"/>
<property name="testOnBorrow" value="${druid.testOnBorrow}"/>
<property name="testOnReturn" value="${druid.testOnReturn}"/>
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="${druid.poolPreparedStatements}"/>
<property name="maxPoolPreparedStatementPerConnectionSize"
value="${druid.maxPoolPreparedStatementPerConnectionSize}"/>
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="${druid.filters}"/>
</bean>
jdbc.properties配置
# Properties file for JDBC configuration
jdbc.url=jdbc:mysql://localhost:3306/ezssm
jdbc.username=root
jdbc.password=root
#druid datasource
druid.initialSize=10
druid.minIdle=10
druid.maxActive=50
druid.maxWait=60000
druid.timeBetweenEvictionRunsMillis=60000
druid.minEvictableIdleTimeMillis=300000
druid.validationQuery=SELECT 'x'
druid.testWhileIdle=true
druid.testOnBorrow=false
druid.testOnReturn=false
druid.poolPreparedStatements=false
druid.maxPoolPreparedStatementPerConnectionSize=20
druid.filters=wall,stat
在web.xml中配置druid servlet,监控数据源状态信息
<!-- 配置 Druid 监控信息显示页面 -->
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
<init-param>
<!-- 允许清空统计数据 -->
<param-name>resetEnable</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 用户名 -->
<param-name>loginUsername</param-name>
<param-value>druid</param-value>
</init-param>
<init-param>
<!-- 密码 -->
<param-name>loginPassword</param-name>
<param-value>druid</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
配置完成之后,启动项目
可以看到数据源配置成功,
然后查看一下druid监控页面
http://localhost:8080/ezssm/druid/
可以看到数据源的监控信息
然后配置sessionFactory
<!-- 配置sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描mapping/目录下的所有SQL映射的xml文件 -->
<property name="mapperLocations" value="classpath:mapping/*.xml"/>
<!-- 要映射类的包路径,如果使用了这种方式,则configLocation中不必再进行声明,多个包以(,; \t\n)之一分隔 -->
<property name="typeAliasesPackage" value="ezbase.system.model" />
</bean>
<!-- 配置扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描ezbase.system.mapper这个包以及它的子包下的所有映射接口类,其中value可以时多个包,以(,; \t\n)之一分隔 -->
<property name="basePackage" value="ezbase.system.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
建立如下目录结构
以上是spring+mybatis的基本配置
以下是事务的配置,当然不是必须的,一般来说,简单的配置,只采用注解
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 以下定义两种方式使用事务:
tx/advice声明式方式来控制具备普遍性特征方法的事务 ,
注解方式控制特殊方法的事务
显示设置order,解决事务冲突时,使用顺序
-->
<!-- 采用@Transactional注解方式使用事务 -->
<tx:annotation-driven transaction-manager="txManager" order="1"/>
<!-- 事务通知,配置普遍性特征方法的事务传播特性 -->
<tx:advice id="commonAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="modify*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="*" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- Spring AOP使用AspectJ配置AOP的配置方式(故需要引入aspectjweaver) -->
<aop:config>
<!--切入点-->
<aop:pointcut id="commonMethod" expression="execution(* ezbase.*.service.*.*(..))"/>
<aop:advisor pointcut-ref="commonMethod" advice-ref="commonAdvice" order="2"/>
</aop:config>
<!-- aop代理设置 -->
<aop:config proxy-target-class="true"></aop:config>
这其中需要的maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
现在基本把架子搭起来了,具体的还需要与数据库的结合,
这里数据库设计采用了基于角色的权限控制基于角色的访问控制(Role-Based Access Control)因为这只是一个简单的demo,所以并没有对数据库表设计的特别复杂,采用简单能用原则,
用户表USER 、角色表ROLR 、权限表PERMISSION、菜单表MENU、用户角色表USER_ROLE、角色权限表ROLE_PERMISSION、角色菜单表ROLE_MENU
结构图不再详列
代码结构如图
中间表没有建对应的中间表实体、mapper类和mapping文件,caz,都把责任划分到其中的具体实体mapper中了,例如,根据用户找对应的角色们,由于最后的结果是用户-角色(1-n),所以数据库找角色信息就可以放到角色mapper中。
通过这两步就可以完成
同样类似的角色菜单、角色权限都是可以这样做
下一步是什么?当然单元测试了
话说,spring test结合junit做单元测试,确实很不错
首先,开启注解
<!-- 启用注解,由于配置了context:component-scan,所以这里就可以省略了 -->
<!--<context:annotation-config />-->
<!--使用注解扫描器,自动扫描ezbase.system下的使用注解的Class,注意这里use-default-filters="true"-->
<context:component-scan base-package="ezbase.system" use-default-filters="true">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
<context:exclude-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
然后就可以写单元测试了
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:ApplicationContext.xml","classpath:ApplicationContext-test.xml"})
public abstract class BaseTest {
}
可以使用spring的注解注入,相当不错,
至此,spring+mybatis已经集成over,
当然,这只是简单的配置,如果有兴趣,可以深入学习看下mybatis的缓存,插件等等,
http://www.mybatis.org/mybatis-3/zh/index.html
从这里可以看到mybatis的一些常用配置
配置完成之后,便可以结合spring mvc了,
http://blog.csdn.net/u010468602/article/details/53308317