第一步:实现转账业务
- 定义Account属性,id,accno(账号),password,banlance,name
- 在AccountMapper中,根据账号和密码查询转账账户的信息,根据账号和姓名查询收款账户信息,根据账户信息修改余额。
//根据账户信息修改余额
<update id="updBalanceByAccno" parameterType="com.bean.Account">
update account set balance=balance+#{balance} where accno=#{accno}
</update>
- 错误信息提示可以是int、String主要看你想返回什么信息。在AccountService中定义一个类似如下的常量。在AccountServiceImpl中可以直接调用。
//账号和密码不匹配状态码
public static final int ACCOUNT_PASSWORD_NOT_MATCH=1;
- 在AccountServiceImpl中,代码如下。要记得session.commit();
InputStream is= Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession=sqlSessionFactory.openSession();
//先判断账户和密码是否正确
Account accOutSelect=sqlSession.selectOne("com.mapper.accountMapper.selByAccnoPwd", accOut);
//如果不为空,则账户密码正确
if(accOutSelect !=null) {
//判断转账金额是否大于余额
if(accOutSelect.getBalance()>=accOut.getBalance()) {
//判断收款账户是否正确
Account accInSelect =sqlSession.selectOne("com.mapper.accountMapper.selByAccnoName", accIn);
if(accInSelect !=null){
//设置收款金额
accIn.setBalance(accOut.getBalance());
//金额设置负值,则转账总金额减少
accOut.setBalance(-accOut.getBalance());
//更新收款、转账账户余额
int index=sqlSession.update("com.mapper.accountMapper.updBalanceByAccno", accOut);
index+=sqlSession.update("com.mapper.accountMapper.updBalanceByAccno",accIn);
if(index==2) {
//转账成功,向日志表中做记录
Log log=new Log();
log.setAccin(accIn.getAccno());
log.setAccout(accOut.getAccno());
log.setMoney(accIn.getBalance());
sqlSession.insert("com.mapper.logMapper.addlog",log);
//日志文件记录转账时间等信息
Logger logger=Logger.getLogger(accountServiceImpl.class);
logger.info(log.getAccout()+"给"+log.getAccin()+"在"+new Date().toLocaleString()+"转了"+log.getMoney());
sqlSession.commit();
sqlSession.close();
return SUCCES;
}else {
//转账失败
sqlSession.rollback();
sqlSession.close();
return ERROR;
}
}else {
//收款账户不正确
return ACCOUNT_NAME_NOT_MATCH;
}
}else {
//余额不足
return ACCOUNT_BALANCE_NOT_ENOUGH;
}
}else {
//账户密码不正确
return ACCOUNT_PASSWORD_NOT_MATCH;
}
5.在AccountServlet中接收各种参数。若转账不成功,可能是中文乱码,设置相关参数。
//在AccountServlet中
req.setCharacterEncoding("UTF-8");
在mybatis.xml文件中
<property name="url" value="jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=UTF-8"/>
第二步:日志记录转账记录,分页显示
- 定义Log属性,id,accOut(转账账户),accIn(收款账户),money
定义PageInfo属性,pageSize(每页显示个数)、pageNumber(当前页数)、total(总页数)、list(当前页显示的数据)。private List<?> list;因为分页显示何种类型数据不清楚,所以用?代替。 - 在logMapper中,将转账记录记入到log中,查询每页显示数据,查询总共有多少数据。
pageStart为当前页从第几个开始
<select id="selByPage" parameterType="map" resultType="com.bean.Log">
select * from log limit #{pageStart},#{pageSize}
</select>
<select id="selCount" resultType="long">
select count(*) from log
</select>
3.在logServiceImpl中,pageSize和pageNumber都是接收的数据。total和list需要计算。
Map<String, Object> map=new HashMap<>();
map.put("pageSize", pageSize);
map.put("pageStart", pageSize*(pageNumber-1));
pi.setList(sqlSession.selectList("com.mapper.studentMapper.selPage", map));
long total=sqlSession.selectOne("com.mapper.studentMapper.selCount");
pi.setTotal(total%pageSize==0?total/pageSize:total/pageSize+1);
4.在logServlet中。第一次访问,pageSize和pageNumber没有传递参数,要设置默认值。
String pageSizeStr=req.getParameter("pageSize");
int pageSize=2;
if(pageSizeStr !=null && !pageSizeStr.equals("")) {
pageSize=Integer.parseInt(pageSizeStr);
}
String pageNumberStr=req.getParameter("pageNumber");
int pageNumber=1;
if(pageNumberStr !=null && !pageNumberStr.equals("")) {
pageNumber=Integer.parseInt(pageNumberStr);
}
5.在jsp页面中,对上一页和下一页的获取参数的获取,而且要判断当第一页时,点击无效,最后一页时,点击无效。
<!--判断当第一页和最后一页时,点击无效。
<c:if test="${pageInfo.pageNumber<=1 }">onclick="javascript:return false;"</c:if>
<c:if test="${pageInfo.pageNumber>=pageInfo.total }">onclick="javascript:return false;"</c:if>-->
//show为servlet中@webservlet中的值。&中没有空格。
<a href="show?pageSize=${pageInfo.pageSize }&pageNumber=${pageInfo.pageNumber-1}" >上一页</a>
<a href="show?pageSize=${pageInfo.pageSize }&pageNumber=${pageInfo.pageNumber+1}" >下一页</a>
总结:功能简单,记录下来只是为了方便复习,不喜勿喷。