实体类
Account.java
package com.wj.pojo;
/**
* @Auther: wj
* @Date: 2019/9/11
* @Description: com.wj.mapper.pojo
* @version: 1.0
*/
public class Account {
private int id;
private String accno;
private int password;
private String name;
private double balance;
public Account() {
}
public Account(int id, String accno, int password, String name, double balance) {
this.id = id;
this.accno = accno;
this.password = password;
this.name = name;
this.balance = balance;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAccno() {
return accno;
}
public void setAccno(String accno) {
this.accno = accno;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account{" +
"id=" + id +
", accno='" + accno + '\'' +
", password=" + password +
", name='" + name + '\'' +
", balance=" + balance +
'}';
}
}
Log.java
package com.wj.pojo;
/**
* @Auther: wj
* @Date: 2019/9/14
* @Description: com.wj.pojo
* @version: 1.0
*/
public class Log {
private int id;
private String accout;
private String accin;
private double money;
public Log() {
}
public Log(int id, String accout, String accin, double money) {
this.id = id;
this.accout = accout;
this.accin = accin;
this.money = money;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAccout() {
return accout;
}
public void setAccout(String accout) {
this.accout = accout;
}
public String getAccin() {
return accin;
}
public void setAccin(String accin) {
this.accin = accin;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Log{" +
"id=" + id +
", accout='" + accout + '\'' +
", accin='" + accin + '\'' +
", money=" + money +
'}';
}
}
PageInfo.java
package com.wj.pojo;
import java.util.List;
/**
* @Auther: wj
* @Date: 2019/9/14
* @Description: com.wj.pojo
* @version: 1.0
*/
public class PageInfo {
private int PageSize;
private int pageNumber;
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
private long total;
private List<?> list;
public PageInfo() {
}
public PageInfo(int pageSize, int pageNumber, int total, List<?> list) {
PageSize = pageSize;
this.pageNumber = pageNumber;
this.total = total;
this.list = list;
}
public int getPageSize() {
return PageSize;
}
public void setPageSize(int pageSize) {
PageSize = pageSize;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
@Override
public String toString() {
return "PageInfo{" +
"PageSize=" + PageSize +
", pageNumber=" + pageNumber +
", total=" + total +
", list=" + list +
'}';
}
}
LogService.java
package com.wj.service;
import com.wj.pojo.PageInfo;
import java.io.IOException;
/**
* @Auther: wj
* @Date: 2019/9/14
* @Description: com.wj.service
* @version: 1.0
*/
public interface LogService {
/**
* 分页显示
* @param pageSize 每页显示个数
* @param pageNumber 显示页数
* @return
*/
PageInfo showPage(int pageSize,int pageNumber) throws IOException;
}
AccountService.java
package com.wj.service;
import com.wj.pojo.Account;
import java.io.IOException;
/**
* @Auther: wj
* @Date: 2019/9/11
* @Description: com.wj.service
* @version: 1.0
*/
public interface AccountService {
/**
* 账号和密码不匹配状态码
*/
int ACCOUNT_PASSWORD_NOT_MATCH=1;
/**
*账户余额不足
*/
int ACCOUNT_BALANCE_NOT_ENOUGH=2;
/**
*账户和姓名不匹配
*/
int ACCOUNT_NAME_NOT_MATCH=3;
/**
*转账失败
*/
int ERROR=4;
/**
*转账成功
*/
int SUCCESS=5;
/**
* 转账
* @param accIn 收款
* @param accOut 打款
* @return
*/
int transfer(Account accIn,Account accOut) throws IOException;
}
LogServiceImpl.java
package com.wj.service.Impl;
import com.wj.pojo.Log;
import com.wj.pojo.PageInfo;
import com.wj.service.LogService;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Auther: wj
* @Date: 2019/9/14
* @Description: com.wj.service.Impl
* @version: 1.0
*/
public class LogServiceImpl implements LogService {
@Override
public PageInfo showPage(int pageSize, int pageNumber) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
Map<String ,Object> map=new HashMap<>();
map.put("pageStart",pageSize*(pageNumber-1));
map.put("pageSize",pageSize);
List<Log> list = session.selectList("com.wj.mapper.LogMapper.selByPage", map);
long count = session.selectOne("com.wj.mapper.LogMapper.selCount");
PageInfo pi=new PageInfo();
pi.setList(list);
pi.setPageNumber(pageNumber);
pi.setPageSize(pageSize);
pi.setTotal(count%pageSize==0?count/pageSize:count/pageSize+1);
return pi;
}
}
AccountServiceImpl.java
package com.wj.service.Impl;
import com.wj.pojo.Account;
import com.wj.pojo.Log;
import com.wj.service.AccountService;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
/**
* @Auther: wj
* @Date: 2019/9/11
* @Description: com.wj.service.Impl
* @version: 1.0
*/
public class AccountServiceImpl implements AccountService {
@Override
public int transfer(Account accIn, Account accOut) throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
//先判断账户和密码是否匹配
Account accOutSelect = session.selectOne("com.wj.mapper.AccountMapper.selByAccnoPwd",accOut);
if(accOutSelect!=null){//账户和密码匹配
if(accOutSelect.getBalance()>=accOut.getBalance()){//账户金额>=转账金额
Account accInSelect = session.selectOne("com.wj.mapper.AccountMapper.selByAccnoName", accIn);
if(accInSelect!=null){
accIn.setBalance(accOut.getBalance());
accOut.setBalance(-accOut.getBalance());
int index = session.update("com.wj.mapper.AccountMapper.updBalanceByAccno", accOut);
index += session.update("com.wj.mapper.AccountMapper.updBalanceByAccno", accIn);
if(index==2){
//日志表记录
Log log=new Log();
log.setAccout(accOut.getAccno());
log.setAccin(accIn.getAccno());
log.setMoney(accIn.getBalance());
session.insert("com.wj.mapper.LogMapper.insLog",log);
//日志文件记录
Logger logger=Logger.getLogger(AccountServiceImpl.class);
logger.info(log.getAccout()+"给"+log.getAccin()+"在"
+new Date().toLocaleString()+"转了"+log.getMoney());
session.commit();
session.close();
return SUCCESS;
}else{
session.rollback();
session.close();
return ERROR;
}
}else{
//账户和姓名不匹配
return ACCOUNT_NAME_NOT_MATCH;
}
}else{
//余额不足
return ACCOUNT_BALANCE_NOT_ENOUGH;
}
}else{
//账号和密码不匹配
return ACCOUNT_PASSWORD_NOT_MATCH;
}
}
}
AccoutController.java
package com.wj.controller;
import com.wj.pojo.Account;
import com.wj.service.AccountService;
import com.wj.service.Impl.AccountServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Auther: wj
* @Date: 2019/9/11
* @Description: com.wj.controller
* @version: 1.0
*/
@WebServlet("/transfer")
public class AccountController extends HttpServlet {
private AccountService accountServiceImpl=new AccountServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
Account accOut=new Account();
accOut.setAccno(req.getParameter("accOutAccno"));
accOut.setPassword(Integer.parseInt(req.getParameter("accOutPassword")));
accOut.setBalance(Double.parseDouble(req.getParameter("accOutBalance")));
Account accIn =new Account();
accIn.setAccno(req.getParameter("accInAccno"));
accIn.setName(req.getParameter("accInName"));
int index = accountServiceImpl.transfer(accIn, accOut);
if(index==AccountService.SUCCESS){
resp.sendRedirect("/show");
}else{
HttpSession session = req.getSession();
session.setAttribute("code",index);
resp.sendRedirect("/error/error.jsp");
}
}
}
LogController.java
package com.wj.controller;
import com.wj.service.Impl.LogServiceImpl;
import com.wj.service.LogService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @Auther: wj
* @Date: 2019/9/14
* @Description: com.wj.controller
* @version: 1.0
*/
@WebServlet("/show")
public class LogController extends HttpServlet {
private LogService logServiceImpl=new LogServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
int pageSize=2;
String pageSizeStr = req.getParameter("pageSize");
if(pageSizeStr!=null&&!pageSizeStr.equals("")){
pageSize=Integer.parseInt(pageSizeStr);
}
int pageNumber=1;
String pageNumberStr=req.getParameter("pageNumber");
if(pageNumberStr!=null&&!pageNumberStr.equals("")){
pageNumber=Integer.parseInt(pageNumberStr);
}
req.setAttribute("pageinfo",logServiceImpl.showPage(pageSize,pageNumber));
req.getRequestDispatcher("/log.jsp").forward(req,resp);
}
}
AccountMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wj.mapper.AccountMapper">
<!--根据账户和密码查询信息-->
<select id="selByAccnoPwd" resultType="account" parameterType="account">
select * from account where accno=#{accno} and password=#{password};
</select>
<!--根据账号和姓名查询账户信息-->
<select id="selByAccnoName" resultType="account" parameterType="account">
select * from account where accno=#{accno} and name=#{name};
</select>
<!--根据id修改账户余额-->
<update id="updBalanceByAccno" parameterType="account">
update account set balance=balance+#{balance} where accno=#{accno}
</update>
</mapper>
LogMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wj.mapper.LogMapper">
<insert id="insLog" parameterType="log">
insert into log values(default,#{accout},#{accin},#{money});
</insert>
<select id="selByPage" parameterType="map" resultType="log">
select * from log limit #{pageStart},#{pageSize};
</select>
<select id="selCount" resultType="long">
select count(*) from log;
</select>
</mapper>
log4j.properties
log4j.rootCategory=INFO,CONSOLE,LOGFILE
log4j.logger.com.wj.mapper=DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %d{yyyy-MM-dd hh:mm:ss} %L %m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=E:/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%m %n
mybatis.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="LOG4J"/>
</settings>
<typeAliases>
<package name="com.wj.pojo"/>
</typeAliases>
<!--default引用environment的id,表示当前使用的环境-->
<environments default="default">
<!--声明可能使用的环境-->
<environment id="default">
<!--使用原生JDBC事务-->
<transactionManager type="JDBC"></transactionManager>
<!--数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xxx"/>
<property name="username" value="xxx"/>
<property name="password" value="xxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/wj/mapper/AccountMapper.xml"/>
<mapper resource="com/wj/mapper/LogMapper.xml"/>
</mappers>
</configuration>
index.jsp
<%--
Created by IntelliJ IDEA.
User: 萌萌萌萌的金
Date: 2019/9/11
Time: 21:23
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="transfer" method="post">
转账账号:<input type="text" name="accOutAccno"><br>
密码:<input type="text" name="accOutPassword"><br>
金额:<input type="text" name="accOutBalance"><br>
收款账号:<input type="text" name="accInAccno"><br>
收款姓名:<input type="text" name="accInName"><br>
<input type="submit" value="转账">
</form>
</body>
</html>
log.jsp
<%--
Created by IntelliJ IDEA.
User: 萌萌萌萌的金
Date: 2019/9/11
Time: 21:24
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1px">
<tr>
<th>转账账号</th>
<th>收款账号</th>
<th>转账金额</th>
</tr>
<c:forEach items="${pageinfo.list}" var="log">
<tr>
<td>${log.accout}</td>
<td>${log.accin}</td>
<td>${log.money}</td>
</tr>
</c:forEach>
</table>
<a href="show?pageSize=${pageinfo.pageSize}&pageNumber=${pageinfo.pageNumber-1}"
<c:if test="${pageinfo.pageNumber<=1}">
οnclick="javaScript:return false"
</c:if>
>上一页</a>
<a href="show?pageSize=${pageinfo.pageSize}&pageNumber=${pageinfo.pageNumber+1}"
<c:if test="${pageinfo.pageNumber>=pageinfo.total}">
οnclick="javaScript:return false"
</c:if>
>下一页</a>
</body>
</html>