在上一篇博客中详解SSM环境的搭建(上),我也经搭建好了是SSM的基本框架,并进行了简单的测试。但是并没有给MySQL添加事务管理以及并没有测试数据库的增删查改功能。接下来便继续详细进行各个功能的测试。
1.添加新的依赖
<!-- 引入aop依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- 引入Spring解析JSon数据的依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.2</version>
</dependency>
<!-- 将参数map的参数值注入JavaBean中 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
完整的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>ssmdemo3</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssmdemo3 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>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 用户版本锁定,方便修改版本-->
<spring.version>5.2.8.RELEASE</spring.version>
</properties>
<dependencies>
<!-- 引入JUnit测试依赖-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0-M1</version>
<scope>test</scope>
</dependency>
<!-- 引入Spring的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<!-- 引入Spring-jdbc依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--引入servlet的依赖包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--引入jsp依赖包-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- 引入mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 引入mybatis的Spring依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- 引入MySQL依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- 引入c3p0连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!-- 引入jstl表达式的依赖包 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 引入aop依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
<!-- 引入Spring解析JSon数据的依赖 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.2</version>
</dependency>
<!-- 将参数map的参数值注入JavaBean中 -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>
<build>
<finalName>ssmdemo3</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.更新AccountDao.java的代码,添加mybatis的注解
package dao;
import entity.Account;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Classname:AccountDao
* @description:用于访问数据库,实现对数据库的增删除改操作
* @author: 陌意随影
* @Date: 2020-08-12 19:55
* @Version: 1.0
**/
@Repository("accountDao")
public interface AccountDao {
/**
* @Description :向数据库中存入新的用户,并返回是否存储成功
* @Date 19:56 2020/8/12 0012
* @Param * @param account :要保存的用户
* @return boolean
**/
@Insert("insert into account(name,password,age,createTime,money) values(#{name},#{password},#{age},#{createTime},#{money})")
public int saveAccount(Account account);
/**
* @Description :更新用户
* @Date 19:58 2020/8/12 0012
* @Param * @param account :
* @return boolean
**/
@Update("update account set name=#{name},password=#{password},age=#{age},createTime=#{createTime},money=#{money} where id=#{id}")
public int updateAccount(Account account);
/**
* @Description :通过ID删除用户
* @Date 19:59 2020/8/12 0012
* @Param * @param id :
* @return boolean
**/
@Delete("delete from account where id=#{id}")
public int deleteAccount(int id);
/**
* @Description :通过用户id查找用户
* @Date 19:59 2020/8/12 0012
* @Param * @param id :
* @return entity.Account
**/
@Select("select* from account where id=#{id}")
public Account findAccount(int id);
/**
* @Description :查找所有的用户
* @Date 20:00 2020/8/12 0012
* @Param * @param :
* @return java.util.List<entity.Account>
**/
@Select("select* from account")
public List<Account> findAllAccount();
}
3.在AccountService.java中添加转账方法用于模拟事务是否正确执行,同时在AccountServiceImpl.java中实现该接口。
package service;
import entity.Account;
import java.util.List;
/**
* Classname:ssmdemo3
* @description: 用户业务逻辑接口
* @author: 陌意随影
* @Date: 2020-08-12 19:55
*/
public interface AccountService {
/**
* @Description :向数据库中存入新的用户,并返回是否存储成功
* @Date 19:56 2020/8/12 0012
* @Param * @param account :要保存的用户
* @return boolean
**/
public boolean saveAccount(Account account);
/**
* @Description :更新用户
* @Date 19:58 2020/8/12 0012
* @Param * @param account :
* @return boolean
**/
public boolean updateAccount(Account account);
/**
* @Description :通过ID删除用户
* @Date 19:59 2020/8/12 0012
* @Param * @param id :
* @return boolean
**/
public boolean deleteAccount(int id);
/**
* @Description :通过用户id查找用户
* @Date 19:59 2020/8/12 0012
* @Param * @param id :
* @return entity.Account
**/
public Account findAccount(int id);
/**
* @Description :查找所有的用户
* @Date 20:00 2020/8/12 0012
* @Param * @param :
* @return java.util.List<entity.Account>
**/
public List<Account> findAllAccount();
/**
* @Description :ID为sourceId的用户转账money到用户ID为targetId的用户
* @Date 22:51 2020/8/12 0012
* @Param * @param sourceId
* @param targetId
* @param money :
* @return boolean
**/
public boolean transMoney(int sourceId,int targetId,int money);
}
package service.impl;
import dao.AccountDao;
import entity.Account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import service.AccountService;
import java.util.List;
/**
* Classname:AccountServiceImpl
*
* @description:
* @author: 陌意随影
* @Date: 2020-08-12 20:11
* @Version: 1.0
**/
@Service("accountService")
public class AccountServiceImpl implements AccountService {
//自动注入dao
@Autowired
AccountDao accountDao;
@Override
public boolean saveAccount(Account account) {
return accountDao.saveAccount(account)==1;
}
@Override
public boolean updateAccount(Account account) {
return accountDao.updateAccount(account)==1;
}
@Override
public boolean deleteAccount(int id) {
return accountDao.deleteAccount(id)==1;
}
@Override
public Account findAccount(int id) {
return accountDao.findAccount(id);
}
@Override
public List<Account> findAllAccount() {
return accountDao.findAllAccount();
}
@Override
public boolean transMoney(int sourceId, int targetId, int money) {
// 获取对应的用户
Account sourceIdAccount = accountDao.findAccount(sourceId);
Account targetAccount = accountDao.findAccount(targetId);
if (sourceIdAccount== null ||targetAccount == null){
return false;
}
// 更新账户余额
sourceIdAccount.setMoney(sourceIdAccount.getMoney()-money);
targetAccount.setMoney(targetAccount.getMoney()+money);
boolean fla1 = this.updateAccount(sourceIdAccount);
//模拟转账出错误
int i = 9/0;
boolean fla2 = this.updateAccount(targetAccount);
return fla1==true&&fla2==true;
}
}
4.在index.jsp中添加添加代码
<%--
Created by IntelliJ IDEA.
User: 陌意随影
Date: 2020/8/5 0005
Time: 23:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>测试首页</title>
</head>
<body>
<h3>首页</h3>
<a href="account/saveAccount?name=aaa&password=aaa&age=18&money=240">保存用户</a><br>
<a href="account/updateAccount?id=25&name=bbb&password=bbb&age=23&money=640">更新用户</a><br>
<a href="account/deleteAccount?id=25">删除用户</a><br>
<a href="account/findOne?id=25">查找用户</a><br>
<a href="account/findAllAccount">查找所有用户</a><br>
<a href="account/transMoney?sourceId=23&targetId=25&money=100">转账</a><br>
</body>
</html>
进行测试各种方法。
在pages文件夹中添加AccountList.jsp用于展示查询的用户
<%--
Created by IntelliJ IDEA.
User: 陌意随影
Date: 2020/8/12 0012
Time: 23:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>查询用户页面</title>
</head>
<body>
<c:if test="${ not empty accountList}" >
<c:forEach items="${accountList}" var="account" >
<tr>
<td>${account.id}</td>
<td>${account.name}</td>
<td>${account.password}</td>
<td>${account.age}</td>
<td>${account.money}</td>
<td>${account.createTime}</td>
</tr>
<br>
</c:forEach>
</c:if>
<c:if test="${not empty account}">
<tr>
<td>${account.id}</td>
<td>${account.name}</td>
<td>${account.password}</td>
<td>${account.age}</td>
<td>${account.money}</td>
<td>${account.createTime}</td>
</tr>
</c:if>
</body>
</html>
5.更新controller中的AccountController.java中的方法
package controller;
import entity.Account;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import service.AccountService;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
/**
* Classname:AccountController
* @description:控制器
* @author: 陌意随影
* @Date: 2020-08-12 20:02
* @Version: 1.0
**/
@Controller
@RequestMapping("/account")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping("/testSSM")
public String testSSM(){
//调用测试方法
accountService.findAllAccount();
System.out.println("框架搭建成功!");
return "sucess";
}
@RequestMapping(value = "/saveAccount")
public ModelAndView saveAccount(HttpServletRequest httpServletRequest){
Account account = new Account();
Map parameterMap = httpServletRequest.getParameterMap();
BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
try {
//将所有的参数封装到account对象中
beanUtilsBean.populate(account,parameterMap);
boolean fla = accountService.saveAccount(account);
System.out.println("保存成功:"+fla);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("sucess");
if (fla){
modelAndView.addObject("msg","保存用户成功!");
}else{
modelAndView.addObject("msg","保存用户失败!");
}
return modelAndView;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("参数错误。。");
}
}
@RequestMapping("/updateAccount")
public ModelAndView updateAccount(HttpServletRequest httpServletRequest){
Account account = new Account();
Map parameterMap = httpServletRequest.getParameterMap();
BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
try {
//将所有的参数封装到account对象中
beanUtilsBean.populate(account,parameterMap);
System.out.println(account);
boolean fla = accountService.updateAccount(account);
System.out.println("更新成功:"+fla);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("sucess");
if (fla){
modelAndView.addObject("msg","更新用户成功!");
}else{
modelAndView.addObject("msg","更新用户失败!");
}
return modelAndView;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("参数错误。。");
}
}
@RequestMapping("/deleteAccount")
public ModelAndView deleteAccount(@RequestParam int id){
boolean fla = accountService.deleteAccount(id);
System.out.println("删除成功:"+fla);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("sucess");
if (fla){
modelAndView.addObject("msg","删除用户成功!");
}else{
modelAndView.addObject("msg","删除用户失败!");
}
return modelAndView;
}
@RequestMapping("/findOne")
public ModelAndView findOne(@RequestParam int id){
Account account = accountService.findAccount(id);
System.out.println(account);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("accountList");
modelAndView.addObject("account",account);
return modelAndView;
}
@RequestMapping("/findAllAccount")
public ModelAndView findAllAccount(){
List<Account> accountList = accountService.findAllAccount();
System.out.println(accountList);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("accountList");
modelAndView.addObject("accountList",accountList);
return modelAndView;
}
@RequestMapping("/transMoney")
public ModelAndView transMoney(@RequestParam int sourceId,@RequestParam int targetId,@RequestParam int money){
boolean fla = accountService.transMoney(sourceId,targetId,money);
System.out.println("转账成功:"+fla);
ModelAndView modelAndView=new ModelAndView();
modelAndView.setViewName("sucess");
if (fla){
modelAndView.addObject("msg","转账成功!");
}else{
modelAndView.addObject("msg","转账失败!");
}
return modelAndView;
}
}
6.在applicationContexConfig.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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描-->
<context:component-scan base-package="service"/>
<context:component-scan base-package="entity"/>
<!--导入db.properties-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!-- 配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
<!-- 配置SqlSessionFactoryBean-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置dao接口所在的位置,这里采用的注解配置mybatis的dao接口-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" id="mapperScannerConfigurer">
<property name="basePackage" value="dao"></property>
</bean>
<!-- 添加事务管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知-->
<tx:advice transaction-manager="transactionManager" id="transactionInterceptor">
<!-- 配置事务的属性 -->
<tx:attributes>
<tx:method name="saveAccount" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="updateAccount" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="deleteAccount" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="findAccount" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
<tx:method name="findAllAccount" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 配置切面点,这里表示对AccountServiceImpl.java中的每个方法都起作用-->
<aop:pointcut id="pt" expression="execution(* service.impl.AccountServiceImpl.*(..))"/>
<aop:advisor advice-ref="transactionInterceptor" pointcut-ref="pt"></aop:advisor>
</aop:config>
</beans>
7.启动Tomcat进行测试。经过测试发现每个功能都正确,配置的事务管理也正确。
本项目的代码已经上传到个人博客服务器,若有需要请自行下载:http://moyisuiying.com/index.php/javastudy/254.html