MyBatis学习笔记二之转账加日志练习

实现转账功能

一.新建数据库及表

1.

2.插入测试数据

3.结果截图

二.新建bank项目、导入jar包、写mybatis全局配置文件

<?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.bjsxt.pojo"/>
	</typeAliases>
	<environments default="default">
		<environment id="default">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"/>
				<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
				<property name="username" value="root"/>
				<property name="password" value="root"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/bjsxt/mapper/AccountMapper.xml"/>
		<mapper resource="com/bjsxt/mapper/LogMapper.xml"/>//(10)之后
	</mappers>
</configuration>

三.新建pojo包

(1)Account.java

package com.bjsxt.pojo;

public class Account {
	private int id;
	private String accNo;
	private int password;
	private String name;
	private double 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;
	}
}

三.新建mapper包

(2)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.bjsxt.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>
	<!-- 根据accNo修改账户余额 -->
	<update id="updBalanceByAccno" parameterType="account">
		update account set balance=balance+#{balance} where accno=#{accNo}
	</update>
</mapper>

四.新建service包

(3)AccountService.java

package com.bjsxt.service;

import java.io.IOException;

import com.bjsxt.pojo.Account;

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;
}

五.新建service.impl包

(4)AccountServiceImpl.java

package com.bjsxt.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

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 com.bjsxt.pojo.Account;
import com.bjsxt.pojo.Log;
import com.bjsxt.service.AccountService;

public class AccountServiceImpl implements AccountService {

	@Override
	public int transfer(Account accIn, Account accOut) throws IOException {
		InputStream is = Resources.getResourceAsStream("mybatis.xml");//操作mybatis
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);//构造器
		SqlSession session = factory.openSession();	
	    //一个业务就是一个session对象
		//先判断帐号和密码是否匹配
		Account accOutSelect = session.selectOne("com.bjsxt.mapper.AccountMapper.selByAccnoPwd",accOut);
		if(accOutSelect!=null){
                 //余额大于要转账的钱
			if(accOutSelect.getBalance()>=accOut.getBalance()){
				Account accInSelect  = session.selectOne("com.bjsxt.mapper.AccountMapper.selByAccnoName",accIn);
				if(accInSelect!=null){
					accIn.setBalance(accOut.getBalance());
					accOut.setBalance(-accOut.getBalance());
					int index = session.update("com.bjsxt.mapper.AccountMapper.updBalanceByAccno",accOut);//session调用修改
					index += session.update("com.bjsxt.mapper.AccountMapper.updBalanceByAccno",accIn);
					if(index==2){

						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;
		}
	}

}

六.新建servlet包

(5)TransferServlet.java
 

package com.bjsxt.servlet;

import java.io.IOException;

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 com.bjsxt.pojo.Account;
import com.bjsxt.service.AccountService;
import com.bjsxt.service.impl.AccountServiceImpl;

@WebServlet("/transfer")
public class TransferServlet extends HttpServlet{
	private AccountService accService = 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 = accService.transfer(accIn, accOut);
		if(index==AccountService.SUCCESS){
			resp.sendRedirect("/bank/show");//跳转到控制器
		}else{
			HttpSession session = req.getSession();
			session.setAttribute("code", index);
			resp.sendRedirect("/bank/error/error.jsp");
		}
		
	}
}

七.新建index.jsp、log.jsp、error.jsp(在error的文件夹下)

具体目录结构如下:

(6)error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
对不起操作失败:<br/>
错误原因:
${sessionScope.code}
</body>
</html>

(7)index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="transfer" method="post">
转账账户:<input type="text" name="accOutAccNo"/><br/>
密码:<input type="password" 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>

(8)为了方便开发,使用log4j

 

实现日志功能

一.新建日志表

二.pojo

(9)Log.java

package com.bjsxt.pojo;

public class Log {
	private int id;
	private String accIn;
	private String accOut;
	private double money;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getAccIn() {
		return accIn;
	}
	public void setAccIn(String accIn) {
		this.accIn = accIn;
	}
	public String getAccOut() {
		return accOut;
	}
	public void setAccOut(String accOut) {
		this.accOut = accOut;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
}

三.mapper

(10)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.bjsxt.mapper.LogMapper">
	<insert id="insLog" parameterType="log">
		insert into log values(default,#{accOut},#{accIn},#{money})
	</insert>

</mapper>

四.impl

(11)AccountServiceImpl.java

package com.bjsxt.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;

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 com.bjsxt.pojo.Account;
import com.bjsxt.pojo.Log;
import com.bjsxt.service.AccountService;

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.bjsxt.mapper.AccountMapper.selByAccnoPwd",accOut);
		if(accOutSelect!=null){
			if(accOutSelect.getBalance()>=accOut.getBalance()){
				Account accInSelect  = session.selectOne("com.bjsxt.mapper.AccountMapper.selByAccnoName",accIn);
				if(accInSelect!=null){
					accIn.setBalance(accOut.getBalance());
					accOut.setBalance(-accOut.getBalance());
					int index = session.update("com.bjsxt.mapper.AccountMapper.updBalanceByAccno",accOut);
					index += session.update("com.bjsxt.mapper.AccountMapper.updBalanceByAccno",accIn);
					if(index==2){


						//日志表记录
						Log log = new Log();
						log.setAccIn(accIn.getAccNo());
						log.setAccOut(accOut.getAccNo());
						log.setMoney(accIn.getBalance());
						session.insert("com.bjsxt.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;
		}
	}

}

实现分页查询

一.mapper

(12)LogMapper.xml 

	
	<select id="selByPage" parameterType="map" resultType="log">
		select * from log limit #{pageStart},#{pageSize}
	</select>
	<select id="selCount" resultType="long">
		select count(*) from log
	</select>

二.pojo

(13)PageInfo.java

package com.bjsxt.pojo;

import java.util.List;

public class PageInfo {
	private int pageSize;//每页显示几个
	private int pageNumber;//当前页数
	private long total;//总页数
	private List<?> list;//当前页显示的数据
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getPageNumber() {
		return pageNumber;
	}
	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}
	public long getTotal() {
		return total;
	}
	public void setTotal(long total) {
		this.total = total;
	}
	public List<?> getList() {
		return list;
	}
	public void setList(List<?> list) {
		this.list = list;
	}
	
}

三.service

(14)LogService.java

package com.bjsxt.service;

import java.io.IOException;

import com.bjsxt.pojo.PageInfo;

public interface LogService  {
	/**
	 * 分页显示
	 * @param pageSize
	 * @param pageNumber
	 * @return
	 */
	PageInfo showPage(int pageSize,int pageNumber) throws IOException;
}

四.impl

(15)LogServiceImpl

package com.bjsxt.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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 com.bjsxt.pojo.Log;
import com.bjsxt.pojo.PageInfo;
import com.bjsxt.service.LogService;

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> param = new HashMap<>();
		param.put("pageStart",pageSize*(pageNumber-1));
		param.put("pageSize", pageSize);

		List<Log> list = session.selectList("com.bjsxt.mapper.LogMapper.selByPage",param);
		long count = session.selectOne("com.bjsxt.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;
	}

}

五.servlet

(16)ShowServlet.java

package com.bjsxt.servlet;

import java.io.IOException;

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 com.bjsxt.service.LogService;
import com.bjsxt.service.impl.LogServiceImpl;

@WebServlet("/show")
public class ShowServlet extends HttpServlet {
	private LogService logService = new LogServiceImpl();
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		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", logService.showPage(pageSize, pageNumber));
		req.getRequestDispatcher("/log.jsp").forward(req, resp);
	}
}

六.jsp

(17)log.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
	<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 }"> onclick="javascript:return false;"</c:if>>上一页</a>
<a href="show?pageSize=${pageinfo.pageSize }&pageNumber=${pageinfo.pageNumber+1}" <c:if test="${pageinfo.pageNumber>=pageinfo.total }"> onclick="javascript:return false;"</c:if>>下一页</a>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值