SSM 配置实例

SSM 配置实例

项目为Maven项目

项目目录结构

在这里插入图片描述

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>com.myProject</groupId>
  <artifactId>ssm-crud</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.5</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
    <dependency>
      <groupId>org.mybatis.generator</groupId>
      <artifactId>mybatis-generator-core</artifactId>
      <version>1.4.0</version>
    </dependency>
    <!-- 添加log4j2依赖 -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.11.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.11.1</version>
    </dependency>
    <!-- web容器中需要添加log4j-web -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>2.11.1</version>
    </dependency>
    <!-- 桥接slf4j -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.11.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <!--thymeleaf-->
    <dependency>
      <groupId>org.thymeleaf</groupId>
      <artifactId>thymeleaf-spring5</artifactId>
      <version>3.0.9.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>


    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!-- spring 单元测试 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.1.5.RELEASE</version>
    </dependency>

  </dependencies>
</project>

2.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 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_3_1.xsd"
         version="3.1">

    <!-- 404错误拦截 -->
    <!--<error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>-->
    <!-- 500错误拦截 -->
    <!--<error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>-->

    <!-- 启动spring的容器 -->

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- springmvc 前端控制器 拦截所有请求
        默认文件名:dispatcherServlet-servlet.xml 可通过参数contextConfigLocation 进行配置
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-config.xml</param-value>
        </init-param>
     -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置服务器启动后立即加载Spring MVC配置文件 -->
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <!-- 1、.action访问以.action结尾的  由DispatcherServlet进行解析
           2、/,所有访问都由DispatcherServlet进行解析
       -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 字符编码过滤器 放在所有过滤器之前 -->
    <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>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 使用Rest风格   可使用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>

    <!-- 配置log4j监听器和过滤器 -->
    <!-- 默认在class类路径下,不需要额外配置引用 ,如果更改到其他地方,则需配置 -->
    <!--<context-param>
        <param-name>log4jConfiguration</param-name>
        <param-value>classpath:log4j2.xml</param-value>
    </context-param>-->
    <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>
    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
</web-app>

3.dispatcherServlet-servlet.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:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util.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
        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
        http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task.xsd">

    <!-- springmvc 的配置文件 包含网站逻辑 跳转 -->
    <context:component-scan base-package="com.myproject.*" use-default-filters="false">
        <!-- 只扫描控制器Controller -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!-- 配置试图解析器 -->
    <!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".html"/>
    </bean> -->

    <bean id="templateResolver"
          class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".html"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="order" value="1"/>
        <property name="templateMode" value="HTML5"/>
        <property name="cacheable" value="false"/>
    </bean>

    <bean id="templateEngine"
          class="org.thymeleaf.spring5.SpringTemplateEngine">
        <property name="templateResolver" ref="templateResolver"/>
    </bean>

    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="templateEngine" ref="templateEngine"/>
        <property name="characterEncoding" value="UTF-8"/>
    </bean>

    <!-- 内容协商管理器  -->
    <!--1、首先检查路径扩展名(如my.pdf);2、其次检查Parameter(如my?format=pdf);3、检查Accept Header-->
    <bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <!-- 扩展名至mimeType的映射,即 /user.json => application/json -->
        <property name="favorPathExtension" value="true"/>
        <!-- 用于开启 /userinfo/123?format=json 的支持 -->
        <property name="favorParameter" value="true"/>
        <property name="parameterName" value="format"/>
        <!-- 是否忽略Accept Header -->
        <property name="ignoreAcceptHeader" value="false"/>

        <property name="mediaTypes"> <!--扩展名到MIME的映射;favorPathExtension, favorParameter是true时起作用  -->
            <value>
                json=application/json
                xml=application/xml
                html=text/html
            </value>
        </property>
        <!-- 默认的content type -->
        <property name="defaultContentType" value="text/html"/>
    </bean>

    <!-- 访问静态资源文件 -->
    <!-- 将springmvc不能处理的请求交给tomcat -->
    <mvc:default-servlet-handler/>

    <!-- 配置注解的处理器映射器和处理器适配器 -->
    <!-- 能支持springmvc更高级的功能 JSR303校验、快捷ajax、映射动态请求 ... -->
    <mvc:annotation-driven/>

    <!-- 静态资源映射 -->
    <mvc:resources mapping="/static/**" location="/static/"/>

    <!-- 定时器注解 -->
    <task:annotation-driven />

    <!--配置上传文件数据解析器  -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <!-- 设置最大上传大小 -->
        <property name="maxUploadSize" value="5242880"/>
    </bean>

    <!-- 定义全局异常处理器 -->
    <!-- 只有一个全局异常处理器起作用 -->
<!--    <bean id="exceptionResolver" class="com.wxisme.ssm.exception.OverallExceptionResolver"></bean>-->

</beans>

4.applicationContext.xml 配置

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

    <!-- spring的配置文件 -->

    <context:component-scan base-package="com.myproject.*">
        <!-- 排除controller扫描 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--扫描Controller,并将其生命周期纳入Spring管理-->
<!--    <context:annotation-config/>-->
<!--    <context:component-scan base-package="com.myproject"/>-->
    
    <!-- 数据源配置信息 -->
    <context:property-placeholder location="classpath:dbconfig.properties"/>

    <bean id="pooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
        <property name="driverClass" value="${jdbc.driverClass}"/>
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
        <!-- 初始连接池大小 -->
        <property name="initialPoolSize" value="10"/>
        <!-- 连接池中连接最小个数 -->
        <property name="minPoolSize" value="5"/>
        <!-- 连接池中连接最大个数 -->
        <property name="maxPoolSize" value="20"/>

        <!-- 其他扩展熟悉 -->

        <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
<!--        <property name="acquireRetryDelay" value="1000"/>-->

<!--        &lt;!&ndash; 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数  &ndash;&gt;-->
<!--        <property name="acquireIncrement" value="5"/>-->

<!--        &lt;!&ndash;定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 &ndash;&gt;-->
<!--        <property name="acquireRetryAttempts" value="30"/>-->

<!--        &lt;!&ndash;连接关闭时默认将所有未提交的操作回滚。Default: false &ndash;&gt;-->
<!--        <property name="autoCommitOnClose" value="false" />-->
<!--        -->
<!--        &lt;!&ndash;c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么   -->
<!--        属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试   -->
<!--        使用。Default: null&ndash;&gt;-->
<!--        <property name="automaticTestTable" value="Test"/>-->

<!--        &lt;!&ndash;获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效   -->
<!--        保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试   -->
<!--        获取连接失败后该数据源将申明已断开并永久关闭。Default: false&ndash;&gt;-->
<!--        <property name="breakAfterAcquireFailure" value="false"/>-->
<!--        -->
<!--        &lt;!&ndash;当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出   -->
<!--        SQLException,如设为0则无限期等待。单位毫秒。Default: 0 &ndash;&gt;-->
<!--        <property name="checkoutTimeout" value="100"/>-->
<!--        -->
<!--        &lt;!&ndash;通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。   -->
<!--        Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester&ndash;&gt;-->
<!--        <property name="connectionTesterClassName" value="null"/>-->
<!--        -->
<!--        &lt;!&ndash;指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可   -->
<!--        Default: null&ndash;&gt;-->
<!--        <property name="factoryClassLocation" value="null"/>-->
<!--        -->
<!--        &lt;!&ndash;Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.   -->
<!--        (文档原文)作者强烈建议不使用的一个属性&ndash;&gt;-->
<!--        <property name="forceIgnoreUnresolvedTransactions" value="false"/>-->

<!--        &lt;!&ndash;每60秒检查所有连接池中的空闲连接。Default: 0 &ndash;&gt;-->
<!--        <property name="idleConnectionTestPeriod" value="60"/>-->

<!--        &lt;!&ndash;最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 &ndash;&gt;-->
<!--        <property name="maxIdleTime" value="60" />-->

<!--        &lt;!&ndash;JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements   -->
<!--        属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。   -->
<!--        如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0&ndash;&gt;-->
<!--        <property name="maxStatements" value="100"/>-->

<!--        &lt;!&ndash;maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 &ndash;&gt;-->
<!--        <property name="maxStatementsPerConnection" value="0"/>-->

<!--        &lt;!&ndash;c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能   -->
<!--        通过多线程实现多个操作同时被执行。Default: 3&ndash;&gt;-->
<!--        <property name="numHelperThreads" value="3"/>-->
<!--        -->
<!--        &lt;!&ndash;当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0   -->
<!--        的数据源时。Default: null&ndash;&gt;-->
<!--        <property name="overrideDefaultUser" value="root"/>-->

<!--        &lt;!&ndash;与overrideDefaultUser参数对应使用的一个参数。Default: null&ndash;&gt;-->
<!--        <property name="overrideDefaultPassword" value="password"/>-->

<!--        &lt;!&ndash;定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:   -->
<!--        测试的表必须在初始数据源的时候就存在。Default: null&ndash;&gt;-->
<!--        <property name="preferredTestQuery" value="select id from test where id=1"/>-->
<!--        -->
<!--        &lt;!&ndash;用户修改系统配置参数执行前最多等待300秒。Default: 300 &ndash;&gt;-->
<!--        <property name="propertyCycle" value="300" />-->

<!--        &lt;!&ndash;因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的   -->
<!--        时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable   -->
<!--        等方法来提升连接测试的性能。Default: false &ndash;&gt;-->
<!--        <property name="testConnectionOnCheckout" value="false" />-->
<!--        -->
<!--        &lt;!&ndash;如果设为true那么在取得连接的同时将校验连接的有效性。Default: false &ndash;&gt;-->
<!--        <property name="testConnectionOnCheckin" value="true" />-->

<!--        &lt;!&ndash;早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数   -->
<!--        允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始   -->
<!--        广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到   -->
<!--        支持,但今后可能的版本可能不支持动态反射代理。Default: false&ndash;&gt;-->
<!--        <property name="usesTraditionalReflectiveProxies" value="false" />-->

    </bean>

    <!-- 配置mybatis整合 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 指定mybatis全局配置 -->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="pooledDataSource"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <!-- 这是配置xml扫描的,当只要用注解不用xml,可以不要下面这个配置-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 配置扫描器 将mybatis接口的实现加入到ioc容器中  自动扫描 将Mapper接口生成代理注入到Springc -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描dao实现 -->
        <property name="basePackage" value="com.myproject.dao"/>
    </bean>

    <!-- 配置可执行批量的sqlSession -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg name="executorType" value="BATCH"/>
        <!-- 以sqlSessionFactory为参数传入构造函数中 -->
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

    <!-- 配置 Spring 的 org.springframework.jdbc.core.JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="pooledDataSource"/>
    </bean>

    <!-- 事务控制 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 控制数据源 -->
        <property name="dataSource" ref="pooledDataSource"/>
    </bean>

    <!-- 开启基于注解的事务,使用xml配置形式的事务 -->
    <aop:config>
        <!-- 切入点描述 -->
        <aop:pointcut id="txpoint" expression="execution(* com.myproject.service..*(..))"/>
        <!-- 配置事务增强 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txpoint"/>
    </aop:config>

    <!-- 配置事务增强 事务如何切入 -->
    <tx:advice id="txAdvice">
        <tx:attributes>
            <!-- 所有方法都是事务方法 -->
            <tx:method name="*"/>
            <!-- 以get开始的所有方法  只读事务 -->
            <tx:method name="get*" read-only="true"/>
        </tx:attributes>
    </tx:advice>

</beans>

5.mybatis-config.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">
<configuration>
    <settings>
        <!-- 设置日志 -->
        <setting name="logImpl" value="LOG4J2"/>
        <!-- 设置驼峰匹配 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值   -->
        <setting name="useGeneratedKeys" value="true"/>
    </settings>
    <!-- 设置包扫描(别名) -->
    <typeAliases>
        <package name="com.myproject"/>
    </typeAliases>
</configuration>

6.dbconfig.properties 配置

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/ssm-crud?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=888888

7.log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<!--设置log4j2的自身log级别为DEBUG-->
<configuration status="DEBUG " monitorInterval="30">
    <!-- 变量配置 应该是日志文件保存路径-->
    <Properties>
        <!-- (*必须,各应用需要修改) 部署应用的名称,命名规则 :全部小写字母、中短横线、数字,与微服务命名,disconf中命名一致 -->
        <property name="APPNAME">park-service</property>
        <!-- (各应用需要修改)日志文件本地存放目录路径 建议各个环境跟生产环境统一起来,方便维护 -->
        <Property name="logBaseFolder">/logs</Property>
        <!-- *必须并强制遵守 日志文件的编码 -->
        <property name="log_charset">UTF-8</property>
        <!--输出日志格式-->
        <property name="log_pattern">
            %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n
        </property>
    </Properties>

    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式 %l :表示某个类-->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%t] %-5p %c{1}:%L - %msg%n"/>
        </console>

        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${logBaseFolder}/${APPNAME}-info.log"
                     filePattern="${logBaseFolder}/%d{yyyy-MM}/${APPNAME}-info-%d{dd HH:mm:ss}.%i.log.gz">
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 日志输出格式 -->
            <PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
            <!-- 以下是日志压缩包目录的建议格式名称 建议1天归档依次,压缩文件上线建议为200,这里预估每个磁盘存储空间200G左右,每个压缩包最大值200MB -->
            <Policies>
                <TimeBasedTriggeringPolicy  modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="20MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileDebug" fileName="${logBaseFolder}/${APPNAME}-debug.log"
                     filePattern="${logBaseFolder}/%d{yyyy-MM}/${APPNAME}-debug-%d{dd HH:mm:ss}.%i.log.gz">
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 日志输出格式 -->
            <PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
            <!-- 以下是日志压缩包目录的建议格式名称 建议1天归档依次,压缩文件上线建议为200,这里预估每个磁盘存储空间200G左右,每个压缩包最大值200MB -->
            <Policies>
                <TimeBasedTriggeringPolicy  modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="20MB"/>
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${logBaseFolder}/${APPNAME}-error.log"
                     filePattern="${logBaseFolder}/%d{yyyy-MM}/${APPNAME}-error-%d{dd HH:mm:ss}.%i.log.gz">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="${log_charset}" pattern="${log_pattern}" />
            <Policies>
                <TimeBasedTriggeringPolicy  modulate="true" interval="1"/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!-- 注解查询的日记-->
        <logger name="com.myproject.dao" level="DEBUG">
            <appender-ref ref="RollingFileDebug"/>
        </logger>
        <!-- xml文件查询的日记-->
        <logger name="mapper" level="DEBUG">
            <appender-ref ref="RollingFileDebug"/>
        </logger>
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

ssm基本配置如上,记录下。
只需修改相关包路径、数据库连接配置即可使用,还需其他功能点需慢慢扩展。
如有帮助,记得点赞哦~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值