SSM(SpringMVC+Spring+MyBatis)初步的整合

SSM(SpringMVC+Spring+MyBatis)初步的整合

   SpringMVC:MVC的解耦

   Spring:IOC,AOP

   MyBaits:ORM (MyBaits不是ORM框架)

前端:MVVM

3者是一个完美的结合体,但是整合的时候有点啰嗦,不过不影响写代码。

为了简化这个整合的复杂过程,有3种办法。

1、  多练(老师推荐)【效果:自由切换,不需要看任何笔记】

2、  复制粘贴

3、  可以采用Spring boot 【近年来有上升的趋势】 

现阶段:SSH(Struts2+Spring+Hibernate)以SSM(SpringMVC+Spring+MyBatis)为主 

一、创建项目(小公司有可能不划分module,甚至不使用maven,直接Eclipse)

1.通过maven创建一个根层项目(root),名字自定义,把根层src目录删除。

2.创建5个module(entity,dao,service,action、web-view默认打成jar包)

web-view(放前端页面以及打成war包,依赖上面4个模块,最后war文件是交付给客户),把src删除

         3.添加module之间的依赖

  dao——>entity

  service——>dao,entity

  action——>entity,servicde

  web-view——>entity,dao,servicce,action 

4.配置web-view打成war包

a、在web-view层下的POM.XML中添加  <packaging>war</packaging> 

 b、建立2个目录:

    webapp/WEB-INF

                resources

                把web.xml文件复制到webapp/WEB-INF下

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

    <!--这是springmvc的配置-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>

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


    <!--这是spring的配置-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
    <!-- Spring监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

 c、web-view层下的POM.XML中添加

<build>
        <resources>
            <resource>
                <directory>resources</directory>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.2</version>
                <configuration>
<webResources> <resource> <directory>webapp</directory> </resource> </webResources> </configuration> </plugin> </plugins> </build>

二、配置Maven第三方依赖包

<properties>
        <spring-version>5.1.0.RELEASE</spring-version>
        <jackson-version>2.9.7</jackson-version>
        <jstl-version>1.2</jstl-version>
        <mybatis-version>3.4.6</mybatis-version>
        <mybatis-spring-version>1.3.2</mybatis-spring-version>
        <c3p0-version>0.9.5.2</c3p0-version>
        <mysql-version>8.0.12</mysql-version>
        <aopalliance-version>1.0</aopalliance-version>
        <aspectj-version>1.9.1</aspectj-version>
    </properties>

Spring包
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring-version}</version>
        </dependency>
Spring项目中融合需要的东西
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring-version}</version>
        </dependency>
 Spring AOP
<dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>${aopalliance-version}</version>
        </dependency>
Aspectj 框架的2个核心包,JDK扩展,织入的支持
<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>${aspectj-version}</version>
        </dependency>
<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj-version}</version>
        </dependency>
SpringMVC中,ResponseBody时要用到的默认的JSON解析引擎
<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson-version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson-version}</version>
        </dependency>
Spring MVC包
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring-version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring-version}</version>
        </dependency>
JSP的JSTL依赖,如果没有可以不写
<dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl-version}</version>
        </dependency>
MyBatis的依赖包
<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis-version}</version>
        </dependency>
<dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>${mybatis-spring-version}</version>
        </dependency>
        
1.MyBatis的SqlSession提供指定的方法来处理编程式的事务(手动写commit或rollback等代码)
        2.但当使用mybatis-spring这个组件时,bean会使用Spring管理的SqlSession。
        Spring通常都是处理事务(不用程序员来写commit)
<dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>${c3p0-version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-version}</version>
        </dependency>

 三、配置SSM 

1、  配置jdbc.properties

在war包中module(web-view-module)的resources目录,添加jdbc.properties

mysql配置

jdbc.driverClassName=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/batis?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=true

jdbc.username=root

jdbc.password=123456

oracle配置

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@192.168.88.3:1521:orcl
jdbc.username=oa
jdbc.password=123456

2、  配置Spring的配置文件applicationContext.xml(包含融入mybatis相关内容) 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 自动扫描 -->
    <context:component-scan base-package="com.youyou" />
    <!-- 引入配置文件,spring2.5以后的写法,之前的是bean class=org.springframework.beans.factory.config.PropertyPlaceholderConfigurer -->
    <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

    <!--配置C3P0 dataSource-->
    <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="user" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <!-- 连接池中保留的最小连接数,默认为:3 -->
        <property name="minPoolSize" value="3" />
        <!-- 连接池中保留的最大连接数。默认值: 15 -->
        <property name="maxPoolSize" value="15" />
        <!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3 -->
        <property name="initialPoolSize" value="3"/>
    </bean>

    <!--
    此处,SqlSessionFactory以及MapperScannerConfigurer就是书本12.4章的内容
    作用:实现书本第3章代码,一行都不用写,直接生成dao的实现类,不用任何编码
    也不需要写一行mybatis的代码。
    ps.这就是依赖于spring神的帮助
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"></property>
        <property name="mapperLocations" value="classpath*:mapper/*.xml"></property>
    </bean>

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--扫描dao层的接口interface-->
        <property name="basePackage" value="com.youyou.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
    <!--mapper xml文件就像实现类,它是怎么知道对应哪个dao层的接口的?-->

    <!--声明式事务管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="myDataSource" />
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

 

在war包中module(web-view-module)的resources目录,添加applicationContext.xml

  1. 配置自动扫描<context:component-scan>
  2. 配置引入jdbc.properties文件(context:property-placeholder)
  3. 配置c3p0的DataSource
  4. 配置sqlSessionFactory
  5. 配置MapperScannerConfigurer
  6. 配置transactionManager
  7. 配置<tx:annotation-driven>实现使用注解来执行事务

补充说明:在老项目中,可能见到aop的方式处理事务,这种方法已经不流行。但大家还是要看懂。 

3、  配置SpringMVC的配置文件springmvc.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"
       xmlns:aop="http://www.springframework.org/schema/aop"
       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
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <context:component-scan base-package="com.youyou">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>

    <!--mvc:annotation-driven 是告诉springmvc需要解析:@ResponseBody-->
    <!--如果使用jackson,可以不写里面的bean,因为是默认-->
    <mvc:annotation-driven></mvc:annotation-driven>
    <mvc:resources mapping="/img/*.*" location="/img/"/>
    <!-- 自动创建代理植入切面工作-->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
        <!--<property name="prefix" value="/WEB-INF/jsp/"></property>-->
        <!--<property name="suffix" value=".jsp"></property>-->
    <!--</bean>-->
</beans>

 在war包中module(web-view-module)的resources目录,添加springmvc.xml

a.  配置自动扫描包<context:component-scan>

添加一个

<context:exclude-filter type="annotation"

expression="org.springframework.stereotype.Service" />

否则@Transactional不会回滚

b.  配置注解驱动<mvc:annotation-driven> (@ResponseBody需要用上)

默认使用jackson

c.  配置试图解释器<bean class=”… InternalResourceViewResolver”>

d.  配置AOP:<aop:aspectj-autoproxy/>

4、  配置web容器一启动,就启动SpringMVC

在web.xml添加1个Servelt(DispatcherServlet,关联上springmvc.xml)

启动tomcat可以见到这一句话:

initServletBean FrameworkServlet 'springmvc': initialization started

5、  配置web容器一启动, 就启动Spring。

  1. 配置<context-param>contextConfigLocation定义applicationContext.xml
  2. 配置一个ContextLoaderListener(就是WebApplicationContext) 

四、编码

1、编写实体类(entity)

  1. 实体类的属性要跟数据库表的字段要一一对应。(详细的对应在Mapper.xml描述)

  2. 一对多的关系(主实体类中要定义从表实体的List)

    private List<Book> bookList = new ArrayList();

    一对一的关系(主实体类中定义一个从表的属性)

       private Notebook notebook; 

2、编写Dao层的类(dao),此层只做数据库读和写,不参与任何的业务逻辑

  1. 根据实体类的名字,写一个接口(interface)StudentMapper,记录有多少个操作数据库的方法,例如getAll…,getXxxById,getXxxByName,queryXxxFor..,非常注意返回的类型到底是1个实体,还是多个实体
  2. 编写XxxMapper.xml
  3. 注意:<mapper namespace="com.nf.dao.StudentMapper">
  4. 这个namespace就是上一步的接口
  5. 在mapper文件中,每一个id项,就是对应接口的方法名
  6. 特别说明:Dao层实现是不需要手动写代码,12.4章中的mybatis-spring中的.MapperScannerConfigurer会自动读取XxxMapper.xml和对应的接口(interface),在内存中自动创建一个实现类,并且new一个实例,放在ioc容器中,等待service的@Autowired接收。
  7. 编写Service层代码
  8. 新建一个接口(interface),例如:StudentService,定义好各个方法(根据需求)。

    1. 新建一个接口的实现类StudentServiceImpl,实现接口所有的方法。注意,还需要在StudentServiceImpl实现类中写一个注解@Service,把这个组件申明托管在ioc容器中。
    2. 而且每个包含事务的方法,前面要添加一个@Transactional
    3. 在Service实现类,如果要取数据库数据,绝对不能直接访问数据库,只可以调用dao层来间接访问。2行代码。声明一个dao层的实例
    4. private StudentMapper studentMapper;

第2行@Autowired

  • 编写Action层代码
  • 此层不用写接口,直接创建一个普通的java类,不用继承任何东西(struts的Action要继承ActionSupport),显得SpringMVC简单很多,就是一个普普通通的java类。
  • 在Action前添加一个注解@Controller
  • 编写我们响应方法

    (方法1:返回jsp界面,方法返回类型是String,return jsp文件名)

    (方法2:返回JSON数据,没有界面,添加一个@ResponseBody注解)

5.如果前后端分离,开始前端。

posted @ 2018-12-18 11:09  yoyo_张  阅读(249)  评论(0编辑  收藏  举报