spring + springmvc + mybatis + mysql 整合使用案例

ssm框架对于大多数的java开发的小伙伴们并不陌生吧,已经成为各种java开发的首选框架,想当初,为了整合一个通用的ssm框架模板煞费苦心,一度陷入各类配置文件,各类xml的配置苦海里不能自拔,一旦使用熟练了,发现也就那么回事啊,为了方便本身和各位童鞋从此的整合使用,在此将所有的整合过程简单罗列出来,不足之处,请多多指教;css

该项目为maven工程,工程命名和包的结构命名可根据我的习惯而定,大致不差,项目结构如图:html

这里写图片描述

添加pom依赖jar文件:前端

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <!-- spring aop -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.2</version>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.6.8</version>
    </dependency>

    <!-- Spring整合MyBatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.8</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.2.2</version>
    </dependency>

    <!-- 控制日志输出:结合log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.7</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.37</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.0.0.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.1</version>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.9</version>
    </dependency>

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.2</version>
    </dependency>

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>

    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1.3-b06</version>
    </dependency>

    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- spring单元测试 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.7.RELEASE</version>
        <scope>test</scope>
    </dependency>

    <!-- 格式化对象,方便输出日志 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.1.41</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.9</version>
    </dependency>

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.8.8</version>
    </dependency>

    <!--rabbitmq依赖 -->
    <!-- <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>3.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit</artifactId>
        <version>1.6.5.RELEASE</version>
    </dependency> -->

    <!--active mq start-->  
    <dependency>  
        <groupId>org.apache.activemq</groupId>  
        <artifactId>activemq-core</artifactId>  
        <version>5.7.0</version>  
    </dependency>  

    <dependency>  
        <groupId>org.apache.activemq</groupId>  
        <artifactId>activemq-pool</artifactId>  
        <version>5.13.3</version>  
    </dependency>  
    <!--active mq end-->  
</dependencies>

实际开发中,会对项目中依赖的jar包作统一的版本控制,jar包会从部署在linux服务器包的私服仓库中获取,便于管理,此处为了作演示,没有作版本管理,不须要的jar包能够暂时不依赖,用到的时候再添加也能够;

接下来,进行spring的相关xml文件的配置

【1】applicationcontext.xml,这个配置文件中主要包括下面几项,把这几项主要的记住了,其余的问题不大,之后即使修改也不会改动太多,包括,引入外部数据源并配置数据源,整合mybatis扫描相应的接口包文件,配置事务,配置AOP,引入第三方的xml配置文件,如spring整合rabbitmq的xml文件等,具体以下:

<!-- 加载外部配置文件 -->  
<context:property-placeholder location="classpath:jdbc.properties" />

<!-- 注解扫描包文件,此处有多种写法,主要的一点就是controller层做为控制器交由springmvc的配置文件进行扫描 -->
<!-- <context:component-scan base-package="com.sino" /> -->
<!-- <context:component-scan base-package="com.sino.*">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> -->
<context:component-scan base-package="com.sino"/>

<!-- 配置数据源 ,可选择dbcp,c3p0,druid等-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="url" value="${jdbc_url}" />
    <property name="driverClassName" value="${jdbc_driverClassName}" />
    <property name="username" value="${jdbc_username}" />
    <property name="password" value="${jdbc_password}" />
</bean>

<!-- 配置整合mybatis,注意,此处直接将实体类文件到数据库数据表作了映射匹配,便再也不额外添加sqlConfig.xml的配置文件,简化了配置的写法 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="typeAliasesPackage" value="com.sino.entity"/>
    <!-- 自动扫描mapping.xml文件 -->  
    <property name="mapperLocations" value="classpath:mybatis/*-mapper.xml"></property>  
</bean>

<!-- mybatis扫描接口包文件,扫描接口所在的包文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.sino.dao" />
    <property name="SqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

<!-- 事务配置 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<!-- 配置拦截service -->
<!-- <aop:config>
    <aop:pointcut expression="execution(* com.ssm.service..*(..))" id="txPoint"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
-->

<!-- 配置事物加强,事物如何切入-->
<tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
        <!-- 全部方法都是事物方法 -->
        <tx:method name="*"/>
        <!-- 以get开始的全部方法 -->
        <tx:method name="get*" read-only="true"/>
        <tx:method name="query*" read-only="true"/>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="select*" read-only="true"/>
    </tx:attributes>
</tx:advice>

<!-- 引入rabbitmq -->
<!-- <import resource="rabbitMq.xml"/> -->

该配置文件中,还能够对事务作更精细的配置,还有AOP的配置,因为时间关系,没有写出来,可自行补上;

【2】springmvc.xml,该配置文件属于控制器层面的配置,全部前端的请求传递到后端,都要通过该配置文件的控制和管理,其主要配置项包括,扫描controller所在的包,配置静态资源的访问,如html,jsp,css,img,配置拦截器,配置视图解析器,配置时间格式化日期,配置上传文件的组件控制等,具体配置以下:

<!-- 配置静态资源访问 -->
<mvc:default-servlet-handler />
<mvc:annotation-driven />

<!-- 扫描注解包 -->
<context:component-scan base-package="com.sino.controller" />

<!-- 自定义拦截器定义 -->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login"/>
        <mvc:exclude-mapping path="/doLogin"/>
        <mvc:exclude-mapping path="/bootstrap/**"/>
        <mvc:exclude-mapping path="/css/**" />
        <mvc:exclude-mapping path="/fonts/**" />    
        <mvc:exclude-mapping path="/img/**" />
        <mvc:exclude-mapping path="/jquery/**" />
        <mvc:exclude-mapping path="/layer/**" />
        <mvc:exclude-mapping path="/script/**" />
        <mvc:exclude-mapping path="/ztree/**" />
        <bean class="com.sino.intercepter.LoginInterceptor"></bean>
    </mvc:interceptor>

    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login"/>
        <mvc:exclude-mapping path="/doLogin"/>
        <mvc:exclude-mapping path="/bootstrap/**"/>
        <mvc:exclude-mapping path="/css/**" />
        <mvc:exclude-mapping path="/fonts/**" />    
        <mvc:exclude-mapping path="/img/**" />
        <mvc:exclude-mapping path="/jquery/**" />
        <mvc:exclude-mapping path="/layer/**" />
        <mvc:exclude-mapping path="/script/**" />
        <mvc:exclude-mapping path="/ztree/**" />
        <bean class="com.sino.intercepter.AuthInterceptor"></bean>
    </mvc:interceptor>

</mvc:interceptors>

<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <bean
                class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
        </list>
    </property>
</bean>

<!-- 配置文件上传大小控制 -->
<bean id="multipartResolver" 
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
    <property name="maxUploadSize" value="2097152" />
    <property name="resolveLazily" value="true" />
</bean>

【3】访问数据库的配置文件 jdbc.properties
jdbc_driverClassName=com.mysql.jdbc.Driver
jdbc_url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc_username=root
jdbc_password=root

【4】log4j.properties
#将Mybatis log4j运行级别调到DEBUG能够在控制台打印出Mybatis运行的sql语句

log4j.rootLogger=DEBUG,Console,File java

把日志信息输出到控制台 ###

log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd-HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n mysql

把日志信息输出到文件:/opt/uploads/maven_logs/maven_web.log ###

log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File = /opt/uploads/maven_logs/maven_web.log
log4j.appender.File.Threshold = DEBUG
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =%d{yyyy-MM-dd-HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n jquery

显示SQL语句部分

log4j.logger.com.mybatis=DEBUG
log4j.logger.com.mybatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.mybatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUGlinux

【5】web.xml,最容易忽视并且容易出问题的就在这个配置文件中,注意的问题就是搞明白这个配置文件的做用和加载的顺序就行了,其中配置的项包括,加载springmvc的xml文件,前端的请求首先通过web.xml文件,将其转发给springmvc的配置文件进行请求的统一处理;配置spring的xml文件,对spring的相关配置进行全局统一初始化工做;再就是字符集过滤,日志信息,其余错误页面的转发等,下面请看具体配置,注意,配置文件的路径不要写错了,不然启动报错,web

这里写图片描述

配置文件到此基本搞定,配置文件配置好能够说框架整合完成了八成工做,不然各类报错会一直在配置文件中纠缠,接下来就是作测试,框架整合完毕,测试主要包括3种,一种是框架自身,例如项目启动没有报错的话,是否能够访问controller中的接口,其二是静态页面的定向,可否经过controller将请求路由到相应的页面,第三是数据库链接是否成功,下面将分别作这三种简单的测试, 首先在tomcat中启动工程,此处使用的是tomcat8.X版本spring

1)经过浏览器直接访问controller接口,是否可以访问到,
这里写图片描述sql

在controller包下面建立IndexController,

@Controller
@RequestMapping(“/user”)
public class IndexController {

@RequestMapping("/index")
public String toIndex(){
    return "index";
}

@ResponseBody
@RequestMapping("/getData")
public String getData(){
    String result = "success";
    return result;
}

}

浏览器输入地址,http://localhost:8080/ssm_project/user/getData,结果以下:
这里写图片描述

2)经过浏览器直接访问controller接口,经过controller转发到页面
在WEB-INF下的jsp文件中有一个index.jsp,
这里写图片描述
说明接口是通顺的;

浏览器输入:http://localhost:8080/ssm_project/user/index,页面展现内容以下:
这里写图片描述
说明能够经过接口正常转发页面;

3)经过浏览器直接访问controller接口,测试数据库配置是否成功链接
在user-mapper.xml文件中,有一个查询t_user的表,数据库中新建一个t_user的表并存入几条数据,
这里写图片描述

同时,建立测试的controller类,代码以下,
@ResponseBody
@RequestMapping("/testDbData")
public List<User> testDbData(){
    return userService.getDbData();
}

再在mybatis包下新建一个user-mapper.xml文件,里面有一个查询t_user的sql语句,
select * from t_user

浏览器输入:http://localhost:8080/ssm_project/user/testDbData,页面展现内容以下:

这里写图片描述

说明整合mybatis访问mysql也是能够正常使用的,至此,ssm整合所有完毕,有关ssm更多的配置,好比自定义异常处理,访问拦截器配置,业务层的事务处理等,都可在此基础上作添加补充,还欢迎各位童鞋提出宝贵意见!!