SSM_Spring+Mybatis


开发工具: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

猜你喜欢

转载自blog.csdn.net/u010468602/article/details/53307943