SSM——框架详细整合流程(IDEA+Maven)



一、SSM框架整合说明

(1)SSM是什么?

Spring

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

SpringMVC

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

Mybastis

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

(2)为什么要专门训练SSM

要开发一个项目,首先是搭建SSM环境,之后才能开发其他功能

(3)整合思路是什么?

  • 1.先搭建整合的环境
  • 2.先把Spring的配置搭建完成
  • 3.再使用Spring整合SpringMVC框架
  • 4.最后使用Spring整合MyBatis框架

SSM整合可以使用多种方式,咱们会选择XML + 注解的方式
在这里插入图片描述

二、SSM的搭建环境

(1)数据库创建ssm

sql

create database ssm;

use ssm;

create table account(
id int primary key auto_increment, name varchar(20),
money double
);

(2)创建maven工程

1、File ---->new project ---->Maven ---->勾选 create from archetype (这里的Project SDK项选择你自己的JAVA SDK) ---->maven-xxx.quickstart 然后点next–>ssmproject
2、ssmproject ---->new module---->Maven ---->勾选 create from archetype---->maven-xxx.webapp 然后点next–>ssm01
在这里插入图片描述

(3)依赖框架

pom.xml

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.version>5.2.9.RELEASE</spring.version>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
        <mysql.version>5.1.6</mysql.version>
        <mybatis.version>3.4.5</mybatis.version>
    </properties>

    <dependencies>
        <!-- spring -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.8</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</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-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <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>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

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

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

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

        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

        <!-- log end -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>

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

        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

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

(4)log4j.properties

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{
    
    ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\ssm.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{
    
    ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

三、编写Spring框架测试代码

(1)编写业务类调用测试逻辑

TestPersonService

(src\main\test\service)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestPersonService {
    
    
    private static final Logger log=Logger.getLogger(TestPersonService.class.getName());
    @Autowired
    IPersonService personService;
    @Test
    //编写两个功能,查找所有的person,保存一个person
    public void test01(){
    
    
       //创建业务对象
      // IPersonService personService=new PersonServiceImpl();
       //调用查询
        log.info(personService+"");
        List<Person> list=personService.findAll();
        //调用保存
        log.info(list+"");
        Person person=new Person("jack",100.00);
        personService.savePerson(person);

        List<Person> list1=personService.findAll();
        log.info(list1+"");

    }
    @Test
    public void test02(){
    
    
        System.out.println(personService);
    }

Person

(src\main\java\domain)

public class Person {
    
    
    private Integer id;
    private String name;
    private double money;
    
    toString、空参、全参、Getter and Setter
}

IPersonService

(src\main\java\service)

public interface IPersonService {
    
    
    //显示person数据
    List<Person> findAll();
    //保存person数据
    void savePerson(Person person);

    void savePersons(List<Person> personList);
}

PersonServiceImpl

(src\main\java\service\impl)

@Service
@Service
public class PersonServiceImpl implements IPersonService {
    
    

    @Autowired
    private IPersonDao iPersonDao;
    @Override
    public List<Person> findAll() {
    
    
        List<Person> list=iPersonDao.findAll();
        return list;
    }


    @Override
    public void savePerson(Person person) {
    
    
        iPersonDao.save(person);
    }

    @Override
    public void savePersons(List<Person> personList) {
    
    

    }

}

(2)applicationContext.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:aop="http://www.springframework.org/schema/aop"
       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/aop
	http://www.springframework.org/schema/aop/spring-aop.xsd
	http://www.springframework.org/schema/tx
	http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--   设置扫描包,包下设置注解@Service @Repository @Component @AutoWried-->
    <context:component-scan base-package="com.smp">
        <!--    由于springmvc的controller是由springmvc来扫描,需要将controller排除在外-->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

IPersonDao

(src\main\java\dao)

public interface IPersonDao {
    
    
    //增删改查
    //add save
    //find findById findAll
    //update updateById
    //deleteById daleteByIds

    //select * from person;
    List<Person> findAll();

    //insert into person (name,money)values (?,?)
    void save(Person person);
}

PersonDaoImpl

(src\main\java\service\impl)

//@Repository 此类以后讲不用 将由Mybatis自动生成

public class PersonDaoImpl implements IPersonDao {
    
    
    @Override
    public List<Person> findAll() {
    
    
        System.out.println("findAll dao");
        List<Person> list=new ArrayList<>();
        for (int i=0;i<10;i++){
    
    
            Person p=new Person("jack"+i,100.00);
        }
        return list;
    }
    @Override
    public void save(Person person) {
    
    
        System.out.println("save dao");
    }
}

四、Spring整合SpringMVC的框架1

(1)web.xml中配置前端控制器DispatcherServlet

SpringMVC的核心就是DispatcherServlet,DispatcherServlet实质也是一个HttpServlet。DispatcherSevlet负责将请求分发,所有的请求都有经过它来统一分发。

(2)web.xml中配置编码过滤器CharacterEncodingFilter

在 SpringMVC 中,框架直接给我们提供了一个用来解决请求和响应的乱码问题的过滤器 CharacterEncodingFilter

(3)web.xml中配置编码监听器ContextLoaderListener

web.xml中的配置文件中ContextLoaderListener作为监听器,会监听web容器相关事件,在web容器启动或者关闭时触发执行响应程序

(4)springmvc.xml

(5)启动服务器,创建该servlet

web.xml

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--设置配置文件的路径 service dao-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!--1、前端控制器-->
  <!--2、过滤器-->
  <!--3、servlet-->
  <!--4、监听器-->
  <!--5、springmvc.xml配置文件-->

  <!--解决中文乱码的过滤器-->
  <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>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <!--配置Spring的监听器,默认只加载WEB-INF目录下的applicationContext.xml配置文件-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <!--配置前端控制器  controller-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springmvc.xml配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <!--启动服务器,创建该servlet-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

五、Spring整合SpringMVC的框架2

(1)springmvc中配置视图解析器

组件扫描,注解驱动
配置springmvc对资源文件的放行

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--springmvc是web层 UserController  @controller-->
    <!--打开组件扫描-->
    <context:component-scan base-package="com.smp">
        <!--只处理带@Controller的请求-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--配置视图解析器对象-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB_INF/pages"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--过滤静态资源-->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/images/" mapping="/images/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    <!--开启SpringMVC注解的支持 @RequestMapping @RequestBody @ResponseBody-->
    <mvc:annotation-driven/>

</beans>

(2)PersonController

(src\main\java\controller)

@Controller
@RequestMapping("/person")
public class PersonController {
    
    
    @Autowired
    private IPersonService personService;

    @RequestMapping(path = "/list",method = RequestMethod.GET)
    public String list(Model model){
    
    
        //显示所有的person数据
        List<Person> list=personService.findAll();
        System.out.println("list() list="+list);
        //数据放在Model对象中,
        model.addAttribute("list",list);
        return "list";
    }
}

(3)list.jsp页面进行展示数据

http://localhost:8080/ssm01_war_exploded/person/list
(src\main\webapp\WEB_INF\pages)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1px" width="100%">
    <c:forEach items="${list}" var="person">
        <tr>
            <td>${
    
    person.id}</td>
            <td>${
    
    person.name}</td>
            <td>${
    
    person.money}</td>
        </tr>
    </c:forEach>

</table>

</body>
</html>
  • Service由于有junit测试基本不会有bug
  • Web层 使用log4j 打印 请求参数,响应给页面的数据

六、编写MyBatis框架

(1)SqlMapConfig.xml

  • 指定四大信息
  • 指定domain别名
  • 指定映射文件
<?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>
    <!-- 别名  com.smp.domain.Person  person-->
    <typeAliases>
        <package name="com.smp.domain"/>
    </typeAliases>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 核心 配置文件扫描到映射文件-->
    <mappers>
        <mapper resource="IPersonDao.xml"/>
    </mappers>
</configuration>

(2)IPersonDao.xml

(src\main\resources\com\dao)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.smp.dao.IPersonDao">

    <!--//select * from person;
    List<Person> findAll();-->
    <select id="findAll" resultType="person">
        select * from person;
    </select>

    <!--//insert into person (name,money)values (?,?)
    void save(Person person);-->
    <insert id="save" parameterType="person">
        insert into person (name,money)values (#{name},#{money})
    </insert>
</mapper>

(3)TestMyBatis测试

  • 保存
  • 查询

(src\main\test\service)

public class TestMyBatis {
    
    
    //最核心对象是session
    private SqlSession session;
    @Before
    public void init() throws IOException {
    
    
        // 加载配置文件
        InputStream in = TestMyBatis.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        // 创建SqlSessionFactory对象
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        // 创建SqlSession对象
        session = factory.openSession();
    }
    @After
    public void destory(){
    
    
        session.commit();
        session.close();
    }
    @Test
    public void test01(){
    
    
        //查找所有的person
        IPersonDao dao=session.getMapper(IPersonDao.class);
        List<Person> list=dao.findAll();
        System.out.println(list);
    }


    @Test
    public void test02(){
    
    
        //保存新person
        IPersonDao dao=session.getMapper(IPersonDao.class);
        dao.save(new Person("tony",200.00));
    }

}

七、Spring整合MyBatis框架

(1)Spring整合MyBatis需要添加整合包

pom.xml

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

(2)什么是mybatis-spring

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 SqlSession 并注入到 bean 中

  • 四大信息
  • session工厂
  • 数据库映射

applicationContext.xml
将SqlMapConfig.xml的数据配置到spring中

<!--四大信息-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ssm"></property>
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="user" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>

    <!--session工厂-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--com.smp.domain.Person person-->
        <property name="typeAliasesPackage" value="com.smp.domain"/>
    </bean>

    <!--IPersonDao.xml IPersonDao.java-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.smp.dao"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

(3)TestDataSource测试

(src\main\test\service)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDataSource {
    
    
    private static final Logger log=Logger.getLogger(TestDataSource.class.getName());
    @Autowired
    IPersonDao dao;
    @Test
    public void test01() throws SQLException{
    
    
        List<Person> data=dao.findAll();
        System.out.println(data);
    }
    @Test
    public void test02() throws SQLException{
    
    
        Person p=new Person("hello",200.00);
        dao.save(p);
    }
}

八、Spring整合MyBatis框架配置事务

  • (1)表达式设置有哪些serivce方法需要事务管理
  • (2)通知设置 增删改查业务方法 具体对应的事务
  • (3)运行Test

applicationContext.xml

 <!--配置Spring框架声明式事务管理-->
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="*" isolation="DEFAULT"/>
        </tx:attributes>
    </tx:advice>

    <!--配置AOP增强-->
    <aop:config>
        <aop:pointcut id="service" expression="execution(* com.smp.service.impl.*ServiceImpl.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="service"/>
    </aop:config>

TestPersonService
(src\main\test\service)

@Test
    public void test03(){
    
    
        List<Person> personList=new ArrayList<>();
        personList.add(new Person("jack",100.00));
        personList.add(new Person("rose",200.00));
        personList.add(new Person("tony",300.00));

        personService.savePersons(personList);
    }

猜你喜欢

转载自blog.csdn.net/qq_41209886/article/details/109103963
今日推荐