mybatis学习笔记之在WEB中应用MyBatis
文章目录
- 数据库表的设计和准备数据
- 环境搭建
- 前端页面编写
- 后端代码实现
- 后端代码目录
- dao层
- service
- web
- pojo
- Utils
数据库表的设计和准备数据


环境搭建
在pom.xml中配置依赖(logback、mybatis、mysql、servlet)
注意引入tomcat
前端页面编写
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>银行账户转账</title>
</head>
<body><form action="/bank/transfer" method="post">转出账户:<input type="text" name="fromActno"><br>转入账号:<input type="text" name="toActno"><br>转账金额:<input type="text" name="money"><br><input type="submit" value="转账"></form>
</body>
</html>
后端代码实现
后端代码目录

dao层
//AccountDaoImpl
package com.example.bank.dao.impl;import com.example.bank.dao.AccountDao;
import com.example.bank.pojo.Account;
import com.example.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;public class AccountDaoImpl implements AccountDao {@Overridepublic Account selectByActno(String actno) {SqlSession sqlSession = SqlSessionUtil.openSession();Account account = (Account) sqlSession.selectOne("account.selectByActno", actno);sqlSession.close();return account;}@Overridepublic int updateByActno(Account act) {SqlSession sqlSession = SqlSessionUtil.openSession();int count = sqlSession.update("account.updateByActno",act);sqlSession.commit();sqlSession.close();return count;}
}
package com.example.bank.dao;import com.example.bank.pojo.Account;//dao对象中的任何一个方法和业务不挂钩,没有任何业务逻辑在里面
//DAO中的方法就是做CRUD的
public interface AccountDao {//根据账号查询账户信息Account selectByActno(String actno);//更新账户信息int updateByActno(Account act);
}
dao层是三层架构的最底层,是数据访问层,主要是连接MySQL,并做数据的CRUD,不包含任何的逻辑
service
//AccountServiceImpl
package com.example.bank.service.impl;import com.example.bank.dao.AccountDao;
import com.example.bank.dao.impl.AccountDaoImpl;
import com.example.bank.exceptions.MoneyNotEnoughException;
import com.example.bank.exceptions.TransferException;
import com.example.bank.pojo.Account;
import com.example.bank.service.AccountService;public class AccountServiceImpl implements AccountService {private AccountDao accountDao = new AccountDaoImpl();@Overridepublic void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, TransferException {//1、判断转出账户的余额是否充足Account fromAct = accountDao.selectByActno(fromActno);if (fromAct.getBalance() < money){//2、如果转出账户余额不足,提示用户throw new MoneyNotEnoughException("对不起,您的余额不足");}//3、如果转出账户余额充足,更新转出账户余额(update)//先更新内存中java对象account的余额Account toAct = accountDao.selectByActno(toActno);fromAct.setBalance(fromAct.getBalance() - money);toAct.setBalance(toAct.getBalance() + money);int count = accountDao.updateByActno(fromAct);//4、更新转入账户余额(update)count += accountDao.updateByActno(toAct);if (count != 2){throw new TransferException("转账异常,未知原因");}}}
//AccountService
package com.example.bank.service;import com.example.bank.exceptions.MoneyNotEnoughException;
import com.example.bank.exceptions.TransferException;public interface AccountService {
// @param fromActno 转出账号
// @param toActno 转入账号
// @param money 转账金额void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, TransferException;
}
service层是业务逻辑层,主要是对数据进行逻辑的处理,页面的改变等。这里的逻辑主要就是对余额先进行能否转移的判断,其次是对账户余额的转移改变,最后就是对不同错误的出现返回不同的错误类型
web
//AccountServlet
package com.example.bank.web;import com.example.bank.exceptions.MoneyNotEnoughException;
import com.example.bank.exceptions.TransferException;
import com.example.bank.service.AccountService;
import com.example.bank.service.impl.AccountServiceImpl;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("/transfer")
public class AccountServlet extends HttpServlet {//为了让这个对象在其他方法中也可以用private AccountService accountService = new AccountServiceImpl();@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException{//获取表单数据String fromActno = request.getParameter("fromActno");String toActno = request.getParameter("toActno");double money = Double.parseDouble(request.getParameter("money"));try {//调用servlet的转账方法完成转账。(调业务层)accountService.transfer(fromActno,toActno,money);//程序能够走到这里,表示转账一定成功了//调用view完成展示结果response.sendRedirect(request.getContextPath() + "/success.html");} catch (MoneyNotEnoughException e) {response.sendRedirect(request.getContextPath() + "/error1.html");} catch (TransferException e) {response.sendRedirect(request.getContextPath() + "/error2.html");}}
}
展示层,获取表单数据以及针对不同情况错误的出现展示不同的页面信息。
pojo
pojo是封装类,账号的类型里面有的相关数据,一方面能在java中进行数据操作,另一方面对接MySQL的账户信息,方便CRUD。
package com.example.bank.web;import com.example.bank.exceptions.MoneyNotEnoughException;
import com.example.bank.exceptions.TransferException;
import com.example.bank.service.AccountService;
import com.example.bank.service.impl.AccountServiceImpl;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("/transfer")
public class AccountServlet extends HttpServlet {//为了让这个对象在其他方法中也可以用private AccountService accountService = new AccountServiceImpl();@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException{//获取表单数据String fromActno = request.getParameter("fromActno");String toActno = request.getParameter("toActno");double money = Double.parseDouble(request.getParameter("money"));try {//调用servlet的转账方法完成转账。(调业务层)accountService.transfer(fromActno,toActno,money);//程序能够走到这里,表示转账一定成功了//调用view完成展示结果response.sendRedirect(request.getContextPath() + "/success.html");} catch (MoneyNotEnoughException e) {response.sendRedirect(request.getContextPath() + "/error1.html");} catch (TransferException e) {response.sendRedirect(request.getContextPath() + "/error2.html");}}
}
Utils
package com.example.bank.utils;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;public class SqlSessionUtil {private SqlSessionUtil(){}private static SqlSessionFactory sqlSessionFactory;static {try {sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession openSession(){return sqlSessionFactory.openSession();}}
写好的工具类,方便在dao层获取sqlsession对象。
银行转账小功能
相关文章:
mybatis学习笔记之在WEB中应用MyBatis
文章目录 数据库表的设计和准备数据环境搭建前端页面编写后端代码实现后端代码目录dao层servicewebpojoUtils 数据库表的设计和准备数据 环境搭建 在pom.xml中配置依赖(logback、mybatis、mysql、servlet) 注意引入tomcat 前端页面编写 <!DOCTYPE …...
宿主可以访问公网 Docker容器里无法访问 Temporary failure in name resolution
宿主可以访问公网 Docker容器里无法访问 Temporary failure in name resolution 容器参数 docker-compose.yml 的 dns我也设置,按理来说应该可以访问,然而就是不断的按在地上摩擦 web:build: .restart: alwaysports:- "6699:80"dns:- 114.11…...
CentOS7系统MBR、GRUB2、内核启动流程报错问题
目录 🥩Linux启动流程 🥩MBR修复 🍭1、模拟损坏 🍭2、重启测试 🍭3、修复MBR 🍭4、测试系统 🥩GRUB2修复 🍭1、模拟损坏 🍭2、修复GRUB2 🍭3、测试系统 &…...
剑指YOLOv5改进最新MPDIoU损失函数(23年7月首发论文):超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失,高效涨点
💡本篇内容:剑指YOLOv5改进最新MPDIoU损失函数(23年7月首发论文):超越现有多种G/D/C/EIoU,高效准确的边界框回归的损失,高效涨点 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡:重点:该专栏《剑指YOLOv5原创改进》只更新…...
CAN bus off ——ISO11898
什么是can bus off? CAN总线关闭(CAN bus off)是指CAN节点进入一种错误状态,无法继续正常的数据通信。当一个CAN节点的错误计数器超过了设定的阈值时,该节点将进入CAN总线关闭状态。在这种状态下,该节点将停…...
如何评测一个大语言模型?
编者按:大型语言模型(Large language models, LLMs)因其在学术界和工业界展现出前所未有的性能而备受青睐。随着 LLMs 在研究和实际应用中被广泛使用,对其进行有效评测变得愈发重要。近期已有多篇论文围绕大模型的评测进行研究&am…...
React中useMemo和useCallback的区别
一句话来解释,useMemo是缓存值的,useCallback是缓存函数的。 一、useMemo: 接收两个参数,第一个参数是个函数,第二个是依赖项。返回一个memoized值,只有当它的某个依赖项改变时才重新计算 memoized 值&…...
SpringBoot 快速实现IP地址解析
如果使用本地ip 解析的话,我们将会借助ip2region,该项目维护了一份较为详细的本地ip 地址对应表,如果为了离线环境的使用,需要导入该项目依赖,并指定版本,不同版本的方法可能存在差异。 <dependency>…...
亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单
在电商领域,补单是一种常见的推广方式。它能够优化商品销售、留下优质评论、打压竞品和赶走跟卖等,具有很多好处。然而,补单也存在安全性问题,有些卖家找人补单后店铺反而出了问题。因此,了解测评系统是非常重要的的。…...
ubuntu挂载ext4文件系统
文章目录 1.虚拟机分配10G磁盘用来挂载ext4文件系统2.磁盘分区3.创建文件系统4.挂载文件系统5.卸载文件系统6.使用ior测试ext4三种日志模式(1)ordered(2)journal(3)writeback 1.虚拟机分配10G磁盘用来挂载e…...
MySQL 读写分离
目录 一、什么是读写分离? 二、为什么要读写分离呢? 三、什么时候要读写分离? 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1)基于程序代码内部实现 2)基于中间代理层实现…...
【多线程例题】顺序打印abc线程
顺序打印-进阶版 方法一:三个线程竞争同一个锁,通过count判断是否打印 方法二:三个线程同时start,分别上锁,从a开始,打印后唤醒b 三个线程分别打印A,B,C 方法一:通过co…...
WebSocket工具类
最近的项目在整长连接WebSocket,之前也写过一个感觉没有这个全面。提供个工具类WebSocketHelper和Java-WebSocket-1.3.9.jar包以及一个HttpURLConnectionUtil 1、WebSocketHelper import android.util.Log;import org.java_websocket.client.WebSocketClient; imp…...
Linux 的 crontab
Linux 的 crontab 是一个用于在特定时间运行命令或脚本的工具。每个用户都可以创建自己的 crontab 文件来安排定时任务。 以下是使用 Linux crontab 的基本步骤: 打开终端或命令行界面。 输入以下命令来编辑当前用户的 crontab 文件: crontab -e如果是…...
十二.Redis模拟集群搭建
配置环境 查看环境信息 127.0.0.1:6379> info replication #查看当前redis的信息 # Replication role:master #角色 master主机 connected_slaves:0 #从机数量为0 master_failover_state:no-failover master_replid:115f37a0ec195680ef754d6915738b0c0a05f450 master_replid…...
IDEA导入微服务项目后自动将微服务展示在service面板中
有时候,不会自动将微服务展示在service面板中。 添加service面板: service面板: 更新所有maven,就可以自动将微服务展示在service面板中。...
MySQL体系结构及执行过程
一、MySQL体系结构 1、网络连接层 客户端连接器(Client Cnnectors):提供支持与MySQL服务器建立连接。 建立连接命令:mysql -h -u -p -h指定MySQL服务的IP 若本地连接则不需要 每一个连接均会保存用户权限,中途修改权…...
21. MySQL基础知识
文章目录 一、索引B Tree 原理1. 数据结构2. 操作3. 与红黑树的比较 MySQL 索引1. BTree 索引2. 哈希索引3. 全文索引4. 空间数据索引 索引优化1. 独立的列2. 多列索引3. 索引列的顺序4. 前缀索引5. 覆盖索引 索引的优点索引的使用条件 二、查询性能优化使用 Explain 进行分析优…...
【ArcGIS Pro微课1000例】0029:绘制全球海洋波纹荡漾效果图
本文讲解ArcGIS Pro3.0中,基于全球航洋面状矢量数据,绘制震撼全球海洋波纹荡漾效果图。 文章目录 一、效果预览二、效果制作三、参数详解一、效果预览 绘制好的海水波纹荡漾效果图如下: 下面我们来学习绘制过程。 二、效果制作 波纹荡漾效果需要在全局或者局部场景中制作…...
2023“钉耙编程”中国大学生算法设计超级联赛(3)8-bit Zoom
2023“钉耙编程”中国大学生算法设计超级联赛(3)8-bit Zoom 题解 有一张尺寸为 n n n\times n nn的图片,你要将图片放大成大小为 n Z 100 n Z 100 \dfrac{nZ}{100}\times \dfrac{nZ}{100} 100nZ100nZ的图片。 当下列任何一个条件不成…...
3步搞定OpenClaw镜像体验:Kimi-VL-A3B-Thinking云端沙盒部署
3步搞定OpenClaw镜像体验:Kimi-VL-A3B-Thinking云端沙盒部署 1. 为什么选择云端沙盒体验OpenClaw 作为一个长期在本地折腾各种AI工具的技术爱好者,我深刻理解配置环境的痛苦。记得第一次尝试在MacBook上部署OpenClaw时,光是解决Node.js版本…...
npx vs npm run:深度对比与最佳实践指南
npx vs npm run:深度对比与最佳实践指南 【免费下载链接】npx execute npm package binaries (moved) 项目地址: https://gitcode.com/gh_mirrors/np/npx 在Node.js生态系统中,npx和npm run是两个至关重要的命令行工具,它们都能执行np…...
模糊聚类实战:用传递闭包法给教师教学质量打分,附Python完整代码
模糊聚类实战:用传递闭包法给教师教学质量打分 教育评价从来不是非黑即白的判断题。当我们试图对教师的教学质量进行分类时,传统的硬性划分方法往往掩盖了教师能力之间的渐变与过渡。四位教师在师德师表、教学过程等五项指标上的评分差异,可能…...
SEO数据分析资源网
SEO数据分析资源网:揭秘成功的关键 在当前数字化竞争日益激烈的环境中,SEO(搜索引擎优化)已经成为企业提升在线可见度和吸引客户的重要手段。SEO并不是一蹴而就的事情,而是需要不断的数据分析和调整。今天,…...
bilibili-parse:让B站视频解析变得简单高效的PHP工具
bilibili-parse:让B站视频解析变得简单高效的PHP工具 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 价值定位:为什么选择bilibili-parse 当你需要在自己的项目中集成B站视频…...
D3作业1-K8s 存储与服务实验手册(实验1-4)
前置准备:配置Harbor私有仓库 # 在k8s-harbor1上执行# 1. 下载镜像 docker pull registry.cn-hangzhou.aliyuncs.com/zhangshijie/nginx:1.22.0-alpine# 2. 打标签 docker tag registry.cn-hangzhou.aliyuncs.com/zhangshijie/nginx:1.22.0-alpine 192.168.44.104/library/ng…...
基于DSP28335逆变器程序,单相全桥逆变器程序,采用双极性调制 程序逻辑清晰,注释详细,详...
基于DSP28335逆变器程序,单相全桥逆变器程序,采用双极性调制 程序逻辑清晰,注释详细,详细到几乎每一句都有注释,对于小白异常友好,有些地方甚至基本原理都补充写明了,百分之99的程序注释不会有我…...
矽力杰 Silergy SY8521 降压稳压器 佰祥电子
100V母线辅助供电的“空间魔术”:SY8521全集成同步降压方案实战拆解在隔离型通信偏置电源、BMS高压从板以及汽车电子的48V/60V系统中,硬件团队在设计辅助供电轨时常常面临极其严苛的物理与电气双重挑战。系统母线在遭遇抛负载(Load Dump&…...
突破百度网盘限速壁垒:开源直链解析工具的技术实践与效率革命
突破百度网盘限速壁垒:开源直链解析工具的技术实践与效率革命 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在数字资源日益丰富的今天,百度网盘作为国…...
2025最权威的六大降AI率方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 减少AIGC(人工智能生成内容)的痕迹,要从多方面入手&…...
