结合spring IOC AOP Mybatis写一个简易的银行转账案例
1.在mysql數據庫引入如下sql文件
-- ---------------------------- -- Table structure for `t_account` -- ---------------------------- DROP TABLE IF EXISTS `t_account`; CREATE TABLE `t_account` (`aid` int(10) NOT NULL AUTO_INCREMENT,`apwd` varchar(100) NOT NULL,`money` double DEFAULT NULL,`uid` int(10) NOT NULL,PRIMARY KEY (`aid`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ---------------------------- -- Records of t_account -- ---------------------------- INSERT INTO `t_account` VALUES ('1', '123', '10000', '1'); INSERT INTO `t_account` VALUES ('2', '456', '10000', '2');-- ---------------------------- -- Table structure for `t_user` -- ---------------------------- DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` (`uid` int(10) NOT NULL AUTO_INCREMENT,`uname` varchar(100) NOT NULL,`pwd` varchar(100) NOT NULL,PRIMARY KEY (`uid`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;-- ---------------------------- -- Records of t_user -- ---------------------------- INSERT INTO `t_user` VALUES ('1', '張三', '123'); INSERT INTO `t_user` VALUES ('2', '李四', '456');2.搭建Spring+Mybatis項目開發的環境
(1) 創建web項目
(2) 在web-inf下創建lib文件夾,并導入整合的jar包
(3) 在src創建MVC的包結構
注意:將表的實體類文件創建
(4) 在src下創建spring的配置文件
applicationcontext.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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!--配置數據源bean--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://localhost:3306/502"></property><property name="username" value="root"></property><property name="password" value="1234"></property></bean><!--配置工廠bean--><bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property></bean><!--配置mapper掃描bean--><bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactory" ref="factory"></property><property name="basePackage" value="com.bjsxt.mapper"></property></bean><!--配置業務層bean--><!--用戶登錄--><bean id="us" class="com.bjsxt.service.impl.UserServiceImpl"><property name="userMapper" ref="userMapper"></property></bean><!--配置信息校驗--><bean id="checkAccountService" class="com.bjsxt.service.impl.CheckAccountServiceImpl"><property name="checkAccountMapper" ref="checkAccountMapper"></property></bean><!--配置通知bean--><bean id="before" class="com.bjsxt.advice.MyBefore"></bean><bean id="after" class="com.bjsxt.advice.MyAfter"></bean><!--配置AOP組裝規則--><aop:config><aop:pointcut id="mp" expression="execution(* com.bjsxt.service.impl.UserServiceImpl.userLoginService(String,String))"/><aop:advisor advice-ref="before" pointcut-ref="mp"></aop:advisor><aop:advisor advice-ref="after" pointcut-ref="mp"></aop:advisor></aop:config><!--開啟cglib代理模式--><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> </beans>(5) 在web.xml文件中配置Spring文件路徑和監聽器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!--聲明全局變量--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationcontext.xml</param-value></context-param><!--配置監聽器--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>3.創建一個登錄頁面login.jsp
<%--Created by IntelliJ IDEA.User: zypDate: 2020/3/5Time: 16:45To change this template use File | Settings | File Templates. --%> <%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><base href="<%=basePath %>"/><title>Title</title> </head> <body><h3 align="center">歡迎登錄502班級銀行轉賬系統</h3><hr><div style="width: 400px;margin: auto"><c:if test="${sessionScope.flag=='userFail'}"><font color="red" size="20px;">用戶名或密碼錯誤</font></c:if><c:remove var="flag" scope="session"></c:remove><form action="userLogin" method="post"><table style="margin: auto;margin-top: 30px;" cellpadding="10px"><tr><td>用戶名:</td><td><input type="text" name="uname" value=""></td></tr><tr><td>密碼:</td><td><input type="password" name="pwd" value=""></td></tr><tr><td colspan="2"><input type="submit" value="點擊登錄"></td></tr></table></form></div> </body> </html>4.完成登錄功能 UserServlet
package com.bjsxt.controller;import com.bjsxt.pojo.User; import com.bjsxt.service.UserService; import com.bjsxt.service.impl.UserServiceImpl; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils;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;@WebServlet(value = "/userLogin",loadOnStartup = 1) public class UserServlet extends HttpServlet {//聲明init方法,完成Spring資源的初始化加載private UserServiceImpl us;@Overridepublic void init() throws ServletException {//獲取Spring容器對象ApplicationContext ac= WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());//獲取業務層對象us= (UserServiceImpl) ac.getBean("us");}//聲明service方法,完成請求的處理@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//設置請求編碼格式req.setCharacterEncoding("utf-8");//設置響應編碼格式resp.setContentType("text/html;charset=utf-8");resp.setCharacterEncoding("utf-8");//獲取請求信息String uname=req.getParameter("uname");String pwd=req.getParameter("pwd");//處理請求//調用業務層方法根據用戶名和密碼獲取用戶信息User user = us.userLoginService(uname, pwd);//響應處理結果//獲取Session對象HttpSession session=req.getSession();//響應if(user!=null){//將用戶信息存儲到session中session.setAttribute("user",user);//重定向到主頁面resp.sendRedirect(req.getContextPath()+"/main.jsp");}else{//增加失敗標記session.setAttribute("flag","userFail");//重定向到登錄頁面resp.sendRedirect(req.getContextPath()+"/login.jsp");}} }UserService
package com.bjsxt.service;import com.bjsxt.pojo.User;public interface UserService {//用戶登錄User userLoginService(String uname, String pwd); }UserServiceImpl
package com.bjsxt.service.impl;import com.bjsxt.mapper.UserMapper; import com.bjsxt.pojo.User; import com.bjsxt.service.UserService;public class UserServiceImpl implements UserService {//聲明mapper層屬性private UserMapper userMapper;public UserMapper getUserMapper() {return userMapper;}public void setUserMapper(UserMapper userMapper) {this.userMapper = userMapper;}//用戶登錄@Overridepublic User userLoginService(String uname, String pwd) {return userMapper.userLoginMapper(uname,pwd);} }UserMapper
package com.bjsxt.mapper;import com.bjsxt.pojo.User; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select;public interface UserMapper {//根據用戶名和密碼獲取用戶信息@Select("select * from t_user where uname=#{uname} and pwd=#{pwd}")User userLoginMapper(@Param("uname") String uname, @Param("pwd") String pwd); }5.創建main.jsp的頁面
<%--Created by IntelliJ IDEA.User: zypDate: 2020/3/5Time: 17:31To change this template use File | Settings | File Templates. --%> <%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><base href="<%=basePath %>"/><title>Title</title><%--引入jquery文件--%><script type="text/javascript" src="js/j.js"></script><%--聲明js代碼域--%><script type="text/javascript">/*********************************聲明頁面加載事件************************/$(function () {//創建顏色數組var colors=["red","yellow","black","green","gray","blue","brown","darhorchid"];//使用間隔執行window.setInterval(function () {//獲取0-8的隨機整數,含0不含8var index=Math.floor(Math.random()*colors.length);//設置標題顏色$("#title").css("color",colors[index]);},100)})/*********************轉賬賬戶信息校驗**************************************///給密碼框添加焦點事件,完成校驗$(function () {$("#outdPwd").blur(function () {//發起ajax請求$.post("checkAccount",{outId:$("#outId").val(),outPwd:$("#outdPwd").val(),methodName:"checkOutInfo"},function (data) {if(eval(data)){$("#outSpan").html("√").css("color","green").addClass("success").removeClass("error");}else{$("#outSpan").html("X").css("color","red").addClass("error").removeClass("success");}})})})/*********************轉賬金額校驗**************************************/$(function () {$("#money").blur(function () {//發起ajax請求$.post("checkAccount",{outId:$("#outId").val(),money:$("#money").val(),methodName:"checkMoneyInfo"},function (data) {if(eval(data)){$("#moneySpan").html("√").css("color","green").addClass("success").removeClass("error");}else{$("#moneySpan").html("X").css("color","red").addClass("error").removeClass("success");}})})})/*********************收款人信息校驗**************************************/$(function () {$("#inName").blur(function () {//發起ajax請求$.post("checkAccount",{inId:$("#inId").val(),inName:$("#inName").val(),methodName:"checInInfo"},function (data) {if(eval(data)){$("#inNameSpan").html("√").css("color","green").addClass("success").removeClass("error");}else{$("#inNameSpan").html("X").css("color","red").addClass("error").removeClass("success");}})})})/*********************轉賬功能**************************************/$(function () {$("#btn").click(function () {//校驗轉賬信息是否正確if($(".success").length==3){//提及表單$("#fm").submit();}else{alert("請填寫正確的賬戶信息")}})})</script> </head> <body><%--網頁的主題--%><h3 align="center"><%--跑馬燈效果--%><marquee width=400 behavior=alternate direction=left align=middle><font color="r" id="title">歡迎${sessionScope.user.uname}登錄502班級銀行轉賬系統</font></marquee></h3><%--水平線--%><hr><%--銀行轉賬表單--%><div style="width: 400px;margin: auto;"><form action="checkAccount" method="post" id="fm"><input type="hidden" name="methodName" value="transferInfo"><table style="margin: auto;margin-top: 30px;" cellpadding="10px"><tr><td>轉賬賬戶:</td><td><input type="text" id="outId" name="outId" value=""></td></tr><tr><td>轉賬賬戶密碼:</td><td><input type="password" id="outdPwd" value=""><span id="outSpan"></span></td></tr><tr><td>金額:</td><td><input type="text" name="money" id="money" value=""><span id="moneySpan"></span></td></tr><tr><td>收款賬號:</td><td><input type="text" id="inId" name="inId" value=""></td></tr><tr><td>收款人姓名:</td><td><input type="text" id="inName" value=""><span id="inNameSpan"></span></td></tr><tr><td colspan="2"><input type="button" id="btn" value="開始轉賬"></td></tr></table></form></div> </body> </html>6.CheckAccountServlet
package com.bjsxt.controller;import com.bjsxt.pojo.Account; import com.bjsxt.service.CheckAccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;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;@WebServlet(value = "/checkAccount",loadOnStartup = 2) public class CheckAccountServlet extends HttpServlet {//聲明業務層屬性private CheckAccountService checkAccountService;//重寫init方法@Overridepublic void init() throws ServletException {//獲取Spring容器對象ApplicationContext ac=new ClassPathXmlApplicationContext("applicationcontext.xml");//獲取業務層對象checkAccountService= (CheckAccountService) ac.getBean("checkAccountService");}//重寫service方法@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//設置請求編碼格式req.setCharacterEncoding("utf-8");//設置響應編碼格式resp.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");//獲取請求數據中的方法名String methodName=req.getParameter("methodName");//根據請求調用對應的邏輯代碼if("checkOutInfo".equals(methodName)){checkOutInfo(req,resp);}else if("checkMoneyInfo".equals(methodName)){checkMoneyInfo(req,resp);}else if("checInInfo".equals(methodName)){checInInfo(req,resp);}else if("transferInfo".equals(methodName)){transferInfo(req,resp);}else{System.out.println("沒有對應的邏輯方法:"+methodName);}}//轉賬private void transferInfo(HttpServletRequest req, HttpServletResponse resp) throws IOException {//獲取請求數據String outId=req.getParameter("outId");String inId=req.getParameter("inId");String money=req.getParameter("money");//處理請求int i=checkAccountService.transferInfoService(outId,inId,money);//響應結果if(i>0){resp.sendRedirect(req.getContextPath()+"/success.jsp");}else{resp.sendRedirect(req.getContextPath()+"/error.jsp");}}//校驗收款人信息private void checInInfo(HttpServletRequest req, HttpServletResponse resp) throws IOException {//獲取請求數據String inId=req.getParameter("inId");String inName=req.getParameter("inName");//處理請求Account account=checkAccountService.checkInInfoService(inId,inName);//響應結果resp.getWriter().write(account!=null?"true":"false");}//校驗金額private void checkMoneyInfo(HttpServletRequest req, HttpServletResponse resp) throws IOException {//獲取請求數據String outId=req.getParameter("outId");String money =req.getParameter("money");//處理請求Account account=checkAccountService.checkMoneyInfoService(outId,money);//響應結果resp.getWriter().write(account!=null?"true":"false");}//聲明方法:校驗轉賬賬戶信息private void checkOutInfo(HttpServletRequest req, HttpServletResponse resp) throws IOException {//獲取請求信息String outId=req.getParameter("outId");String outPwd=req.getParameter("outPwd");//處理請求//調用業務層方法Account account = checkAccountService.checkOutAccountInfoService(outId, outPwd);//響應結果resp.getWriter().write(account!=null?"true":"false");}}7.CheckAccountService
package com.bjsxt.service;import com.bjsxt.pojo.Account;public interface CheckAccountService {//校驗轉賬賬戶信息Account checkOutAccountInfoService(String outId,String outPwd);//校驗金額Account checkMoneyInfoService(String outId, String money);//校驗收款人信息Account checkInInfoService(String inId, String inName);//轉賬功能int transferInfoService(String outId, String inId, String money); }8.CheckAccountServiceImpl
package com.bjsxt.service.impl;import com.bjsxt.mapper.CheckAccountMapper; import com.bjsxt.pojo.Account; import com.bjsxt.service.CheckAccountService;public class CheckAccountServiceImpl implements CheckAccountService {//聲明mapper層屬性private CheckAccountMapper checkAccountMapper;public CheckAccountMapper getCheckAccountMapper() {return checkAccountMapper;}public void setCheckAccountMapper(CheckAccountMapper checkAccountMapper) {this.checkAccountMapper = checkAccountMapper;}//轉賬功能@Overridepublic int transferInfoService(String outId, String inId, String money) {//1.出賬int i = checkAccountMapper.transferOut(outId, money);//2.入賬i+=checkAccountMapper.transferIn(inId,money);//返回return i;}//校驗收款人信息@Overridepublic Account checkInInfoService(String inId, String inName) {return checkAccountMapper.checkInInfoMapper(inId,inName);}//校驗金額@Overridepublic Account checkMoneyInfoService(String outId, String money) {return checkAccountMapper.checkMoneyInfoMapper(outId,money);}//校驗轉賬賬戶信息@Overridepublic Account checkOutAccountInfoService(String outId, String outPwd) {return checkAccountMapper.checkAccountOutInfoMapper(outId,outPwd);} }9.CheckAccountMapper
package com.bjsxt.mapper;import com.bjsxt.pojo.Account; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update;public interface CheckAccountMapper {//校驗轉賬賬戶信息:根據賬戶ID和密碼獲取賬戶信息@Select("select * from t_account where aid=#{outId} and apwd=#{outPwd}")Account checkAccountOutInfoMapper(@Param("outId") String outId, @Param("outPwd") String outPwd);//校驗金額@Select("select * from t_account where aid=#{outId} and money>=#{money}")Account checkMoneyInfoMapper(@Param("outId") String outId, @Param("money") String money);//校驗收款人信息@Select("select a.* from t_account a join t_user u on a.uid=u.uid where a.aid=#{inId} and u.uname=#{inName}")Account checkInInfoMapper(@Param("inId") String inId, @Param("inName") String inName);//轉出@Update("update t_account set money=money-#{money} where aid=#{outId}")int transferOut(@Param("outId") String outId,@Param("money") String money);//轉入@Update("update t_account set money=money+#{money} where aid=#{inId}")int transferIn(@Param("inId") String inId,@Param("money") String money); }10.登錄日志
(1) 功能點需求:
我們的銀行轉賬功能,在剛開始運營的時候,并沒有用戶登錄的日志信息的記錄。
后來,某天某個客戶他的賬號被登錄了,但是給該客戶又不知道是什么時間進行的
登錄,造成調查有困擾,怎么辦?在當前登錄功能的基礎上,增加登錄日志,來記 錄用戶的登錄信息。便于我們后期的排查。
(2) 功能分析:
在保留當前登錄功能的基礎上,完成對登錄功能的擴展。但是又不希望改變原有的
功能代碼邏輯??紤]使用SpringAOP。
前置通知:在日志文件中輸出XXX在XXX時間發起了登錄請求
切點:登錄的業務方法
后置通知:在日志文件中輸出XXX在XXX時間登錄成功
建議使用SchemaBased方式實現。
(3) 功能實現:
i. 在lib下導入AOP的jar包
ii. 在src下創建com.bjsxt.advice的包
iii. 在advice包中創建前置通知和后置通知
package com.bjsxt.advice;import org.apache.log4j.Logger; import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;public class MyBefore implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {//獲取Log4j的對象Logger logger = Logger.getLogger(MyBefore.class);//日志輸出logger.debug(objects[0]+"發起了登錄請求");} } package com.bjsxt.advice;import org.apache.log4j.Logger; import org.springframework.aop.AfterReturningAdvice;import java.lang.reflect.Method;public class MyAfter implements AfterReturningAdvice {@Overridepublic void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {//獲取Log4j的對象Logger logger = Logger.getLogger(MyAfter.class);//日志輸出if(o!=null){logger.debug(objects[0]+"登錄成功");}} }iv. 在src下聲明log4j.properties配置文件
log4j.rootCategory=infolog4j.logger.com.bjsxt.mapper=debug, CONSOLE,LOGFILE log4j.logger.com.bjsxt.advice=debug, CONSOLE,LOGFILE log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=- %c-%d-%m%nlog4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=D:/axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=- %c-%d-%m%nv. 在applicationcontext.xml文件中配置通知bean以及組裝規則
測試:ok!
總結
以上是生活随笔為你收集整理的结合spring IOC AOP Mybatis写一个简易的银行转账案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 递归删除目录中文件
- 下一篇: 免费代理IP网站