在web中应用mybatis

搭建环境

数据库表的设计

create table bank(id bigint auto_increment primary key ,actno varchar(255) comment "账号",balance decimal(15,2) comment "余额"
);
insert into bank values(1,'act001',50000);
insert into bank values(2,'act002',0);

添加依赖

 <!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><!--mysql驱动依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><!--junit依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><!--logback依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version></dependency><!--servlet依赖--><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0</version><scope>provided</scope></dependency><build><finalName>mybatis-004-web</finalName><pluginManagement><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></pluginManagement></build>

引入配置文件

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/xun
jdbc.username=root
jdbc.password=root
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="jdbc.properties"/><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><!--一定要注意这里的路径哦!!!--><mapper resource="AccountMapper.xml"/></mappers>
</configuration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="account"></mapper>

前端页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>银行账户转账</title>
</head>
<body>
<!--/bank是应用的根,部署web应用到tomcat的时候一定要注意这个名字-->
<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>

业务代码编写

定义pojo类

package com.xun.bank.pojo;public class Account {private Long id;private String actno;private Double balance;@Overridepublic String toString() {return "Account{" +"id=" + id +", actno='" + actno + '\'' +", balance=" + balance +'}';}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public Double getBalance() {return balance;}public void setBalance(Double balance) {this.balance = balance;}public Account(Long id, String actno, Double balance) {this.id = id;this.actno = actno;this.balance = balance;}public Account() {}
}

编写AccountDao接口,以及AccountDaoImpl实现类

dao类

是负责对数据进行操作的类,只负责数据的增删改查,不牵扯到任何业务

分析dao中至少要提供几个方法,才能完成转账:

  • 转账前需要查询余额是否充足:selectByActno
  • 转账时要更新账户:update
package com.xun.bank.dao;import com.xun.bank.pojo.Account;public interface AccountDao {//根据账号获取用户信息Account selectByActno(String actno);//更新账户信息int update(Account act);
}
package com.xun.bank.daoimpl;import com.xun.bank.dao.AccountDao;
import com.xun.bank.pojo.Account;
import com.xun.bank.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;public class AccountDaoImpl implements AccountDao {@Overridepublic Account selectByActno(String actno) {SqlSession sqlSession = SqlSessionUtil.openSession();Account act =(Account) sqlSession.selectOne("selectByActno",actno);//进行类型强转sqlSession.close();return act;}@Overridepublic int update(Account act) {SqlSession sqlSession = SqlSessionUtil.openSession();int count = sqlSession.update("update", act);sqlSession.commit();sqlSession.close();return count;}
}

写了dao类,就需要用到SQL映射文件了

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="account"><select id="selectByActno" resultType="com.xun.bank.pojo.Account">select id,actno,balance from bank where actno = #{actno};</select><update id="update">update bank set balance = #{balance} where actno =#{actno};</update></mapper>

编写AccountService接口以及AccountServiceImpl

service类专注于处理业务

package com.xun.bank.service;import com.xun.bank.exception.AppException;
import com.xun.bank.exception.MoneyNotEnoughException;public interface AccountService {void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException;
}
package com.xun.bank.serviceimpl;import com.xun.bank.dao.AccountDao;
import com.xun.bank.daoimpl.AccountDaoImpl;
import com.xun.bank.exception.AppException;
import com.xun.bank.exception.MoneyNotEnoughException;
import com.xun.bank.pojo.Account;
import com.xun.bank.service.AccountService;public class AccountServiceImpl implements AccountService {AccountDao accountDao = new AccountDaoImpl();@Overridepublic void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException {//查出转出账户余额Account fromact = accountDao.selectByActno(fromActno);if(fromact.getBalance() < money){throw new MoneyNotEnoughException("对不起,账户余额不足");}try{Account toact = accountDao.selectByActno(toActno);fromact.setBalance(fromact.getBalance() - money);toact.setBalance(toact.getBalance() + money);accountDao.update(fromact);accountDao.update(toact);}catch(Exception e){throw new AppException("转账失败,未知原因");}}
}

编写异常类

package com.xun.bank.exception;public class MoneyNotEnoughException extends Exception{public MoneyNotEnoughException(){}public MoneyNotEnoughException(String msg){ super(msg); }
}
package com.xun.bank.exception;public class AppException extends Exception{public AppException(){}public AppException(String msg){ super(msg); }
}

编写AccountController

controller类是控制器,接受前端的请求,调用相关的service完成业务

package com.xun.bank.controller;import com.xun.bank.exception.AppException;
import com.xun.bank.exception.MoneyNotEnoughException;
import com.xun.bank.service.AccountService;
import com.xun.bank.serviceimpl.AccountServiceImpl;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/transfer")
public class AccountController extends HttpServlet {private AccountService accountService= new AccountServiceImpl();@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取响应流response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();String fromActno = request.getParameter("fromActno");String toActno = request.getParameter("toActno");double money = Integer.parseInt(request.getParameter("money"));try{accountService.transfer(fromActno,toActno,money);out.println("<h1>转账成功!!!</h1>");}catch (MoneyNotEnoughException e){out.println(e.getMessage());}catch (AppException e){out.println(e.getMessage());}}
}

项目展示

数据库

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

期刊《International Journal of Information Security》

International Journal of Information Security 官网截图 出版选项 自由选择OA或者订阅 Aims and scope 投稿方向 Latest issue Volume 82 In progress (May 2024) This issue is in progress but contains articles that are final and fully citable. 有一篇: Vol…

数据分析-Pandas数据y轴双坐标设置

数据分析-Pandas数据y轴双坐标设置 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

YOLOv8旋转目标检测实战:训练自己的数据集

课程链接&#xff1a;https://edu.csdn.net/course/detail/39393 旋转目标检测是计算机视觉领域的一个高级任务&#xff0c;它在传统目标检测的基础上进一步发展。传统目标检测技术主要关注于识别和定位图像中的物体&#xff0c;通常以水平边界框(HBB)来标识目标物体的位置。而…

深入浅出计算机网络 day.1 概论① 信息时代的计算机网络

我想&#xff0c; 我不会暗下来的&#xff0c; 生命是周而复始的橙黄橘绿时 —— 24.3.9 内容概述 计算机网络的各类应用 计算机网络带来的负面问题 我国互联网发展情况 一、计算机网络的各类应用 1.信息浏览和发布 2.通信和交流 3.休闲和娱乐 4.资源共享…

文件包含漏洞初识

一、基础知识介绍 在web后台开发的时候&#xff0c;我们会使用PHP&#xff0c;Java这种代码&#xff0c;而在使用的过程中&#xff0c;我们经常会使用包含函数&#xff08;也就是调用&#xff09;&#xff0c;而很多时候&#xff0c;前端用户在选择浏览时会调用包含的文件这无…

python-三引号去除缩进

在Python中&#xff0c;三引号用于表示多行字符串或文档注释。三引号内的文本可以包含任何字符&#xff0c;包括换行符和引号。在使用三引号表示多行字符串时&#xff0c;Python会将三引号中的所有内容作为一个字符串处理。 缩进是Python中非常重要的一个概念&#xff0c;它用…

流浪动物救助小程序|基于微信小程序的流浪动物救助系统设计与实现(源码+数据库+文档)

流浪动物救助小程序目录 目录 基于微信小程序的流浪动物救助系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、寻宠信息管理 3、动物求助管理 4、论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐…

算法详解——leetcode150(逆波兰表达式)

欢迎来看博主的算法讲解 博主ID&#xff1a;代码小豪 文章目录 逆波兰表达式逆波兰表达式的作用代码将中缀表达式转换成后缀表达式文末代码 逆波兰表达式 先来看看leetcode当中的原题 大多数人初见逆波兰表达式的时候大都一脸懵逼&#xff0c;因为与平时常见的表达式不同&am…

el-table 插入输入框并进行校验

<template><div><el-form :model"list" ref"ruleForm"><el-table :data"list.tableData" style"width: 100%"><el-table-column prop"time" label"日期" width"180"><…

一周学会Django5 Python Web开发-Django5内置模板引擎-模板标签

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计33条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

HCIA-HarmonyOS设备开发认证V2.0-习题2

目录 习题一习题二坚持就有收获 习题一 # 判断题## 1.PWM占空比指的是低电平时间占周期时间的百分比。(错误)正确(True)错误(False)解题&#xff1a; - PWM占空比指的是高电平时间占周期时间的百分比## 2.UART是通用异步收发传输器&#xff0c;是通用串行数据总线&#xff0c;…

ROS2学习(七) Foxy版本ros2替换中间件。

在ros2使用的过程中&#xff0c;一开始选用的foxy版本&#xff0c;后来发现&#xff0c;foxy版本的ros2有很多问题。一个是foxy版本已经停止维护了。另一个问题是这个版本有很多bug, 后续的版本在功能实现上做了很大的改动&#xff0c;甚至说进行了重写。修复的一些问题&#x…

动态规划

动态规划 动态规划&#xff08;DP&#xff09;是一种对问题的状态空间进行分阶段、有顺序、不重复、决策性遍历的算法。关键与前提 重叠子问题&#xff1a;与递归、分治等一样&#xff0c;要具有同类子问题&#xff0c;用若干维状态表示。最优子结构&#xff1a;状态对应着一个…

四、软考-系统架构设计师笔记-信息系统基础知识

1、信息系统概述 信息系统的定义 信息系统是由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的以处理信息流为目的的人机一体化系统。 信息系统任务是对原始数据进行收集、加工、存储&#xff0c;并处理产生各种所需信息&#xff0c;以不同的方式…

修改Android打包apk的名字和目录

app打包生成apk后通常需要进行备份&#xff0c;但是要区分好哪个apk是什么版本的、什么时候打包的&#xff0c;以方便以后区分使用。 最开始的想法是把版本号、创建时间这些加在apk文件名上即可&#xff0c;但是公司要求apk使用一个固定的名称&#xff0c;那我怎么保存版本号信…

Ubuntu平铺左、右、上、下、1/2、1/4窗口(脚本)

前言 之前因为一直在用Ubuntu 18或者Ubuntu 20然后发现装了GNOME插件后&#xff0c;电脑在使用过程中&#xff0c;会时不时的卡死&#xff08;鼠标没问题&#xff0c;键盘输入会有10-20秒的延迟&#xff09;频率基本是一小时一次&#xff0c;因为这种卡顿会很容易打断思路&…

Jenkins 部署 RuoYi

目录 1、项目介绍 2、部署若依 clone 源代码 导入数据库到 node-16 修改 RuoYi 配置文件 推送 RuoYi 项目至 Gitlab 3、配置 Jenkins 配置本地 Maven Jenkins 配置 Maven 新建 Maven 项目 编写构建后的脚本 Jenkins 构建后执行脚本 4、Jenkins 传递参数 设置项目部…

React 19 Cheat Sheet

React 19让构建网站和应用程序变得更容易&#xff0c;更好。有了很酷的新东西&#xff0c;比如React编译器、Actions API和更好的Hooks&#xff0c;编写代码变得更快&#xff0c;管理应用程序的数据变得更简单 React 19让构建网站和应用程序变得更容易&#xff0c;更好。有了很…

maven 进行jdbc 查询

a. 在pom.xml 增加 依赖 mysql-connector-java依赖b. 编写 实体类, 按照 数据库表 生成对应的 类数据库类型 java 类型int intvarchar Stringdatetime java.util.Date注意事项: 属性名 采用 驼峰式命名法实体类 要求采用 封装的写…

MySQL之主从同步(openEuler版)

实验目的&#xff1a; 基于binlog和gtid两种方法实现主从同步 实验过程&#xff1a; 一、使用binlog方法实现MySQL的主从同步 主库配置 配置文件&#xff1a; [rootopeneuler ~]# vim /etc/my.cnf//进入mysql配置文件配置server_id [rootopeneuler ~]# tail -1 /etc/my.cn…