Loading

1 2

SSM框架整合

SSM框架整合

2021-11-23_111429
  • Spring MVC 负责实现 MVC 设计模式

  • MyBatis 负责数据持久层

  • Spring负责管理SpringMVC和MyBatis所用到的相关对象的创建和依赖注入

    SSM框架整合,实际上是Spring与MyBatis的整合,因为SpringMVC是Spring的一个子模块

1.1 整合环境

  • IDEA 2021.2.3 Ultimate Edition
  • MySQL 8.0.26
  • Tomcat 10.0.11
  • Maven 3.8.3

1.2 基础环境搭建

  • 创建maven工程
  • 引入项目依赖的jar包
  • 引入bootstrap前端框架

1.3 配置文件*

  • 第一步:pom.xml 引入依赖jar包

        <dependencies>
            <!-- SpringMVC -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.2.18.RELEASE</version>
            </dependency>
    
            <!-- Spring JDBC 事务控制 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.2.18.RELEASE</version>
            </dependency>
    
            <!-- Spring AOP 面向切面编程 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>5.2.18.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>5.2.18.RELEASE</version>
            </dependency>
    
            <!-- Spring TestContext 用于注解导入Spring全局配置文件-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.2.18.RELEASE</version>
            </dependency>
    
            <!-- MyBatis -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.5.7</version>
            </dependency>
    
            <!-- MBG MyBatis逆向工程 -->
            <dependency>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-core</artifactId>
                <version>1.3.7</version>
            </dependency>
    
            <!-- MyBatis整合Spring的适配包 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis-spring</artifactId>
                <version>1.3.1</version>
            </dependency>
    
            <!-- MySQL驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.26</version>
            </dependency>
    
            <!-- 数据库连接池 Druid -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.2.6</version>
            </dependency>
    
            <!-- PageHelper 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper</artifactId>
                <version>5.3.0</version>
            </dependency>
    
            <!-- JSTL:JSP标签库-->
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
    
            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.20</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- 日志 -->
            <!-- 注意log4j与slf4j的版本兼容问题 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.30</version>
            </dependency>
    
            <!-- Junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.1</version>
                <scope>compile</scope>
            </dependency>
    
            <!-- JSP -->
            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.2</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- servlet -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- Spring5和Thymeleaf整合包 -->
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring5</artifactId>
                <version>3.0.12.RELEASE</version>
            </dependency>
    
            <!-- Jackson 处理Json数据 -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.13.0</version>
            </dependency>
    
        </dependencies>
    
  • 第二步:WEB-INF文件夹下,web.xml 配置拦截器拦截浏览器请求

    • 启动spring容器,加载spring全局配置文件
    • 配置SpringMVC前端控制器DispatcherServlet,对浏览器发送的请求进行统一处理,指定springMVC配置文件的地址
    • 字符编码过滤器
    • 配置HiddenHttpMethodFilter,过滤请求方式
    <?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">
        <!--1、启动 Spring 容器-->
        <!--
          配置ContextLoaderListener, 加载Spring父容器 (父类的initWebApplicationContext()方法中)
          可以从ServletContext中根据 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 这个key来找到Spring容器
        -->
        <context-param>
          <!-- 指定Spring配置文件位置 -->
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springApplicationConfig.xml</param-value>
        </context-param>
        <!-- 该监听器将根据contextConfigLocation参数加载Spring配置文件, 初始化Spring应用上下文 -->
        <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
      <!-- 2、配置SpringMVC的前端控制器 DispatcherServlet,对浏览器发送的请求统一进行处理 -->
      <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 通过初始化参数指定SpringMVC配置文件的位置和名称 -->
        <init-param>
          <!-- contextConfigLocation为固定值 -->
          <param-name>contextConfigLocation</param-name>
          <!-- 使用classpath:表示从类路径查找配置文件,例如maven工程中的src/main/resources -->
          <param-value>classpath:springMVC.xml</param-value>
        </init-param>
    
        <!--
            作为框架的核心组件,在启动过程中有大量的初始化操作要做
            而这些操作放在第一次请求时才执行会严重影响访问速度
            因此需要通过此标签将启动控制DispatcherServlet的初始化时间提前到服务器启动时
        -->
        <load-on-startup>1</load-on-startup>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--
            设置springMVC的核心控制器所能处理的请求的请求路径
            / 所匹配的请求可以是/login或.html或.js或.css方式的请求路径
            但是 / 不能匹配.jsp请求路径的请求
        -->
        <url-pattern>/</url-pattern>  <!-- 注意,只有一个 /  -->
      </servlet-mapping>
    
      <!--3、配置springMVC的字符编码过滤器,防止乱码;字符编码过滤器,一定要放在所有过滤器前面-->
      <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>
        <!--  注意这里设置必须两个参数为true,可查看源码  -->
        <init-param>
          <param-name>forceResponseEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>forceRequestEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern> <!-- /* 是包含所有请求,/ 是不包括.jsp的请求 -->
      </filter-mapping>
    
      <!-- 4、使用Rest风格的URI,将页面普通的post请求转换为指定的delete或者put请求 -->
      <!--配置HiddenHttpMethodFilter,过滤请求方式,将POST请求转换为PUT、DELETE请求-->
      <filter>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>HiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern> <!-- 过滤所有请求 -->
      </filter-mapping>
    
      <!-- 加载静态资源的另一种方式 -->
    <!--  <servlet-mapping>-->
    <!--    <servlet-name>default</servlet-name>-->
    <!--    <url-pattern>*.js</url-pattern>-->
    <!--  </servlet-mapping>-->
    <!--  <servlet-mapping>-->
    <!--    <servlet-name>default</servlet-name>-->
    <!--    <url-pattern>*.css</url-pattern>-->
    <!--  </servlet-mapping>-->
    <!--  <servlet-mapping>-->
    <!--    <servlet-name>default</servlet-name>-->
    <!--    <url-pattern>*.jpg</url-pattern>-->
    <!--  </servlet-mapping>-->
    </web-app>
    
  • 第三步:resources资源目录下,springMVC.xml 配置SpringMVC

    • 开启扫描组件,扫描注解配置的类
    • 配置视图解析器
    • 开放对静态资源的访问
    • 开启mvc注解驱动
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           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 https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <!--  SpringMVC的配置文件,包含网站跳转逻辑的控制及配置  -->
        <!--开启扫描组件-->
        <context:component-scan base-package="com.atguigu.ssmcrud"></context:component-scan>
    
    <!--    &lt;!&ndash;配置thymeleaf视图解析器,方便页面返回&ndash;&gt;-->
    <!--    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">-->
    <!--        <property name="order" value="1"/> &lt;!&ndash;优先级设置&ndash;&gt;-->
    <!--        <property name="characterEncoding" value="UTF-8"/>-->
    <!--        <property name="templateEngine"> &lt;!&ndash;模板&ndash;&gt;-->
    <!--            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">-->
    <!--                <property name="templateResolver">-->
    <!--                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">-->
    <!--                        &lt;!&ndash; 视图前缀 &ndash;&gt;-->
    <!--                        <property name="prefix" value="/WEB-INF/views/"/>-->
    <!--                        &lt;!&ndash; 视图后缀 &ndash;&gt;-->
    <!--                        <property name="suffix" value=".html"/>-->
    <!--                        <property name="templateMode" value="HTML5"/>-->
    <!--                        <property name="characterEncoding" value="UTF-8" />-->
    <!--                    </bean>-->
    <!--                </property>-->
    <!--            </bean>-->
    <!--        </property>-->
    <!--    </bean>-->
    
        <!-- 配置视图解析器 -->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/views/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--配置视图控制器,建立请求与跳转页面的映射关系-->
    <!--    <mvc:view-controller path="/" view-name="emps"></mvc:view-controller>-->
    
        <!--开放对静态资源的访问,将springMVC不能处理的请求交给tomcat-->
        <mvc:default-servlet-handler/>
    
        <!--能支持springmvc更高级的一些功能,JSR303校验,快捷的ajax...映射动态请求-->
        <mvc:annotation-driven />
    
    </beans>
    
  • 第四步:resources文件夹下,配置数据库连接和日志文件,dbconfig.properties和log4j.properties

    dbconfig.properties

    mysql.driver=com.mysql.cj.jdbc.Driver
    mysql.url=jdbc:mysql://localhost:3306/mybatisdb?allowMultiQueries=true
    mysql.username=root
    mysql.password=wenhao
    

    log4j.properties

    log4j.rootLogger=DEBUG,A1
    
    log4j.appender.A1=org.apache.log4j.ConsoleAppender
    log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n
    
  • 第五步:resources文件夹下,springApplicationConfig.xml 全局配置文件,对Spring进行配置,与主要配置和业务逻辑有关

    • 开启扫描组件,这里无需扫描controller

    • 整合MyBatis

      1. 引入数据库配置文件 properties文件位置,classpath——>resources目录下
    1. 配置数据源(数据库连接池),可以使用c3p0或者Druid
    2. 配置Spring和MyBatis的整合:SqlSessionFactory,会指定MyBatis全局配置文件位置
    3. 配置sqlSession
    4. 配置扫描器,扫描自定义的mapper接口
    5. 配置一个可以进行批处理的sqlSession
    • 事务控制的配置(事务管理器)

      1. 建立与数据库连接池的映射
      2. 开启基于注解的事务
      3. 配置事务增强
    <?xml version="1.0" encoding="UTF-8"?>
    <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"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/aop
           https://www.springframework.org/schema/aop/spring-aop.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        <!--  spring的配置文件,这里主要配置和业务逻辑有关的  -->
    
        <!--  spring无需扫描controller,因为spring只进行组件扫描,对于控制层的处理则是交给springMVC处理  -->
        <context:component-scan base-package="com.atguigu.ssmcrud">
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
        <!--  =======================整合MyBatis=======================  -->
        <!--  引入数据库的配置文件  -->
        <context:property-placeholder location="classpath:dbconfig.properties"/>
    
        <!-- 配置数据源,这里使用druid数据库连接池-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="username" value="${mysql.username}"></property>
            <property name="password" value="${mysql.password}"></property>
            <property name="url" value="${mysql.url}"></property>
            <property name="driverClassName" value="${mysql.driver}"></property>
            <property name="initialSize" value="5"></property>
            <property name="maxActive" value="10"></property>
        </bean>
    
        <!-- 配置和MyBatis的整合:SqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--指定MyBatis全局配置文件的位置-->
            <property name="configLocation" value="classpath:mybatisConfig.xml"></property>
            <!--建立与数据库连接池的映射关系-->
            <property name="dataSource" ref="dataSource"></property>
            <!--指定mybatis,mapper文件的位置-->
            <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
        </bean>
    
        <!-- 配置扫描器,将MyBatis的Dao接口实现,并加入到ioc容器中,即扫描自定义的Mapper接口 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--扫描所有的dao接口的实现,加入到ioc容器中-->
            <property name="basePackage" value="com.atguigu.ssmcrud.dao"></property>
        </bean>
    
        <!--配置一个可以执行批量的sqlSession-->
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
            <constructor-arg name="executorType" value="BATCH"/>
        </bean>
    
        <!-- ==================事务控制的配置(事务管理器)====================== -->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!--控制数据库连接池-->
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
        <!--开启基于注解的事务,使用xml配置形式的事务-->
        <aop:config>
            <!--切入式表达式,service下所有的类以及所有的方法,都可作为切入点。哪些方法可能会被切入事务-->
            <aop:pointcut id="txPoint" expression="execution(* com.atguigu.ssmcrud.service..*(..))"/>
            <!--配置事务增强,切入的规则由txAdvice指定,切入的方法由txPoint指定-->
            <aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
        </aop:config>
    
        <!--配置事务增强,事务切入后怎么办,如何处理(事务如何切入)-->
        <tx:advice id="txAdvice" transaction-manager="transactionManager">
            <tx:attributes>
                <!--这个切入点切入的所有方法都是事务方法-->
                <tx:method name="*"/>
                <!--以get开始的所有方法,都认为是查询方法-->
                <tx:method name="get*" read-only="true"/>
            </tx:attributes>
        </tx:advice>
    
    </beans>
    
  • 第六步:resources文件下,mybatisConfig.xml 配置MyBatis配置文件

    • 配置一些对MyBatis的属性设置(如:settings、typeAliases等,properties属性已经在外部进行配置了,即springApplicationConfig.xml文件中)
    <?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">
    <!--MyBatis配置文件,配置一些MyBatis不好配置的设置-->
    <configuration>
        <settings>
            <!--开启驼峰命名映射-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
            <!--可以返回自动生成主键-->
            <setting name="useGeneratedKeys" value="true"/>
        </settings>
        <!--
            plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
            properties?, settings?,
            typeAliases?, typeHandlers?,
            objectFactory?,objectWrapperFactory?,
            plugins?,
            environments?, databaseIdProvider?, mappers?
        -->
        <plugins>
            <!-- com.github.pagehelper为PageHelper类所在包名 -->
            <plugin interceptor="com.github.pagehelper.PageInterceptor">
                <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
                <property name="param1" value="value1"/>
            </plugin>
        </plugins>
    
    </configuration>
    
  • 第七步:resources文件下,mbg.xml 配置逆向生成属性

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
        <properties resource="dbconfig.properties"/>
        <!--
            targetRuntime="MyBatis3Simple":生成简单版的CRUD
            MyBatis3:豪华版 用于复杂的数据库CRUD操作
         -->
        <context id="DB2Tables" targetRuntime="MyBatis3">
    
            <!-- 清除生成文件中的注释,该标签必须在生成文件之前定义 -->
            <commentGenerator>
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
    
            <!-- jdbcConnection:指定如何连接到目标数据库 -->
            <jdbcConnection driverClass="${mysql.driver}"
                            connectionURL="${mysql.url}"
                            userId="${mysql.username}"
                            password="${mysql.password}">
            </jdbcConnection>
    
            <!--类型解析器-->
            <javaTypeResolver >
                <property name="forceBigDecimals" value="false" />
            </javaTypeResolver>
    
            <!-- javaModelGenerator:指定javaBean的生成策略(生成的位置)
                targetPackage="test.model":目标包名
                targetProject="\MBGTestProject\src":目标工程
            -->
            <javaModelGenerator targetPackage="com.atguigu.ssmcrud.bean"
                                targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true" />
                <property name="trimStrings" value="true" />
            </javaModelGenerator>
    
            <!-- sqlMapGenerator:sql语句与接口方法映射生成策略 xml配置文件 -->
            <!-- 指定sql映射文件生成的位置:生成到resources文件下的mapper文件夹中-->
            <sqlMapGenerator targetPackage="mapper"
                             targetProject=".\src\main\resources">
                <property name="enableSubPackages" value="true" />
            </sqlMapGenerator>
    
            <!-- javaClientGenerator:指定mapper接口方法所在的位置 -->
            <!-- 指定dao接口生成的位置:mapper接口(业务行为接口) -->
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.atguigu.ssmcrud.dao"
                                 targetProject=".\src\main\java">
                <property name="enableSubPackages" value="true" />
            </javaClientGenerator>
    
            <!-- table标签:指定每个表的生成策略 -->
            <!-- 指定要逆向分析数据库中的哪些表:根据表要创建javaBean -->
            <table tableName="tbl_emp" domainObjectName="Employee"></table>
            <table tableName="tbl_dept" domainObjectName="Department"></table>
    
        </context>
    </generatorConfiguration>
    

1.4 测试

1.4.1 数据库的创建

创建一个名为ssm_crud的数据库

  • 这个数据库中有tbl_dept、tbl_emp两张表
CREATE TABLE `tbl_emp` (
  `emp_id` int(11) NOT NULL AUTO_INCREMENT,
  `emp_name` varchar(255) DEFAULT NULL,
  `gender` char(1) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `d_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`emp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `tbl_dept` (
  `dept_id` int(11) NOT NULL AUTO_INCREMENT,
  `dept_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 需要增加外键,即tbl_emp的d_id字段是tbl_dept的外键,从表tbl_dept的被引用字段dept_id是其主键
2021-11-27_121448

1.4.2 使用Spring单元测试对数据库进行操作

使用注解的方式导入Spring的配置文件,并且使用Spring单元测试(需添加依赖)

        <!-- Spring TestContext 用于注解导入Spring全局配置文件-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.18.RELEASE</version>
        </dependency>

测试代码:

/*
*   推荐Spring项目使用Spring的单元测试,就可以自动注入我们需要的组件了
*       1. 导入SpringTest依赖,注意scope标签,要去掉test
*       2. @ContextConfiguration指定Spring配置文件的位置
*       3. autowired要使用的组件即可
* */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:springApplicationConfig.xml"})
public class MapperTest {

    /*
    * ==========使用注解的方式===========
    *   由于先加载了Spring配置文件,所以使用注解,自动注入,获取实例
    * */
    @Autowired
    DepartmentMapper departmentMapper;

    @Autowired
    EmployeeMapper employeeMapper;

    @Autowired
    SqlSession sqlSession;

    /*
    *   测试DepartmentMapper
    * */
    @Test
    public void testCRUD(){
//        // ===========传统方法============
//        // 1. 创建Spring IOC容器
//        ApplicationContext ioc = new ClassPathXmlApplicationContext("classpath:springApplicationConfig.xml");
//        // 2. 从容器中获取mapper接口实例,因为在spring配置文件中,对mapper接口进行扫描并添加
//        DepartmentMapper departmentMapper = ioc.getBean(DepartmentMapper.class);

        // 1. 新增部门信息,使用插入信息参数是可以选择的,所以选择 可选择参数插入方法,即insertSelective,因为id是自增的
        departmentMapper.insertSelective(new Department(null, "开发部"));
        departmentMapper.insertSelective(new Department(null, "测试部"));

        // 2. 生成员工数据,测试员工的插入
        employeeMapper.insertSelective(new Employee(null, "Jerry", "M", "jerry@123.com", 1));

        // 3. 批量插入多个员工:批量操作,需要在Spring全局配置文件中设置一个可以执行批量操作的sqlSession

//        for(){ // 如果直接使用自动注入的mapper对象,无论是循环多少次,都是建立了相应次数的sqlSession,并不是批量操作
//            employeeMapper.insertSelective(new Employee());
//        }
        // 使用在spring配置文件中已经配置好的批量处理sqlSession
        EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
        for (int i = 0; i < 200; i++) {
            String uid = UUID.randomUUID().toString().substring(0, 5) + i;
            mapper.insertSelective(new Employee(null, uid, "W", uid + "@123.com", 1));
        }
        for (int i = 0; i < 200; i++) {
            String uid = UUID.randomUUID().toString().substring(0, 5) + i;
            mapper.insertSelective(new Employee(null, uid, "M", uid + "@qq.com", 2));
        }
        for (int i = 0; i < 200; i++) {
            String uid = UUID.randomUUID().toString().substring(0, 5) + i;
            mapper.insertSelective(new Employee(null, uid, "M", uid + "@gmail.com", 1));
        }

    }
}

1.5 完善项目结构

2021-11-27_194843
  • bean:又entity,实体层,实现对数据库表的映射,往往是一个数据对象。
  • controller:控制层,实现对浏览器发来的请求进行相应处理。
  • dao:数据访问对象层,创建接口,定义对数据库进行CRUD的操作方法,再建立与mapper xml配置文件的映射。
  • service:业务逻辑层,实现业务的真正逻辑,编写业务逻辑的代码,可以实现切面操作等
posted @ 2021-12-01 11:23  Komorebi_WH  阅读(86)  评论(0编辑  收藏  举报