搭建spring+springmvc+mybatis+maven项目(2)

硅谷探秘者 2620 0 0

搭建spring+springmvc+mybatis+maven项目(2)

        在 搭建spring+springmvc+mybatis+maven项目(1) 中我们搭建了基本的maven环境,并且可以运行项目接着就开始配置spring,springmvc,mybatis

1.首先目录结构如下

QQ截图20190308210254.png

        因为上次没有在model-web模块中添加对model-common的依赖,所以这次我们在model-web的pom文件中先添加一下对model-common的依赖

<dependencies>
	  <dependency>
	  	<groupId>club.jiajiajia.model</groupId>
	    <artifactId>model-common</artifactId>
	    <version>0.0.1-SNAPSHOT</version>
	  </dependency>
  </dependencies>

        

        加入依赖以后,然后再在文件中加入以上配置文件,下边讨论一下各自的作用


QQ截图20190308211233.png


1.1.web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:websocket="http://www.springframework.org/schema/websocket"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket.xsd">
        
    <!--  加载spring和mybatis的配置文件 --> 
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
      
      
    <!-- 使用ContextLoaderListener初始化Spring容器 -->
    <!--若没有指定其他参数,默认查找的配置文件位置是:/WEB-INF/applicationContext.xml  -->
    <listener>
        <description>Spring容器加载监听器</description>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- 配置springmvc核心控制器 -->
    <servlet>
        <servlet-name>SpringMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <description>spring MVC 配置文件路径</description>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-mvc.xml</param-value>
        </init-param>
         <!-- 启动动优先级,越小越早加载 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Servlet访问的路径映射,所有的访问都必须经过调度用的前置控制器 -->
    <servlet-mapping>
        <servlet-name>SpringMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    <!--编码过滤器 -->
    <filter>
        <description>字符集过滤器</description>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <description>字符集编码</description>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <!-- 路径映射 -->
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    
    <!-- 过滤静态资源 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
    </servlet-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>*.txt</url-pattern>
    </servlet-mapping>
    
    
	<!-- 负责将web应用根目录以webAppRootKey上下文参数指定的属性名添加到系统参数中 -->
   	<context-param>
		<param-name>webAppRootKey</param-name>
		<param-value>root</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.springframework.web.util.WebAppRootListener
		</listener-class>
	</listener>
	<!-- 欢迎页面 -->	
    <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

        

        web.xml中主要配置了一些springmvc的过滤器,核心控制器,监听等,和编码过滤器过滤静态资源以及系统参数


        按照web.xml的配置以及加载顺序,首先加载applicationContext.xml文件

1.2.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:p="http://www.springframework.org/schema/p"
	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:mvc="http://www.springframework.org/schema/mvc"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    
    <!-- 扫描service、去掉对controller的扫描 -->
    <context:component-scan base-package="club.jiajiajia.model.*">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>
	
    <!-- jdbc配置文件 -->
    <context:property-placeholder location="classpath:jdbc.properties" />
    
    <!-- ========================================配置数据源========================================= -->
    <!-- 3.配置C3P0数据源    destroy-method="close"-->  
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!--驱动类名 -->
        <property name="driverClass" value="${mysql.driver}" />
        <!-- url -->
        <property name="jdbcUrl" value="${mysql.url}" />
        <!-- 用户名 -->
        <property name="user" value="${mysql.user}" />
        <!-- 密码 -->
        <property name="password" value="${mysql.password}" />
        <!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数 -->
        <property name="acquireIncrement" value="${mysql.acquireIncrement}"></property>
        <!-- 初始连接池大小 -->
        <property name="initialPoolSize" value="${mysql.initialPoolSize}"></property>
        <!-- 连接池中连接最小个数 -->
        <property name="minPoolSize" value="${mysql.minPoolSize}"></property>
        <!-- 连接池中连接最大个数 -->
        <property name="maxPoolSize" value="${mysql.maxPoolSize}"></property>
    </bean>  
    
    <!-- ========================================针对myBatis的配置项============================== -->
    <!-- 4.配置sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->
        <!-- 数据源 -->
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <property name="dataSource" ref="dataSource" />
        <!-- sql映射文件路径 -->
        <!-- 自动扫描com/demo/mapping/目录下的所有SQL映射的xml文件, 省掉Configuration.xml里的手工配置
        value="classpath:com/demo/mapping/*.xml"指的是classpath(类路径)下com.demo.mapping包中的所有xml文件 -->
        <property name="mapperLocations" value="classpath:club/jiajiajia/model/*/dao/*.xml" />
    </bean>
    
    <!-- 5.配置扫描器  -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描com.demo.dao这个包以及它的子包下的所有映射接口类 -->
        <property name="basePackage" value="club.jiajiajia.model.*.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>
    
    <!-- ========================================配置事务============================== -->
    <!-- 6.声明式事务管理 -->
    <!--定义事物管理器,由spring管理事务 -->
    <bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 配置数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 通知 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
             <!-- 传播行为 -->
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="append*" propagation="REQUIRED" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />
            <tx:method name="edit*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="repair" propagation="REQUIRED" />
            <tx:method name="get*" propagation="REQUIRED"  />
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="load*" propagation="REQUIRED" read-only="true" />
            <tx:method name="search*" propagation="REQUIRED" read-only="true" />
            <tx:method name="datagrid*" propagation="REQUIRED" read-only="true" />
            <tx:method name="*" propagation="REQUIRED"  />
        </tx:attributes>
    </tx:advice>
    
    <!-- 配置aop  -->
    <aop:config>
    	<!-- 定义在club.jiajiajia.model包、以及子包下的service包和service的所有子包里的任意类的任意方法的执行 -->
        <aop:pointcut id="transactionPointcut" expression="execution (* club.jiajiajia.model..service..*.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />
    </aop:config>
    
</beans>

        applicationContext.xml配置文件中,主要的作用有->

        1.加载service层的对象,并加入到ioc容器、

        2.配置并加载c3p0数据源,以及配置和加载mybatis的相关容器、

        3.配置事务管理器


        其中用到了jdbc.properties文件,封装了数据库的一些链接信息

1.3.jdbc.properties

#local
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
mysql.user=root
mysql.password=******
mysql.acquireIncrement=5
mysql.initialPoolSize=10
mysql.minPoolSize=5
mysql.maxPoolSize=20

        还用到了mybatis-config.xml文件,用与配置mybatis的其他的相关配置,比如给实体类其别名等

1.4.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="STDOUT_LOGGING"/>
	</settings>
	<typeAliases>
		<package name="club.jiajiajia.model.*.entity"/>
	</typeAliases>
</configuration>


        加载完 applicationContext.xml 文件以后就会加载applicationContext-mvc.xml配置文件,加载psringmvc的相关配置

1.5.applicationContext-mvc.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- 静态资源的请求,转由Web应用服务器默认的Servlet处理 -->
    <mvc:default-servlet-handler/>
    
    <!-- 开启扫描注解 -->
    <mvc:annotation-driven />
    
    <!-- 扫描controller、并去掉对service的扫描、否则会对事务管理器产生毁灭性影响 -->
    <context:component-scan base-package="club.jiajiajia.model.*"> 
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
    </context:component-scan>
    
    <!-- springmvc上传文件配置 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="UTF-8"></property>
		<property name="maxUploadSize" value="102400000"></property>
	</bean>
	
    <!-- 过滤静态资源 -->
    <mvc:resources mapping="/resources/**" location="/resources/"/>
    <mvc:resources mapping="/static/**" location="/static/"/>
    
    <!-- 配置视图管理器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

        applicationContext.xml文件的主要作用是

        1.加载controller层中的对象,加入ioc容器,

        2.进行springmvc上传文件的相关配置

        3.过滤静态资源

        4.配置视图管理器


        最后log4j.properties文件配置日志信息

1.6.log4j.properties

log4j.logger.com.mchange.v2=ERROR
 
log4j.rootLogger=debug,stdout,DEBUG,INFO,WARN,ERROR
 
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%m%n  
 
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.DEBUG.File=C:/logger/debug.log  
log4j.appender.DEBUG.Append=true  
log4j.appender.DEBUG.Threshold=DEBUG  
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout  
log4j.appender.DEBUG.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 
log4j.appender.DEBUG.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.DEBUG.filter.F1.LevelMin=DEBUG
log4j.appender.DEBUG.filter.F1.LevelMax=DEBUG
 
log4j.appender.INFO=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.INFO.File=C:/logger/info.log  
log4j.appender.INFO.Append=true  
log4j.appender.INFO.Threshold=INFO  
log4j.appender.INFO.layout=org.apache.log4j.PatternLayout  
log4j.appender.INFO.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.INFO.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.INFO.filter.F1.LevelMin=INFO
log4j.appender.INFO.filter.F1.LevelMax=INFO
 
log4j.appender.WARN=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.WARN.File=C:/logger/warn.log  
log4j.appender.WARN.Append=true  
log4j.appender.WARN.Threshold=WARN  
log4j.appender.WARN.layout=org.apache.log4j.PatternLayout  
log4j.appender.WARN.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.WARN.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.WARN.filter.F1.LevelMin=WARN
log4j.appender.WARN.filter.F1.LevelMax=WARN
 
log4j.appender.ERROR=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.ERROR.File=C:/logger/error.log  
log4j.appender.ERROR.Append=true  
log4j.appender.ERROR.Threshold=ERROR  
log4j.appender.ERROR.layout=org.apache.log4j.PatternLayout  
log4j.appender.ERROR.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
log4j.appender.ERROR.filter.F1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.ERROR.filter.F1.LevelMin=ERROR
log4j.appender.ERROR.filter.F1.LevelMax=ERROR

        这些配置文件配置完毕以后,启动项目


QQ截图20190308214212.png

2.接下来进行全面测试阶段

        为了方便加入了一个类封装所有的返回结果如下


QQ截图20190308215652.png

package club.jiajiajia.model.common.util;
import java.io.Serializable;
/***
 * 封装返回的数据
 * @author LENOVO
 */
public class MyAjaxResult implements Serializable{
	private static final long serialVersionUID = 1L;
	private String msg;
    private Object data;
    // 200成功,300异常,500严重错误
    private Integer code;
    public MyAjaxResult() {
    }
    public MyAjaxResult(String msg, Object data, Integer Code) {
        this.msg = msg;
        this.data = data;
        this.code = Code;
    }
	public static MyAjaxResult success(Object data){
		return new MyAjaxResult("成功",data, 200);
	}
	public static MyAjaxResult success(Object data, String msg){
		return new MyAjaxResult(msg, data,200);
	}
	public static MyAjaxResult success(String msg){
		return new MyAjaxResult(msg, null,200);
	}

    public static MyAjaxResult fail_500(String msg){
        return new MyAjaxResult(msg, null,500);
    }
    public static MyAjaxResult fail_300(String msg){
        return new MyAjaxResult(msg, null,300);
    }
    public String getMsg() {
        return msg;
    }
    public Object getData() {
        return data;
    }
    public Integer getCode() {
        return code;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public void setData(Object data) {
        this.data = data;
    }
    public void setStatus(Integer Code) {
        this.code = Code;
    }
}


2.1.日志测试

package club.jiajiajia.model.common.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import club.jiajiajia.model.common.util.MyAjaxResult;

@Controller
@RequestMapping("/test")
public class Test {
	
	Logger l=Logger.getLogger(Test.class);
	/**
	 * 测试日志
	 * @return
	 */
	@RequestMapping("/logger")
	@ResponseBody
	public MyAjaxResult re() {
		l.debug("debug");
		l.info("info");
		l.warn("warn");
		l.error("error");
		return MyAjaxResult.success("ok");
	}
	
	
}

        访问路径:http://localhost/model-web/test/logger

        控制台打印,说明springmvc配置ok

QQ截图20190308220128.png

        再看日志文件也是ok

QQ截图20190308220226.png



2.2.视图管理器测试

        @RequestMapping("/index")
	public String index() {
		return "index";
	}

     

       访问:http://localhost/model-web/test/index


QQ截图20190308220642.png

        成功跳转页面,ok


2.3.事务管理器测试

        目录结构:


QQ截图20190308221956.png

        实体类

package club.jiajiajia.model.common.entity;

public class Users {
	public Users(String username, String password, String email, String sex) {
		super();
		this.username = username;
		this.password = password;
		this.email = email;
		this.sex = sex;
	}
	private Integer id;
	private String username;
	public Users() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Users(Integer id, String username) {
		super();
		this.id = id;
		this.username = username;
	}
	private String password;
	private String email;
	private String sex;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

        controller层

@Autowired
	private UserService userService;
	
	@RequestMapping("/test")
	@ResponseBody
	public MyAjaxResult test() {
		try {
			userService.adduser(new Users("username","password","email","sex"), 
					new Users("username2","password2","email2","sex2"));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return MyAjaxResult.fail_300("error");
		}
		return MyAjaxResult.success("ok");
	}

        service

package club.jiajiajia.model.common.service;
import club.jiajiajia.model.common.entity.Users;
public interface UserService {
	public void adduser(Users u,Users u2);
}

        serviceimpl

package club.jiajiajia.model.common.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import club.jiajiajia.model.common.dao.UserMapper;
import club.jiajiajia.model.common.entity.Users;
import club.jiajiajia.model.common.service.UserService;
@Service
public class UserServiceImpl implements UserService {
	@Autowired
	private UserMapper userMapper;
	@Override
	public void adduser(Users u,Users u2) {
		// TODO Auto-generated method stub
		userMapper.adduser(u);
		userMapper.adduser(u2);
	}
}

        mapper

package club.jiajiajia.model.common.dao;
import club.jiajiajia.model.common.entity.Users;
public interface UserMapper {
	public int adduser(Users u);
}
<?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="club.jiajiajia.model.common.dao.UserMapper" >
  <insert id="adduser" parameterType="club.jiajiajia.model.common.entity.Users">
  	INSERT INTO users(id,username,password,email,sex) VALUES(#{id},#{username},#{password},#{email},#{sex});
  </insert>
</mapper>

        运行:执行 http://localhost/model-web/test/test

        执行成功

{"msg":"ok","data":null,"code":200}

QQ截图20190308222403.png

        然后把数据清空


QQ截图20190308222920.png


        修改UserServiceImpl,人为制造异常 int a=1/0

package club.jiajiajia.model.common.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import club.jiajiajia.model.common.dao.UserMapper;
import club.jiajiajia.model.common.entity.Users;
import club.jiajiajia.model.common.service.UserService;
@Service
public class UserServiceImpl implements UserService {
	@Autowired
	private UserMapper userMapper;
	@Override
	public void adduser(Users u,Users u2) {
		// TODO Auto-generated method stub
		userMapper.adduser(u);
		int a=1/0;
		userMapper.adduser(u2);
	}
}

        如果没有事务管理器,第一个addUser(u)会执行成功,并且插入一条数据,如果事务管理器配置成功以后,数据库中应该不会有数据(回滚)。

        重启项目以后  执行 http://localhost/model-web/test/test

        执行结果:

{"msg":"error","data":null,"code":300}

        后台会报异常

QQ截图20190308223056.png

        刷新数据库后发现数据库中没有数据

QQ截图20190308222920.png

        成功回滚

        事务管理器测试也是ok的


        测试完毕

        项目的基本配置完成



评论区
请写下您的评论...
暂无评论...
猜你喜欢
spring/springmvc 2178 spring+springmvc+mybatis+maven(1)首先在配置好maven仓库的情况下:1.创file-new-mavenprojectnextgroup为父坐标
框架 2094 第一次学习springboot框架环境idea-maven(eclipse更简单)1.先创一个maven这样就创好了2.配置pom文件?xmlversion="1.0"encoding
java 1634 oauth2.0密码模式框架(demo)附sql脚本和测试代码1.说明请搜索http://www.jiajiajia.club/search?str=oauth2.0密码模式框架
工具 1303 上一篇:eclipse中使用Git管理工程代码(1)基本操作eclipse将工程推送到远程库(github)uri复制的github地址填写github的用户名密码,点击next点击
rabbitmq,mqtt协议 477 集群的就是为了实现rabbitmq的高可用性,集群分为2种普通集群:主备架构,只是实现主备方案,不至于主节点宕机导致整个服务无法使用镜像集群:同步结构,基于普通集群实现的队列同步普通集群
redis 674 配置文件中增加一配置如下:#哨兵模式中设定主库密码与当前库密码同步,保证从库能够提升为主库masterauth"123456"在/etc/redis/录下创sentinel.conf哨兵配置文件
框架 1742 oauth2.0密码模式框架(java)源码下载地址:http://www.jiajiajia.club/file/info/8GG7iM/109一、什么是oauth协议OAuth(开放授权
框架 1621 maven使用tomcat7插件1.pom文件build finalNamedz/finalName plugins plugin
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。