SSM框架整合

前言

SSM框架整合

SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成;

以下我将分别搭建出Spring、SpringMVC、Mybatis的环境;

以spring为平台,把3层架构里SpringMVC的controller处理器对象、service层的实现类对象、Mybatis的创建的mapper对象放到容器中;

各个对象放到spring的容器之后,进行依赖注入,实现3层之间的调用;

SSM框架整合

1.SSM框架集合

  • SpringMVC负责表示层跟用户交互
  • Spring负责业务层逻辑(声明式事务)
  • Mybatis负责持久层对数据库操作

2.SSM整合基本思路:

  • 使用Spring( 容器 )来整合Mybatis和SpringMVC

3.整合步骤是这样:

  • 先各自搭建SSM的环境
  • 使用Spring整合Mybatis
  • 使用Spring整合Springmvc

一、开发环境

先准备一下开发环境;

1.导入pom依赖

SSM框架整合SSM框架整合
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <groupId>com.zhanggengroupId> <artifactId>ssmartifactId> <version>1.0-SNAPSHOTversion> <packaging>warpackaging> <dependencies>

<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>mysql<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>mysql-connector-java<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>5.1.6<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>com.alibaba<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>druid<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>1.1.15<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.mybatis<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>mybatis<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>3.5.1<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>

<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-context<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>5.1.6.RELEASE<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-jdbc<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>5.1.6.RELEASE<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.aspectj<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>aspectjweaver<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>1.8.7<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-test<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>5.1.6.RELEASE<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.springframework<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>spring-webmvc<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>5.1.6.RELEASE<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>javax.servlet<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>servlet-api<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>2.5<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>

<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.mybatis<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>mybatis-spring<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>2.0.5<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>

<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>com.fasterxml.jackson.core<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>jackson-databind<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>2.9.8<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>

<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>junit<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>junit<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>4.12<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>org.projectlombok<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>lombok<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>1.18.8<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>
<span>&lt;</span><span>dependency</span><span>&gt;</span>
    <span>&lt;</span><span>groupId</span><span>&gt;</span>log4j<span><span>groupId</span><span>&gt;</span>
    <span>&lt;</span><span>artifactId</span><span>&gt;</span>log4j<span><span>artifactId</span><span>&gt;</span>
    <span>&lt;</span><span>version</span><span>&gt;</span>1.2.17<span><span>version</span><span>&gt;</span>
<span><span>dependency</span><span>&gt;</span>

dependencies>
project>
pom.xml

2.数据库创建User表

SSM框架整合SSM框架整合
-- 创建学生表
CREATE TABLE student(
  number VARCHAR(10) UNIQUE,   -- 学号
  NAME VARCHAR(10),            -- 姓名
  birthday DATE,               -- 生日
  address VARCHAR(200)         -- 地址
);
INSERT INTO student VALUES ('hm001','张弢','1995-05-05','北京市昌平区');
INSERT INTO student VALUES ('hm002','少林圣神','1996-06-06','北京市海淀区');
INSERT INTO student VALUES ('hm003','易云','1997-07-07','北京市朝阳区');
INSERT INTO student VALUES ('hm004','易天行','1998-08-08','北京市丰台区');
INSERT INTO student VALUES ('hm005','易继风','1999-09-09','北京市顺义区');
INSERT INTO student VALUES ('hm006','飞龙将军','2000-01-01','北京市西城区');
INSERT INTO student VALUES ('hm007','逍遥王','2001-02-02','北京市延庆区');
INSERT INTO student VALUES ('hm008','张君宝','2002-03-03','北京市东城区');
INSERT INTO student VALUES ('hm009','张启樵','2003-04-04','北京市东城区');

student.sql

二、dao层搭建

使用Mybatis实现dao层,Mybatis的使用流程如下

  • 读取配置mybatis文件为数据流
  • 创建SqlSessionFactory工厂
  • 通过SqlSessionFactory工厂类获取sqlSession对象
  • 通过sqlSession对象的getMapper()方法获取studentMapper对象
  • 执行studentMapper对象的接口方法
  • 提交事务
  • 释放资源

1.Mybatis的外部配置文件(properties)

Mybatis是一个持久层框架,Mybatis的底层还是jdbc;

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:5fe9b0ab-2e8c-4416-8502-5e66fa5bf828

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:c5aebd4e-1d09-4b6a-a084-a0295bf60648

我们通常会把jdbc配置信息单独放到1个properties配置文件,再由Mybatis的主配置文件进行引入;

SSM框架整合SSM框架整合
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.56.18:3306/dbForJava?characterEncoding=utf8
jdbc.username=zhanggen
jdbc.password=123.com

jdbc.properties

2.Mybatis配置文件

SSM框架整合SSM框架整合
<?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>
<span>&lt;</span><span>properties </span><span>resource</span><span>=&quot;jdbc.properties&quot;</span><span>&gt;</span>
<span><span>properties</span><span>&gt;</span>

<span>&lt;</span><span>typeAliases</span><span>&gt;</span>
    <span>&lt;</span><span>package </span><span>name</span><span>=&quot;com.zhanggen.domian&quot;</span><span>&gt;<span>package</span><span>&gt;</span>
<span><span>typeAliases</span><span>&gt;</span>

<span>&lt;</span><span>environments </span><span>default</span><span>=&quot;dev&quot;</span><span>&gt;</span>
    <span>&lt;</span><span>environment </span><span>id</span><span>=&quot;dev&quot;</span><span>&gt;</span>
        <span>&lt;</span><span>transactionManager </span><span>type</span><span>=&quot;JDBC&quot;</span><span>&gt;<span>transactionManager</span><span>&gt;</span>
        <span>&lt;</span><span>dataSource </span><span>type</span><span>=&quot;POOLED&quot;</span><span>&gt;</span>
            <span>&lt;</span><span>property </span><span>name</span><span>=&quot;driver&quot;</span><span> value</span><span>=&quot;${jdbc.driver}&quot;</span><span>/&gt;</span>
            <span>&lt;</span><span>property </span><span>name</span><span>=&quot;url&quot;</span><span> value</span><span>=&quot;${jdbc.url}&quot;</span><span>/&gt;</span>
            <span>&lt;</span><span>property </span><span>name</span><span>=&quot;username&quot;</span><span> value</span><span>=&quot;${jdbc.username}&quot;</span><span>/&gt;</span>
            <span>&lt;</span><span>property </span><span>name</span><span>=&quot;password&quot;</span><span> value</span><span>=&quot;${jdbc.password}&quot;</span><span>/&gt;</span>
        <span><span>dataSource</span><span>&gt;</span>
    <span><span>environment</span><span>&gt;</span>
<span><span>environments</span><span>&gt;</span>

<span>&lt;</span><span>mappers</span><span>&gt;</span>
    <span>&lt;</span><span>package </span><span>name</span><span>=&quot;com.zhanggen.mapper&quot;</span><span>&gt;<span>package</span><span>&gt;</span>
<span><span>mappers</span><span>&gt;</span>

configuration>mybatis-config.xml

3.实体类

SSM框架整合SSM框架整合
package com.zhanggen.domian;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String number;
    private String name;
    private Date birthday;
    private String address;
}

Student.java

4.StudentMapper接口

SSM框架整合SSM框架整合
package com.zhanggen.mapper;

import com.zhanggen.domian.Student;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface StudentMapper {
    //查询所有
    @Select("select * from student")
    List findAll();
}

StudentMapper.interface

5.加入日志配置文件

SSM框架整合SSM框架整合
### 设置###
log4j.rootLogger = debug,stdout

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

log4j.properties

6.测试Mybatis

SSM框架整合SSM框架整合
package com.zhanggen.test;

import com.zhanggen.domian.Student;
import com.zhanggen.mapper.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class StudentMapperTest {
    @Test
    public void testFindAll() throws IOException {
        //1.读取配置mybatis文件为数据流
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //3.创建sqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //4.获取studentMapper对象执行方法
        StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
        //5.提交事务
        List studenList = studentMapper.findAll();
        for (Student student : studenList) {
            System.out.println(student);
        }
        //释放资源
        sqlSession.commit();
        sqlSession.close();

    }
}

StudentMapperTest.java

三、service层搭建

实现service层不需要依赖其他第三方包,但需要借助spring把service实现对象放到spring的容器中;

1.spring配置文件

配置spring容器启动时扫描service层的注解

SSM框架整合SSM框架整合
<?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">
<span>&lt;</span><span>context:component-scan </span><span>base-package</span><span>=&quot;com.zhanggen.service&quot;</span><span>&gt;<span>context:component-scan</span><span>&gt;</span>

beans>applicationContext.xml

2.定义service接口

SSM框架整合SSM框架整合
package com.zhanggen.service;

import com.zhanggen.domian.Student;

import java.util.List;

public interface StudentService {
    //查询所有
    List findAll();
}

StudentService.interface

3.创建接口实现类

SSM框架整合SSM框架整合
package com.zhanggen.service.impl;

import com.zhanggen.domian.Student;
import com.zhanggen.mapper.StudentMapper;
import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service //把当前实现类实例化的对象,放入spring的IOC容器
public class StudentServiceImpl implements StudentService {
//    @Autowired //调用spring的IOC容器中的StudentMapper对象
    //todo 等待StudentMapper对象放入pring的IOC容器中
    private StudentMapper studentMapper;

    public List findAll() {
        //todo 等待StudentMapper对象放入pring的IOC容器中
//        List userList = studentMapper.findAll();
        System.out.println("service中findAll()方法被调用了");
        return null;
    }
}

StudentServiceImpl.java

4.测试service层实现类

SSM框架整合SSM框架整合
package com.zhanggen.test;

import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class StudentServiceTest {
    @Autowired
    private StudentService studentService;

    @Test
    public void testFindAll() throws IOException {
        studentService.findAll();
    }
}

StudentServiceTest.java

四、controller层搭建

使用springMVC实现控制(controller)层;

Tomcat通过web.xml配置文件调用springMVC(控制层);

1.web.xml

Tomcat读取web项目的web.xml配置文件以调用dispatcherServlet;

SSM框架整合SSM框架整合
xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    package="com.zhanggen.controller">

web.xml

2.springMVC配置文件

dispatcher读取springMVC配置文件,实现注解驱动、扫描controller层的注解;

SSM框架整合SSM框架整合
xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    package="com.zhanggen.controller">

spring-mvc.xml

3.配置处理器

dispatcherServlet通过@Mapping(“/student”)注解把http请求路由到处理器;

通过@RestController注解把处理器实现类放到spring的容器中;

SSM框架整合SSM框架整合
package com.zhanggen.controller;

import com.zhanggen.domian.Student;
import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController//@Controller+@ResponseBody
public class UserController {
    //todo 目前springMVC和spring环境还未做整合,不能完成依赖注入
//    @Autowired //从spring的容器中调用studentService对象
    private StudentService studentService;

    @GetMapping("/student")
    public List findAll() {
//        List studentList = studentService.findAll();
        ArrayList studentList = new ArrayList();
        studentList.add(new Student("1", "逍遥王", new Date(), "西域"));
        studentList.add(new Student("2", "易云", new Date(), "名剑山庄"));
        studentList.add(new Student("3", "圣神", new Date(), "少林寺"));
        return studentList;
    }
}

UserController.java

五、 Spring整合Mybatis

将Mybatis的所有配置信息转移到Spring的配置文件中,为创建工厂做准备;

将Mybatis的SqlSessionFactory(工厂)托管到Spring的容器中;

当SqlSessionFactory(工厂)托管到Spring的容器中之后;

org.mybatis.spring.SqlSessionFactoryBean可以实现将SqlSessionFactory(工厂)创建出来的SqlSession对象和所有dao层的mapper全部自动托管到spring容器中;

SSM框架整合

1.spring配置文件修改

修改spring的配置文件,把mybatis的配置转移到spring的配置文件中;

不能直接把Mybatis的配置信息复制到spring的配置中;

在spring的配置文件中有对应的标签可以实现Mybatis的配置;

SSM框架整合SSM框架整合
<?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">
<span>&lt;</span><span>context:component-scan </span><span>base-package</span><span>=&quot;com.zhanggen.service&quot;</span><span>&gt;<span>context:component-scan</span><span>&gt;</span>

<span>&lt;</span><span>context:property-placeholder </span><span>location</span><span>=&quot;classpath:jdbc.properties&quot;</span><span>/&gt;</span>

<span>&lt;</span><span>bean </span><span>id</span><span>=&quot;dataSource&quot;</span><span> class</span><span>=&quot;com.alibaba.druid.pool.DruidDataSource&quot;</span><span>&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;driverClassName&quot;</span><span> value</span><span>=&quot;${jdbc.driver}&quot;</span><span>/&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;url&quot;</span><span> value</span><span>=&quot;${jdbc.url}&quot;</span><span>/&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;username&quot;</span><span> value</span><span>=&quot;${jdbc.username}&quot;</span><span>/&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;password&quot;</span><span> value</span><span>=&quot;${jdbc.password}&quot;</span><span>/&gt;</span>
<span><span>bean</span><span>&gt;</span>

<span>&lt;</span><span>bean </span><span>id</span><span>=&quot;transactionManager&quot;</span><span> class</span><span>=&quot;org.springframework.jdbc.datasource.DataSourceTransactionManager&quot;</span><span>&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;dataSource&quot;</span><span> ref</span><span>=&quot;dataSource&quot;</span><span>/&gt;</span>
<span><span>bean</span><span>&gt;</span>

<span>&lt;</span><span>bean </span><span>id</span><span>=&quot;configurer&quot;</span><span> class</span><span>=&quot;org.mybatis.spring.mapper.MapperScannerConfigurer&quot;</span><span>&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;basePackage&quot;</span><span> value</span><span>=&quot;com.zhanggen.mapper&quot;</span><span>/&gt;</span>
<span><span>bean</span><span>&gt;</span>

<span>&lt;</span><span>bean </span><span>id</span><span>=&quot;sessionFactory&quot;</span><span> class</span><span>=&quot;org.mybatis.spring.SqlSessionFactoryBean&quot;</span><span>&gt;</span>
    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;dataSource&quot;</span><span> ref</span><span>=&quot;dataSource&quot;</span><span>/&gt;</span>

    <span>&lt;</span><span>property </span><span>name</span><span>=&quot;typeAliasesPackage&quot;</span><span> value</span><span>=&quot;com.zhanggen.domian&quot;</span><span>/&gt;</span>

<span><span>bean</span><span>&gt;</span>

beans>applicationContext.xml

2.service层注入mapper对象

如果service层的实现类对象想要调用dao层Mybatis创建出来的mapper对象,需要先把自己托管到spring容器中;

在service层的实现类对象中注入mapper对象以实现service调用dao层的目的;

SSM框架整合SSM框架整合
package com.zhanggen.service.impl;

import com.zhanggen.domian.Student;
import com.zhanggen.mapper.StudentMapper;
import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service //把当前Service层实现类实例化的对象,放入spring的IOC容器
public class StudentServiceImpl implements StudentService {
    @Autowired //调用spring的IOC容器中的StudentMapper对象
    private StudentMapper studentMapper;

    public List findAll() {
        List userList = studentMapper.findAll();
        System.out.println(userList);
        return userList;
    }
}

StudentServiceImpl

3.测试service层

加载spring的修改完毕的applicationContext.xml配置文件,通过service层调用dao层Mybatis;

SSM框架整合SSM框架整合
package com.zhanggen.test;

import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class StudentServiceTest {
    @Autowired
    private StudentService studentService;

    @Test
    public void testFindAll() throws IOException {
        studentService.findAll();
    }
}

StudentServiceImpl.java

六、 Spring整合SpringMVC

Spring是根容器,SpringMVC是其子容器,所以Spring和SpringMVC本身就已经整合完毕,现在的问题是当Tomcat启动时,Spring容器自己无法启动;

启动Spring容器的工作可交给ContextLoaderListener监听器;

SSM框架整合

1.ContextLoaderListener监听器

在web.xml配置文件中配置1个ContextLoaderListener监听器,

ContextLoaderListener的作用就是当Tomcat启动时,通过监听器,自动装配ApplicationContext的配置信息,启动spring容器;

    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:applicationContext.xmlparam-value>
    context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

2.controller中注入service对象

SSM框架整合SSM框架整合
package com.zhanggen.controller;

import com.zhanggen.domian.Student;
import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController//@Controller+@ResponseBody
public class UserController {
    @Autowired //从spring的容器中调用studentService对象
    private StudentService studentService;

    @GetMapping("/student")
    public List findAll() {
        List studentList = studentService.findAll();
//        ArrayList studentList = new ArrayList();
//        studentList.add(new Student("1", "逍遥王", new Date(), "西域"));
//        studentList.add(new Student("2", "易云", new Date(), "名剑山庄"));
//        studentList.add(new Student("3", "圣神", new Date(), "少林寺"));
        return studentList;
    }
}

UserController.java

3.设置Json转换格式

SSM框架整合SSM框架整合
package com.zhanggen.domian;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String number;
    private String name;
    //通过 @JsonFormat注解指定json转换规则
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;
    private String address;
}

Student.java

4.测试

重启Tomcat,通过URL访问C ontroller层;

七、增删改查案例

以上已经整合了SSM框架,以下该使用该框架进行开发;

1.SpringMVC 释放静态资源

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:7a248492-d7f2-4b66-9a2b-e4e8709ea652

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:76c69f31-0155-4a2c-a755-96e2c293ed05

SSM框架整合SSM框架整合
    <mvc:resources mapping="/index.html" location="/"/>
    <mvc:resources mapping="/css/" location="/css/"/>
    <mvc:resources mapping="/js/" location="/js/"/>
    <mvc:resources mapping="/fonts/" location="/fonts/"/>
    <mvc:resources mapping="/img/" location="/img/"/>
    <mvc:resources mapping="/js/*" location="/js/"/>

spring-mvc.xml

2.前后端交互对象引入(View Object)

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:f17bbfc4-2493-473e-95d3-d57553621c67

[En]

[TencentCloudSDKException] code:FailedOperation.ServiceIsolate message:service is stopped due to arrears, please recharge your account in Tencent Cloud requestId:9b7b62ac-ecc9-41a8-babe-9fca566e150e

SSM框架整合SSM框架整合
package com.zhanggen.vo;

import lombok.Data;

import java.io.Serializable;

//表示层对象:View Object,通用返回结果,服务端响应的数据最终都会封装成此对象
@Data
public class ResultInfo implements Serializable {
    private Integer code; //编码:1成功,0和其它数字为失败
    private String msg; //错误信息
    private Object data; //数据

    //成功结果
    public static ResultInfo success(Object object) {
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.data = object;
        resultInfo.code = 1;
        return resultInfo;
    }

    //失败结果
    public static ResultInfo error(String msg) {
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.msg = msg;
        resultInfo.code = 0;
        return resultInfo;
    }
}

ResultInfo.java

3.Controller控制层

SSM框架整合SSM框架整合
package com.zhanggen.controller;

import com.zhanggen.domian.Student;
import com.zhanggen.service.StudentService;
import com.zhanggen.vo.ResultInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@RestController//@Controller+@ResponseBody
public class UserController {
    @Autowired //从spring的容器中调用studentService对象
    private StudentService studentService;

    @GetMapping("/student")
    public ResultInfo findAll() {
        List studentList = studentService.findAll();
        return ResultInfo.success(studentList);
    }
    //保存
    @PostMapping("/student")
    public ResultInfo save(@RequestBody Student student ) {
        studentService.save(student);
        return ResultInfo.success(null);
    }
    //根据主键查询
    @GetMapping("/student/{number}")
    public ResultInfo findById(@PathVariable String number) {
        Student student=studentService.findById(number);
        System.out.println(number);
        return ResultInfo.success(student);
    }
    //根据主键修改
    @PutMapping("/student")
    public ResultInfo update(@RequestBody Student student) {
        //调用service修改
        studentService.update(student);
        //返回结果
        return ResultInfo.success(null);
    }
    //根据主键删除
    @DeleteMapping("/student/{number}")
    public ResultInfo delete(@PathVariable String number) {
        //调用service修改
        studentService.delete(number);
        //返回结果
        return ResultInfo.success(null);
    }

}

UserController.java

4.service服务层

4.1.接口

SSM框架整合SSM框架整合
package com.zhanggen.service;

import com.zhanggen.domian.Student;

import java.util.List;

public interface StudentService {
    //查询所有
    List findAll();

    //新增
    void save(Student student);

    //根据number主键查询
    Student findById(String number);

    //根据number主键修改
    void update(Student student);

    //根据number主键删除
    void delete(String number);
}

StudentService.interface

4.2.实现类

SSM框架整合SSM框架整合
package com.zhanggen.service.impl;

import com.zhanggen.domian.Student;
import com.zhanggen.mapper.StudentMapper;
import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service //把当前Service层实现类实例化的对象,放入spring的IOC容器
@Transactional
public class StudentServiceImpl implements StudentService {
    @Autowired //调用spring的IOC容器中的StudentMapper对象
    private StudentMapper studentMapper;

    //查询所有
    public List findAll() {
        List userList = studentMapper.findAll();
        return userList;
    }

    //保存
    public void save(Student student) {
        studentMapper.save(student);
        //测试声明式事务和springMVC的统一异常处理
        // int i=1/0;
    }

    //根据主键查询
    public Student findById(String number) {
        return studentMapper.findById(number);
    }

    //根据主键修改
    public void update(Student student) {
        studentMapper.update(student);
    }
    //根据主键删除
    public void delete(String number) {
        studentMapper.delete(number);

    }
}

StudentServiceImpl.java

5.dao/mapper层

使用Mybatis实现dao层不需要定义实现类,因为Mybatis会根据你定义的接口,自动创建该结构的实现类对象(mapper对象);

SSM框架整合SSM框架整合
package com.zhanggen.mapper;

import com.zhanggen.domian.Student;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

public interface StudentMapper {
    //查询所有
    @Select("select * from student")
    List findAll();

    //保存
    @Insert("insert into student values(#{number},#{name},#{birthday},#{address})")
    void save(Student student);

    //编辑时-根据主键查询
    @Select("select * from student where number=#{number}")
    Student findById(String number);

    //编辑时-修改
    @Update("update student set name = #{name},birthday = #{birthday},address = #{address} where number = #{number}")
    void update(Student student);

    //根据注解删除
    @Delete("delete from student where number = #{number}")
    void delete(String number);
}

StudentMapper.interface

八、添加声明式事务

使用事务管理器,保证项目中1组SQL操作出现异常时,可以进行事务回滚;

1.Spring配置事务注解驱动

SSM框架整合SSM框架整合
    <tx:annotation-driven transaction-manager="transactionManager"/>

applicationContext.xml

2.service层增加事务

给service层实现类上增加@Transactional注解

@Service //把当前Service层实现类实例化的对象,放入spring的IOC容器
@Transactional
public class StudentServiceImpl implements StudentService {

九、SpringMvc统一异常处理

SpringMvc的统一异常处理功能:可以保证后台出错情况下和正常情况下, 响应给前端的数据格式是一致的;

1.spring配置注解扫描

SSM框架整合SSM框架整合
    <context:component-scan base-package="com.zhanggen.handler">context:component-scan>

applicationContext.xml

2.定义异常处理类

SSM框架整合SSM框架整合
package com.zhanggen.handler;

import com.zhanggen.vo.ResultInfo;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice //该注解可以声明当前类是一个用于统一处理3层异常的类
@ResponseBody
public class CommonExceptionHandler {
    @ExceptionHandler(Exception.class)  //标注该方法可以处理哪些类型的异常
    public ResultInfo handleAllException(Exception e) {
        //记录错误日志
        e.printStackTrace();
        //给前端提示
        return ResultInfo.error("后端异常");
    }
}

CommonExceptionHandler.java

十、 注解扫描配置

Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器

子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean;

为了保证应该放到spring容器中bean放到spring的容器中,应该放到SpringMVC容器中bean放到SpringMVC的容器中;

Spring官方建议spring的配置文件(applicationContext.xml)配置如下:

    <context:component-scan base-package="com.zhanggen">

        <context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/>
    context:component-scan>

通过排除对Controller层的扫描,避免Controller层注解产生的bean放到Spring的容器中,造成事务失效;

Original: https://www.cnblogs.com/sss4/p/16301437.html
Author: Martin8866
Title: SSM框架整合

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/562603/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球