SSM整合笔记

第 1 节 整合策略

SSM = Spring + SpringMVC + Mybatis = (Spring + Mybatis)+ SpringMVC

先整合 Spring + Mybatis

然后再整合 SpringMVC

基于的需求:查询 Account 表的全部数据显示到⻚⾯

第 2 节 代码结构

image-20210408103951700

第 3 节 Mybatis整合Spring

3.1 整合⽬标

数据库连接池以及事务管理都交给Spring容器来完成

SqlSessionFactory对象应该放到Spring容器中作为单例对象管理

Mapper动态代理对象交给Spring管理,我们从Spring容器中直接获得Mapper的代理对象

整合所需 Jar 分析

Junit测试jar(4.12版本)

Mybatis的jar(3.4.5)

Spring相关jar(spring-context、spring-test、spring-jdbc、spring-tx、spring-aop、

aspectjweaver)

Mybatis/Spring整合包jar(mybatis-spring-xx.jar)

Mysql数据库驱动jar

Druid数据库连接池的jar

3.2 具体代码
3.2.1 依赖pom.xml(spring mvc的依赖也一起放进去了)
<?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.0</modelVersion>

  <groupId>com.lagou.edu</groupId>
  <artifactId>ssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>ssm Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>

  <dependencies>
    <!--junit-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <!--mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.5</version>
    </dependency>
    <!--spring相关-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.9</version>
    </dependency>
    <!--mybatis与spring的整合包-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.3</version>
    </dependency>
    <!--数据库驱动jar-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
    <!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.21</version>
    </dependency>


    <!--SpringMVC-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.12.RELEASE</version>
    </dependency>
    <!--jsp-api&servlet-api-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!--页面使用jstl表达式-->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

    <!--json数据交互所需jar,start,不然无法返回前台list转为json格式数据-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
    <!--json数据交互所需jar,end-->
  </dependencies>

  <build>
    <plugins>
      <!--tomcat插件-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port>
          <path>/</path>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

3.2.2 基本业务代码

mapper


/**
 * @author lane
 * @date 2021年04月07日 下午3:09
 */
public interface AccountMapper {
    /**
     * 查询所有账户信息
     * @author lane
     * @date 2021/4/7 下午3:11
     * @return java.util.List<com.lagou.edu.pojo.Account>
     */
    public List<Account> queryAccountList() throws Exception;

}

pojo

package com.lagou.edu.pojo;

/**
 * @author lane
 * @date 2021年04月07日 下午3:09
 */
public class Account {
    private String name;
    private String cardNo;
    private Integer money;

    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", cardNo='" + cardNo + '\'' +
                ", money=" + money +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCardNo() {
        return cardNo;
    }

    public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
    }

    public Integer getMoney() {
        return money;
    }

    public void setMoney(Integer money) {
        this.money = money;
    }
}

service

package com.lagou.edu.service;

import com.lagou.edu.pojo.Account;

import java.util.List;

/**
 * @author lane
 * @date 2021年04月07日 下午3:17
 */
public interface AccountService {

    /**
     * 查询所有账户信息
     * @author lane
     * @date 2021/4/7 下午3:11
     * @return java.util.List<com.lagou.edu.pojo.Account>
     */
    public List<Account> queryAccountList() throws Exception;

}

impl

package com.lagou.edu.service.impl;

import com.lagou.edu.mapper.AccountMapper;
import com.lagou.edu.pojo.Account;
import com.lagou.edu.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author lane
 * @date 2021年04月07日 下午3:18
 */
@Service
@Transactional
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountMapper accountMapper;
    @Override
    public List<Account> queryAccountList() throws Exception {
        return accountMapper.queryAccountList();
    }
}

3.2.3 配置文件代码

mapper.xml

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lagou.edu.mapper.AccountMapper">
    <select id="queryAccountList" resultType="com.lagou.edu.pojo.Account">
        select * from account
    </select>
</mapper>

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///bank?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

sql

-- ----------------------------
-- Table structure for account
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
  `name` varchar(255) DEFAULT NULL,
  `money` int(255) NOT NULL COMMENT '金额',
  `cardNo` varchar(255) NOT NULL,
  PRIMARY KEY (`cardNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of account
-- ----------------------------
BEGIN;
INSERT INTO `account` VALUES ('李大雷', 7400, '6029621011000');
INSERT INTO `account` VALUES ('韩梅梅', 12600, '6029621011001');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

applicationContext.xml

<?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"
       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
">
    <!--包扫描,controller扫描必须写在springmvc配置文件中-->
    <context:component-scan base-package="com.lagou.edu"/>

    <!--数据库连接池以及事务管理都交给Spring容器来完成-->

    <!--引入外部资源文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!--第三方jar中的bean定义在xml中-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
    <!--SqlSessionFactory对象应该放到Spring容器中作为单例对象管理

      原来mybaits中sqlSessionFactory的构建是需要素材的:SqlMapConfig.xml中的内容
  -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--别名映射扫描-->
        <property name="typeAliasesPackage" value="com.lagou.edu.pojo"/>
        <!--数据源dataSource-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--Mapper动态代理对象交给Spring管理,我们从Spring容器中直接获得Mapper的代理对象-->
    <!--扫描mapper接口,生成代理对象,生成的代理对象会存储在ioc容器中-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--mapper接口包路径配置-->
        <property name="basePackage" value="com.lagou.edu.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>
    <!--事务管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--事务管理注解驱动-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
3.2.4 测试代码

MybatisSpringTest

package ms;

import com.lagou.edu.mapper.AccountMapper;
import com.lagou.edu.pojo.Account;
import com.lagou.edu.service.AccountService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;

/**
 * @author lane
 * @date 2021年04月07日 下午4:37
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class MybatisSpringTest {
    @Autowired
    private AccountService accountService;

    @Test
    public void test01() throws Exception {
        List<Account> accounts = accountService.queryAccountList();
        for (int i = 0; i < accounts.size(); i++) {
            Account account =  accounts.get(i);
            System.out.println(account);

        }

    }
}

测试结果

Account{name='李大雷', cardNo='6029621011000', money=7400}
Account{name='韩梅梅', cardNo='6029621011001', money=12600}

第 4 节 再整合Spring MVC

4.1 整合策略

只需要把Spring mvc的基本内容放进来就可以了,依赖、cotroller和配置文件springmvc.xml、web.xml以及前台jsp页面

4.2 具体代码
4.2.1 基本依赖

3.2.1 已经放进去了,不需要再放了

4.2.2 基本代码

controller

package com.lagou.edu.controller;


import com.lagou.edu.pojo.Account;
import com.lagou.edu.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author lane
 * @date 2021年04月07日 下午6:16
 */
@Controller
@RequestMapping("/account")
public class AccountController {
    /**
     *  spring容器和Springmvc容器是有层次的俗称父子容器
     *  Spring容器父子service+dao层
     *  spring mvc 容器负责controller层 其内部有一个Spring容器的引用
     *
     */
		
    @Autowired
    private AccountService accountService;
		 /**
     * 不引入json的jar会500 list无法自动转换json
     * 这个返回是空白页面打印内容
     * @author lane
     * @date 2021/4/7
     * @return java.util.List<com.lagou.edu.pojo.Account>
     */
    @RequestMapping("/queryAll")
    @ResponseBody
    public List<Account> queryAll() throws Exception {

        List<Account> accountList = accountService.queryAccountList();
        return accountList;

    }
	
    @RequestMapping(value = "/queryTest",method = RequestMethod.GET)
    public ModelAndView queryTest(ModelAndView modelAndView) throws Exception {

        modelAndView.addObject("date",new Date());
        modelAndView.setViewName("success");

        return modelAndView;

    }
    /**
     * ajax传类型为json对象,content type 为www-form,返回值不是json就不要写dataType:json
     * @author lane
     * @date 2021/4/7 下午7:28
     * @param id
     * @param username
     * @return java.lang.String
     */
    @RequestMapping(value = "/queryTest1",method = RequestMethod.POST)
    @ResponseBody
    public String queryTest1(Integer id, String username) {

        String str = id + username;
        System.out.println(str);

        return str;


    }
    /**
     * ajax传递类型为json字符串content type 为json 必须加@RequestBody
     * @author lane
     * @date 2021/4/7 下午7:29
     * @param str
     * @return java.lang.String
     */
    @RequestMapping(value = "/queryTest2",method = RequestMethod.POST)
    @ResponseBody
    public String queryTest2(@RequestBody String str)  {
        System.out.println(str);

        return str;

    }

}

4.2.3 前端代码

jsp

<%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC 测试页</title>
    <script type="text/javascript" src="/js/jquery.min.js"></script>
    <style>
        div{
            padding:10px 10px 0 10px;
        }
    </style>
</head>
<body>
<div>跳转成功!服务器时间:${date}</div>
<div>
    <h3>ajax json交互</h3>
    <fieldset>
        <input type="button" id="ajaxbtn2" value="ajax提交对象"/>
    </fieldset>
</div>
<div>
    <h3>ajax json交互</h3>
    <fieldset>
        <input type="button" id="ajaxbtn3" value="ajax提交json字符串"/>
    </fieldset>
</div>

</body>
<script>
    jQuery(function () {
        $("#ajaxbtn2").bind("click",function () {
            $.ajax({
                url:'/account/queryTest1',
                type:'POST',
                data:{"id":1,"username":"lisi"},
               // dataType: 'json',//指定返回数据类型为json
                success:function (data) {

                    alert(data);
                //    var jsonStr = JSON.stringify(data);       //转为JSON字符串
                //    console.log(jsonStr);
                //    alert(jsonStr);
                },
                error:function () {
                    alert("error")

                }
            })
        })
    })

    jQuery(function () {
        $("#ajaxbtn3").bind("click",function () {

            $.ajax({
                url:'/account/queryTest2',
                type:'POST',
                data:'{"id":"2","username":"zhangsan"}',
                contentType:'application/json;charset=utf-8',//指定发送数据类型
                dataType: 'json',//指定返回数据类型为json
                success:function (data) {
                    alert(data.username);
                }
            })

        });
    })
</script>
</html>

4.2.4 配置文件

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/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

">
    <!--注解扫描controller,必须要写在springmvc.xml中,只在Spring的xml中写不可以-->
    <context:component-scan base-package="com.lagou.edu.controller"/>
    <!--注册合适的处理器映射器和处理器适配器-->
    <mvc:annotation-driven/>
    <!--配置springmvc视图解析器-->
    <bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!--方案二 解决静态资源访问问题,spring mvc自己去处理-->
    <!--原理 mapping:静态资源约定url规则
            location:静态资源存放的位置
            也可以指定多个路径 mapping="/,/resourcess/**"-->
<!--    <mvc:resources mapping="/resources/**" location="classpath:/"/>-->
    <mvc:resources mapping="/js/*" location="/WEB-INF/js/"/>
</beans>

Web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

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

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

  <!--配置Springmvc启动的servlet-->
  <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>

  <!--springmvc提供的针对post请求的编码过滤器-->
  <filter>
    <filter-name>encoding</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>encoding</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

4.2.5 测试结果
[{"name":"李大雷","cardNo":"6029621011000","money":7400},{"name":"韩梅梅","cardNo":"6029621011001","money":12600}]

总结

整合与原先单独的myBatis、Spring、Spring MVC 还是有些不同的,首先是前两者整合要注意的是

  1. 引入两者的整合jar mybatis-spring,以前是Spring去维护的叫spring-mybatis,现在Spring家族太庞大了让mybatis维护
  2. SqlSessionFactory对象应该放到Spring容器中作为单例对象管理
  3. 扫描mapper接口,生成代理对象,生成的代理对象存储在ioc容器中
  4. 事务管理也是有spring去管理
  5. Mapper.xml位置要与接口对应,名字也应该相同
  6. Spring容器 service+dao层,spring mvc 容器负责controller层 其内部有一个Spring容器的引用
  7. controller扫描必须交给spring mvc来,不然会404
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值