传统 spring+Spring MVC+Mybatis搭建

传统SSM框架应用

1:spring给我们提供了快捷开发的框架.使用此框架能快速搭建web项目工程结构.能有效提高我们的开发效率.那么该如何去搭建?

在此使用maven工程来管理项目

1:创建maven项目 项目父工程:名为 ssm 打包方式为 pom
说明:初学者可以仔细看这种方式,对于后续的分布式开发是有帮助的.若就是想搭建一个简单的ssm,那就直接从第三步开始.不过对应版本号不要忘了加.
引入相关依赖如下:

<dependencyManagement>
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.2.8</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.2.2</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>4.3.18.RELEASE</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.0.8</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.18</version>
                <scope>provided</scope>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!-- 使用@Responsebody 等注解-->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.6</version>
            </dependency>
            <!--dubbo-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.5.3</version>
            </dependency>
            <!--zookeeper-->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.4.6</version>
                <exclusions>
                    <exclusion>
                        <artifactId>spring</artifactId>
                        <groupId>org.springframework</groupId>
                    </exclusion>
                </exclusions>
                <type>pom</type>
            </dependency>
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.2</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

声明:在父工程里面是我们后边的子工程需要需要用到的依赖.在节点:
< dependencyManagement> 里面是声明,并没有引用,这是为了方便统一管理依赖版本号.在子工程里面只需要添加依赖不用再写版本号

二:创建子工程,项目名为:ssm-api 打包方式为 jar.
目的:我们可以将公共部分放在这个工程里面,然后在其他子工程中,引入他的依赖,就可以使用里面的类.
其依赖如下:下面是lombok 需要安装插件才能使用

 	<dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

定义一个User类.如下: 下面注解是lombok相关注解,具体使用,可以百度查看.
注意:eclipse或者idea都需要安装其插件.然后引入依赖才能使用

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String username;
    private String password;
    private Integer role;
}

三:创建子工程 ,项目名:ssm-simple 打包方式为war
相关依赖如下:
请注意第一个依赖,就是我们步骤二定义的公共api.在这里引入其坐标就可以在项目中使用里面的类.(首先将父工程ssm或者ssm-api项目 maven-install 至本地maven仓库中.这样后续才能在仓库中找到其坐标)

<dependencies>
        <!--引入自定义api依赖-->
        <dependency>
            <groupId>com.org.itmck</groupId>
            <artifactId>ssm-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- spring 核心依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </dependency>
        <!--spring mvc相关依赖-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <!-- 使用@Responsebody 等注解-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.6</version>
        </dependency>
        <!-- spring service相关注解 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </dependency>
        <!-- spring事务相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </dependency>
        <!--mybatis相关注解 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
        </dependency>
        <!--mybatis整合spring 相关注解 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
        </dependency>
        <!--spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </dependency>
        <!--mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--配置端口号-->
                    <port>8080</port>
                    <!--配置映射路径 http://localhost:8080/ssm-->
                    <path>/ssm</path>
                </configuration>
            </plugin>
        </plugins>
    </build>

扩展: 好多的****上边将一些项目依赖,就是直接引入一堆东西.初学者都不知道哪些是必须的,哪些依赖是干什么的.这样造成对maven依赖学习的不够深.我在上边分别写上了.

配置spring-mvc.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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
    <!--扫描web层的注解类,以**解是为了扫描这个注解:@Controller-->
    <context:component-scan base-package="com.itmck.web"/>
    <[email protected] @ResponseBody jackson转换成JSON-->
    <mvc:annotation-driven/>
    <!--配置视图解析器 Controller  hello(){return "index"}  转发:/WEB-INF/jsp/index.jsp -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--静态资源放行,凡是页面上访问css js images这些静态文件时候,都不经过controller-->
    <!--url路径如下:http://localhost:81/manager/static/ab/b/c/hello.css-->
    <!--静态资源放行:http://localhost:81/manager/css/hello.css本来是要经过contrller,但是配置了这句话,配置完了以后,直接去寻找webapp/css/hello.css-->
    <mvc:resources mapping="/static/**" location="/static/"/>
    <mvc:resources mapping="/lib/**" location="/lib/"/>
</beans>

配置spring-service.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"
       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">
    <!--扫描service层的注解类,以**解是为了扫描这个注解:@Service-->
    <context:component-scan base-package="com.itmck.service.impl"/>
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--属性注入数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--注解方式声明式事务第二步-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

配置spring-dao.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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
    ">
    <!--配置数据库连接文件-->
    <context:property-placeholder location="classpath:db.properties"/>
    <!--配置数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!--添加基本属性-->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--添加优化属性-->
        <property name="defaultAutoCommit" value="false"/>
    </bean>

    <!--配置会话工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--属性注入数据源-->
        <property name="dataSource" ref="dataSource"/>
        <!--属性注入mybatis的主配置文件-->
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
    </bean>
    <!--配置扫描DAO接口-->
    <!--MapperScannerConfigurer和SqlSessionFactoryBean都是来自于mybatis-spring.jar-->
    <!--MapperScannerConfigurer,这个类就是你不写DAO接口实现类的原因-->
    <!--bean时,什么时候需要些id属性? 如果这个bean定义好了以后需要在别的地方被引用就需要添加id属性-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入会话工厂-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--注入DAO层所在包的基础路径-->
        <property name="basePackage" value="com.itmck.dao"/>
    </bean>
    <!--扫描DAO层的注解类,以**解是为了扫描这个注解:@Repository-->
    <context:component-scan base-package="com.itmck.dao"/>
</beans>

配置:db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_spring?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

配置mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!-- 开启驼峰命名转换   seckill_id====>seckillId -->
        <!--设置此项后,可以不用在mapper.xml中配置resultMap映射-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    <!--配置别名 可以不进行配置此项
        配置此项目的,可以不使用类的全限定名,而是直接使用类的名字(忽略首字母大小写)
    -->
    <typeAliases>
        <package name="com.org.itmck.pojo"/>
    </typeAliases>
</configuration>

1:说明:很多人会问,直接配置一个springcontext.xml,将上边的放在一起不就行了.何必这样麻烦.也是可以的.我这样写,是为了更清楚讲述,三层分别代表什么.对初学者来说,更加简单.
2:配置xml的时候,我们要注意上边的schama与dtd要引入进来.用到哪些就引入哪些即可.
举个栗子:spring-mvc.xml需引入如下:.
xmlns:mvc=“http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
其余自行参考文档

最后配置web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">
    <!-- 配置Spring的配置文件 去加载spring的配置文件 -->
    <listener>
        <!-- 默认是去WEB-INF下找 applicationContext.xml配置文件 -->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-*.xml</param-value>
    </context-param>


    <!-- 配置SPringMVC的核心处理器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- contextConfigLocation固定 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
        <!-- 启动服务器就实例化 -->
        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>

    </servlet-mapping>

    <!-- SPring解决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>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- form表单只支持 Get和POST 如果想支持rest风格 得配置该过滤器 然后该过滤器会帮我们实现 -->
    <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

上边有两点说明:
1:配置springmvc核心处理器.其执行流程读者可以去学一下.面试很容易问道.这里不多说.

    <!-- 配置SPringMVC的核心处理器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- contextConfigLocation固定 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-mvc.xml</param-value>
        </init-param>
        <!-- 启动服务器就实例化 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

到这里其ssm搭建就算结束了.最后写一个测试类.来测试一下:

controller层:

@Controller
public class ActionController {

    @Autowired
    private UserService userService;

    @RequestMapping("gt")
    @ResponseBody
    public User getIndex(String name) {
        return userService.selectByName(name);
    }
}

service层

public interface UserService {
    /**
     * 获取用户
     * @param name
     * @return
     */
    User selectByName(String name);

    User getUser(Long id);
}

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public User selectByName(String name) {

        return userDao.selectByName(name);
    }

    @Override
    public User getUser(Long id) {
        return userDao.getUser(id);
    }
}

dao层:这里我使用的是注解方式,简单测试能否可用

@Repository
public interface UserDao {

    @Select("select * from tb_user where username=#{name}")
    User selectByName(String name);

    @Select("select * from tb_user where id=#{id}")
    User getUser(Long id);
}

运行项目,测试如下:
传统 spring+Spring MVC+Mybatis搭建这是很简单的ssm搭建.里面没有配置aop相关.如果需要配置aop,就在spring-service.xml中配置即可.记住一点:

约定>配置>编码


下面贴出整个项目的目录:传统 spring+Spring MVC+Mybatis搭建

github代码 https://github.com/itmck/ssm-demo 此项目里面包含了ssm集成dubbo的简单案例.有余力的可以交流