ssm(spring + spring-mvc + mybatis)整合

思路

ssm => spring + spring-mvc + mybatis

其实就是先用spring 代理mybatis对象,然后spring-mvc在整合上面的,这里给出一个小案例,基本上能将大部分内容穿起来,分几个阶段

  1. 配置mybatis
  2. 添加spring配置
  3. 添加spring-mvc配置

1,建库建表

2,基本环境搭建 (搭建mybatis环境)

先创建一个maven的web环境

2.1,pom.xml

<?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>org.example</groupId>
    <artifactId>spring001</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 创建web环境 -->
<packaging>war</packaging>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <!--
    MySQL Jar包;
        mysql-connector-java

    Druid相关Jar包;
        druid

    MyBatis相关Jar包;
        mybatis
        mybatis-spring

    Spring相关Jar包;
        spring-context
        spring-test
        spring-jdbc
        spring-tx

    SpringMVC相关Jar包;
        spring-web
        spring-webmvc
        javax.servlet-api
        javax.servlet.jsp-api  11111


    MyBatis分页插件相关Jar包;

    JSON处理相关Jar包;
        jackson-core
        jackson-databind
        jackson-annotations

    JSTL相关Jar包。
        jstl

    其他
        junit
        commons-logging
        slf4j-log4j12
        log4j
    -->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.5</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>
        <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>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
    </dependencies>

    <!--    配置java目录下的xml文件为资源文件,让Maven能够识别,从而进行编译-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>

</project>

2.2 创建包结构

  1. com.edu.user.bean : 用来存放实体类
  2. com.edu.user.mapper:用来存放mapper接口及接口映射文件 -> dao层
  3. com.edu.user.service:用来存放Service层相关类(
  4. com.edu.user.controller:用来存放SpringMVC中的控制器;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A0I9NVf1-1634195043515)(asset/img/06_ssm/image-20211013215350084.png)]

2.3,创建 jdbc.properties

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

2.4,创建 log4j.properties

#
# Hibernate, Relational Persistence for Idiomatic Java
#
# License: GNU Lesser General Public License (LGPL), version 2.1 or later.
# See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
#

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

2.5,创建 mybatis-config.xml

使用spring的方式创建

<?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:jdbc.properties"/>

    <!-- 配置数据园 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!-- 配置sqlSessionFactoryBean
            配置数据源
            配置别名
    -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.edu.*.bean"/>
    </bean>

    <!-- 配置包扫描(加载映射文件)-->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--
                basePackage 属性是让你为 映射器接口文件 设置基本的包路径。 你可以使用分号或逗号 作为分隔符设置多于一个的包路径。每个映射器将会在指定的包路径中递归地被搜索到。
                注意:
                    1、接口与映射文件一定要同名
                    2、接口与映射文件一定要放在"value=" 其中之一的所在目录下(不一定同一个包下 )
            -->
        <property name="basePackage" value="com.edu.*.mapper"/>
    </bean>

</beans>

2.6,创建 applicationContext.xml

applicationContext.xml,这里是配置spring的地方,和mybatis环境隔开

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

    <!-- 导入配置文件 -->
    <import resource="classpath:mybatis-config.xml"/>
</beans>

2.7,测试

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BktRj4RE-1634195043518)(asset/img/06_ssm/image-20211014115504243.png)]

2.7.1 创建实体类

package com.edu.user.bean;
import lombok.Data;
@Data
public class User {
   private Integer  id;
   private String username;
   private String password;

}

2.7.2 创建接口和映射文件

package com.edu.user.mapper;
import com.edu.user.bean.User;
import java.util.List;
public interface UserMapper {
    List<User> all();
}
<?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.edu.user.mapper.UserMapper">
    <select id="all" resultType="com.edu.user.bean.User">
        select  * from user
    </select>
</mapper>

2.7.3 创建测试类

第一种测试类写法

public class MyTest1 {
     // mybatis常规使用 -> 测试mapper接口
    @Test
    public void mybatis1() throws IOException {
        // 这两行代码的作用是获取Spring IOC容器,如果不写的话,直接会提示空指针异常。对于测试不友好。所以我们一般使用第二种方式
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        SqlSessionFactory sqlSessionFactory =(SqlSessionFactory) context.getBean("sqlSessionFactory");

        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> all = mapper.all();
        all.forEach(v -> System.out.println("\033[1;34m" + v + "\033[1;34m \n"));
    }
}

第二种测试类写法 -> 注入方式 以后都使用这种方式

/*
@RunWith 就是一个运行器
@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
使用@ContextConfiguration或@SpringJUnitConfig指定配置文件或配置类
*/
@RunWith(SpringJUnit4ClassRunner.class)
//@SpringJUnitConfig(locations = "classpath:applicationContext.xml")
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class MyTest {
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    /*
        使用注入的方法  注意导入相关的jar包
            1,使用@Runwith替换原来的运行时
            2,使用@ContextConfiguration或@SpringJUnitConfig指定配置文件或配置类
            3,使用@Autowired注入需要测试的对象  => (SqlSessionFactory) context.getBean("sqlSessionFactory");
    * */
    @Test
    public void mybatis2() throws IOException {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> all = mapper.all();
        all.forEach(v -> System.out.println("\033[1;34m" + v + "\033[1;34m \n"));
    }
}

3,将spring配置整合到mybatis

3.1,添加 applicationContext.xml 配置

applicationContext.xml 中添加配置,至此 spring 已经配置完成

<!-- 配置包扫描 -->
<!--    这个文件中beans根节点下只有一个context:component-scan节点,此节点有两个属性base-package属性告诉spring要扫描的包,多个包逗号隔开。-->
<!--    use-default-filters=”false”表示不要使用默认的过滤器,此处的默认过滤器,会扫描包含@Service,@Component,@Repository,@Controller注解修饰的类,并注册成bean-->
<!--
    @Component 使用在类上用于实例化Bean
    @Repository 使用在Dao层类上用于实例化Bean
    @Service 使用在Service层类上用于实例化Bean
    @Controller 使用在Web层类上用于实例化Bean
-->
<!--    在注解后加上例如@Component(value=”abc”)时,注册的这个类的bean的id就是adc.-->
<context:component-scan base-package="com.edu" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <!--  排除扫描controoler 因为springmvc会扫描  -->
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

3.2,测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvuM96oy-1634195043521)(asset/img/06_ssm/image-20211014142703478.png)]

3.2.1,创建service层类和接口

package com.edu.user.service;

public interface UserService {
    List<User> all();
}
package com.edu.user.service.impl;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public List<User> all() {
        return userMapper.all();
    }
}

3.2.2,添加测试类方法

在 2.7.3 第二种方法的基础上进行测试

@Autowired
private UserService userService;
@Test
public void test2() {
    List<User> all = userService.all();
    System.out.println("\033[1;34m" + all + "\033[1;34m \n");
}

至此,spring配置完成

4,spring-mvc整合

4.1,创建 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"
       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
">

    <!-- 包扫描-加载controller注解 -->
    <context:component-scan base-package="com.edu" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 视图解析- 给视图添加前后缀 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"/>
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

4.2,添加 web.xml 配置

配置SpringMVC核心控制器DispatcherServlet

它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求

<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
         version="4.0">
    <!-- 配置SpringMVC核心控制器,其本质上就是一个Servlet -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <!-- 配置SpringMVC配置文件使SpringMVC核心控制器能够加载 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- tomcat启动就加载 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

4.3,测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTnN7kNp-1634195043525)(asset/img/06_ssm/image-20211014145723768.png)]

4.3.1,创建控制器类

package com.edu.user.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

//指定这是一个控制器类
@Controller
//指定这个控制器的地址
@RequestMapping("/user")
public class UserController {
    /**
     * 在访问时要使用类上的RequestMapping中的路径和方法上的RequestMapping中的路径才能访问到该方法
     * 如果在视图解析器中没有配置前缀和后缀,文件的路径和后缀不能省略
     * 默认以转发的方式访问视图
     * @return 视图的位置
     */
    @RequestMapping("/hello")
    public String hello() {
        return "success";
    }
}

4.3.2,创建success.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
    <p>success</p>
</body>
</html>

4.3.3,测试

直接运行该项目,项目启动后访问 http://localhost:8080/项目名/user/hello,如果正常显示页面,则说明正常

posted @ 2022-04-02 09:46  coderwcb  阅读(34)  评论(0编辑  收藏  举报