mybatis能力提升:完成 转账功能,日志记录功能,分页查询

在这里插入图片描述

实体类
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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值