当前位置: 首页 > news >正文

Mybatis(4)之跟着老杜做一个简单的银行转账会话

这是个MVC项目,我不一定可以完整的实现这个项目,但力求把这个复现出来,尽量的复现细节。

第一步:创建数据库  表

创建表如下:

我们使用 int 是为了方便 然后采用  demcial,精确度较高

添加两个用户

然后开始构建Web项目

然后完善  依赖

加上 mysql  mybatis         log4j       servlet的依赖

    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.31</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.0</version><scope>provided</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>

然后配置 mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="logImpl" value="LOG4J"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value=""/><property name="url" value=""/><property name="username" value=""/><property name="password" value=""/></dataSource></environment></environments><mappers></mappers>
</configuration>

我们如果将数据库的配置信息直接写到里面的话会导致后期修改过于麻烦,因此我们可以写到xx.properties中,后期修改方便

主要是使用 ${}里面填写相应的名字,就可以获取到db.properties的数据了,写法如下:

<configuration><properties resource="database.properties" ></properties><settings><setting name="logImpl" value="LOG4J"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers></mappers>
</configuration>

db的内容如下:

driver = com.mysql.cj.jdbc.Driver
url  = jdbc:mysql://localhost:3306/prostudydb
username = 
password = 

然后我们先来写个简单的查询语句测试一下,看是否可以获得对应的数据,是否数据库部分配置好。

那么我们就需要先粗步的完善项目构造,首先需要一个pojo类,或者叫做entiry类

public class account {private  Integer id;private  Integer actno;private  Long  balance; public  account(){}public account(Integer id, Integer actno, Long balance) {this.id = id;this.actno = actno;this.balance = balance;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getActno() {return actno;}public void setActno(Integer actno) {this.actno = actno;}public Long getBalance() {return balance;}public void setBalance(Long balance) {this.balance = balance;}@Overridepublic String toString() {return "account{" +"id=" + id +", actno=" + actno +", balance=" + balance +'}';}
}

完成有参 无参 get set tostring的方法,然后我们需要创建util层,提供一个静态的工具类,提供我们需要的sqlsession 。

然后是utils类,请注意,utils类中需要使用静态方法,因为工具类我们只需要使用就可以了,不需要实例化对象,因此在类加载的时候编译一次即可

public class sqlSession {
//    一个静态的 SqlSessionFactory ,我们需要它在opensession中使用,因此需要声明一下private static SqlSessionFactory sqlSessionFactory;static {try {
//            类加载的时候初始化sqlsessionfactorySqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();sqlSessionFactory =    sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));} catch (IOException e) {throw new RuntimeException("在utils下的sqlsessionfactorybuilder中出现的异常"+ e);}}
//    返回sqlsession的方法  返回需要的sqlsessionpublic  static SqlSession           openSession    (){return   sqlSessionFactory.openSession();}//    执行selectone的方法/*** int id* sqlsession sqlsession* 因为要返回pojo对象,所以我们需要返回account ,通过传入id + 一个session,我们就可以得到需要的数据* */public  static    account getOneAccount(SqlSession sqlSession,Integer id ){account  account = new account();account   =    sqlSession.selectOne("account.selectById",id);return  account;}
}

然后我们看一下测试方法

   public  void  get(){
//    调用静态方法获取对象SqlSession sqlsession = sqlSession.openSession();System.out.println(sqlsession);
//   得到值account a =       sqlSession.getOneAccount(sqlsession,1);System.out.println(a);
}
}

看一下xxxmapper的内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="account"><select id="selectById" resultType="pojo.account">select *  from try where id = #{id}</select></mapper>

成功获取到数据,证明数据库和后端交流通常

然后我们来完成简单的前端部分和tomcat的配置

首先是一个简单的inex.html 一个web.xml请注意web.xml的版本尽可能高,最好是4

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>账户尝试</title>
</head>
<body><h1>阿达是大大大是</h1>
</body>
</html>
<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"id="WebApp_ID" version="4.0"></web-app>

配置好tomcat后运行一下发现ok,接下来就是完善表格 获取http传来的会话

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>账户尝试</title>
</head>
<body><h1>阿达是大大大是</h1><form action="/tranfser"  method="post"><span>账号1</span>       <input  type="text"    name="shuzhi1"      ><br><span>账户2</span>      <input   type="text"  name="shuzhi2"     ><input  type="submit" value="提交" ></form>
</body>
</html>

请在这里暂停,捋一下思路。

前端发送数据  通过 transfer 转交json数据给后端,我们可以通过req.getParmare通过name获得数据,那么我们就需要重写HttpServlet。

我们需要在controller中获取前端传来的数据,然后包装在一个新的account对象中。

并且通过方法完成字符串的转变为int long的转变

@WebServlet("/tranfser")
public class transeferOnetoAnother extends  HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String shuzhi =  req.getParameter("shuzhi2");Long shuzhi1 = Long.parseLong(req.getParameter("shuzhi1"));System.out.println(shuzhi1);System.out.println("3333333333333333333333333333");
//               通过parseLong将字符串转变为longLong shuzhi2 = Long.parseLong(shuzhi);account account01 = new account();account01.setBalance(shuzhi1);account01.setId(1);account account02 = new account();account02.setBalance(shuzhi2);account02.setId(2);

然后我们就要调用service中处理转账的方法,我们就可以传递两个account对象。

请注意service中我们要先写接口,在实现方法,通过接口命名方法有好处如下:方便设计和沟通,我们可以由一个人设计出接口,分给每个人实现,这样可以提高效率并且控制。2.可以解耦合,实现更高的耦合度,需要增加功能的话,我们不需要改动原来的代码,只需要正在接口中增加一个新的抽象方法,然后在用一个新的实现类实现它,保障原代码的安全性。

public interface transfer {
//    通过返回int看是否成功,我们可以通过两个实体类,然后查看它的值,来判断是否转账int transferOneToAnother(account account1, account account2);
}public class  transferImpl    implements transfer {@Overridepublic int transferOneToAnother(account account1, account account2) {
//           第一步,将后端的两个数据查询出来
//        我们需要查询所有,通过list来获取,完善select
/**        第一步 在accountMapper中完善Select语句,填写好id  selectAll*       第二步 前往utils中,编写查询所有的方法 输入  sqlsession 返回list集合,*       第三步  回到这里  完善业务处理方法** **/SqlSession sqls = sqlSession.openSession();
/*        请注意,我们这里是静态方法,必须调用类,我们通过调用静态方法获得session 在传值,这样是不是多次一举呢?* 事实上,mybatis默认在数据库连接池中维护了10个数据库连接,我们需要保证每次获取的session相同,这点我也不清楚,QAQ* **/List<account> list =  sqlSession.getAll(sqls);account a01 = list.get(0);account a02  = list.get(1);
//       比较数值 假如是从  1  转账给 2   那我们怎么知道是从 1 转账给 2 呢??
/*
* 模拟的话就是只要其中一个有数字 ,那么加 另一个减少只实现一个加的功能不提供减的
* *//*** 请注意这里   account1  和 a01 的区别,一个是我们从前端传递后来包装的  一个是从数据库中包装的* */if (account1.getBalance()   > a01.getBalance() ){System.out.println("钱不够");}else {
//            那么账户1需要更新,然后我们需要调用更新语句  更新数据库的值
//            返回到mapper完善更新语句  sqlsession完善更新需要的方法/** 更新语句  需要  sqlSession   id   balance  通过返回int值看是否成功 int <1 则是失败* */if ((sqlSession.updateOne(sqls,a01.getId(), a01.getBalance()-account1.getBalance()) < 1)){System.out.println("更新语句失败");}else{
//                   session提交 session关闭sqls.commit();sqls.close();}}return 0;}
}

同时,我们需要在service的实现类中调用实现好的Select 和 update方法,实现查找和更改

    public  static  int  updateOne(  SqlSession sqlSession,      int id,Long balance   ){account account = new account();account.setId(id);account.setBalance(balance);int   count =          sqlSession.update("updatesOne",account);return   count;}

最主要的就是形式参数的确定和一致

我们给出更新语句

<update id="updatesOne">update try set balance = #{balance} where id = #{id}
</update>

请注意 务必封装成一个完整的account类,我们才能调用session.update方法进行自动匹配传递值。

然后基本上就实现了更改。

 

 

相关文章:

Mybatis(4)之跟着老杜做一个简单的银行转账会话

这是个MVC项目&#xff0c;我不一定可以完整的实现这个项目&#xff0c;但力求把这个复现出来&#xff0c;尽量的复现细节。 第一步&#xff1a;创建数据库 表 创建表如下&#xff1a; 我们使用 int 是为了方便 然后采用 demcial&#xff0c;精确度较高 添加两个用户 然后…...

VBA提高篇_ 22 事件处理

文章目录1.事件编程2.常用工作簿事件名称与对应处理过程名称示例3. 事件编程的步骤4&#xff0e;工作簿事件4.1 Open4.2 BeforeClose4.3 NewSheet5&#xff0e;工作表事件6&#xff0e;变量和过程函数的作用域1.事件编程 写在事件发生地(对应工作簿或工作表) 2.常用工作簿事…...

【蓝桥杯集训·周赛】AcWing 第91场周赛

文章目录第一题 AcWing 4861. 构造数列一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4862. 浇花一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4861. 构造数列一、题目1、原题…...

【人工智能AI】三、NoSQL 实战《NoSQL 企业级基础入门与进阶实战》

帮我写一篇介绍NoSQL的技术文章&#xff0c;文章标题是《NoSQL 实战》&#xff0c;不少于3000字。这篇文章的目录是 3.NoSQL 实战 3.1 MongoDB 入门 3.1.1 MongoDB 基本概念 3.1.2 MongoDB 安装与配置 3.1.3 MongoDB 数据库操作 3.2 Redis 入门 3.2.1 Redis 基本概念 3.2.2 Red…...

platform 总线

驱动的分离与分层思想 分离&#xff1a;硬件信息分离&#xff1b; 在编写硬件驱动的时候&#xff0c;需要操作许多硬件寄存器。比如gpio 驱动&#xff0c;你需要知道gpio控制器 寄存器的地址&#xff0c;你想要哪个gpio输出&#xff1f;或是输入? 这些操作最终都是靠设置寄存…...

2023第10届生物发酵展3月30-4月1号山东济南开展,参观路线来了

2023第10届生物发酵展3月30-4月1号山东济南开展&#xff0c;参观路线来了&#xff01;展会时间&#xff1a;2023年3月30日-4月1日展馆地址&#xff1a;山东国际会展中心&#xff08;济南市槐荫区日照路1号&#xff09;展馆&#xff1a;4号馆、5号馆BIO CHINA生物发酵展&#xf…...

RK356x U-Boot研究所(命令篇)3.6 fdt命令的用法

平台U-Boot 版本Linux SDK 版本RK356x2017.09v1.2.3文章目录 一、fdt命令的配置二、fdt命令的定义三、fdt命令的用法3.1 fdt list3.2 fdt rm3.3 fdt set一、fdt命令的配置 .config配置文件需要有以下配置: rk3568_defconfig默认已使能。 二、fdt命令的定义 usb命令定义在cm…...

2023年社工工资多少钱一月 能领多少补贴

2023年社会工作者人员的待遇还算可以&#xff0c;每月的全额工资一共5000多&#xff0c;扣完五险一金以后每月的到手工资一共4000多&#xff0c;不同地区薪资也是不同的&#xff0c;一线城市会在7千元以上&#xff0c;还可以领取几百到几千元不等的补贴。 12023年社工工资多少钱…...

面试攻略,Java 基础面试 100 问(十一)

抽象类&#xff08;abstract class&#xff09;和接口&#xff08;interface&#xff09;有什么异同? 抽象类和接口都不能够实例化&#xff0c;但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现&#xff…...

接口测试(Fiddler工具)

目录 1.Fiddler是什么&#xff1f; 2.Fiddler的原理 3.Fiddler安装 4.Fiddler界面 4.1.常用工具 4.2 会话列表 4.3 状态栏 4.4 内容显示区 1.Fiddler是什么&#xff1f; Fiddler是客户端与服务器之间的HTTP代理&#xff0c;是当前最常用的HTTP协议抓包工具。 主要功能&a…...

Debian/Ubuntu 安装和使用 perf 调试工具

为操作系统安装基本依赖环境&#xff1a;apt-get update -y apt-get upgrade -y apt-get install lrzsz zip unzip libkrb5-dev libicu-dev screen iftop openssl libssl-dev libunwind8 iftop net-tools gcc gdb cmake curl wget -y apt-get install gcc gdb cmake python-dev…...

【Python语言基础】——Python NumPy 数组连接

Python语言基础——Python NumPy 数组连接 文章目录 Python语言基础——Python NumPy 数组连接一、Python NumPy 数组连接一、Python NumPy 数组连接 连接 NumPy 数组 连接意味着将两个或多个数组的内容放在单个数组中。 在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按…...

解决IDEA报错:无效的目标发行版: 17

解决IDEA报错&#xff1a;无效的目标发行版: 17 目录解决IDEA报错&#xff1a;无效的目标发行版: 17报错由来解决报错【1】检查setting设置&#xff0c;查看编译器编译模块的编译版本是否是你需要的【2】尝试去修改当前项目的启动设置&#xff0c;设置JRE为你需要的版本。【3】…...

Redis第四讲

目录 四、Redis04 4.1 Redis集群应用场景 4.2 集群 4.2.1 基本原理 4.2.2 主从复制的作用 4.3 配置集群&#xff08;一台虚拟机&#xff09; 4.3.1 规划网络 4.3.2 创建节点 4.3.3 创建目录 4.3.4 配置redis7001.conf 4.3.5 配置其余文件 4.3.6 后台启动redis 4.3…...

Linux Ubuntu 软件安装与卸载

文章目录1 下载 deb 安装包后安装2 清理安装包3 卸载安装2 Ubuntu升级某个软件参考&#xff1a;1 下载 deb 安装包后安装 进入下载位置&#xff0c;执行 terminal sudo dpkg -i *.deb推荐sudo apt install *.deb 2 清理安装包 sudo apt-get install 会将下载的文件放在 /var…...

metasploit穷举模块

目录 工具介绍 常用模块 参数介绍 工具使用 工具介绍 Metasploit框架(Metasploit Framework, MSF)是一个开源工具&#xff0c; 旨在方便渗透测试&#xff0c;它是由Ruby程序语言编写的模板化框架&#xff0c;具有很好的扩展性&#xff0c;便于渗透测试人员开发、使用定制的…...

day35 贪心算法 | 435、无重叠区间 763、划分字母区间 56、合并区间

题目 435、无重叠区间 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], […...

C++Primer15.5节练习

练习15.18&#xff1a; Base* p &d1&#xff1a;合法 p &d2&#xff1a;不合法&#xff0c;只有当派生类公有地继承基类时&#xff0c;用户代码才能使用派生类向基类的转换 p &d3&#xff1a;不合法&#xff0c;只有当派生类公有地继承基类时&#xff0…...

【日常点滴019】Python制作流浪气球游戏(导弹射击类)

Python制作流浪气球游戏&#xff08;导弹射击类&#xff09;教学课程代码&#xff08;分步教学版&#xff09;1、构建全局通用代码结构2、构建气球精灵类3、构建导弹精灵类4、碰撞检测5、构建游戏信息类 &#xff08;最终完整代码&#xff09;教学课程代码&#xff08;分步教学…...

effective c++阅读之旅---条款29

为"异常安全"而努力是值得的&#xff01; 什么是异常安全&#xff1f; 所谓的"异常安全"&#xff0c;往往值得是函数接口的异常安全&#xff0c;它要求函数满足两个条件&#xff1a; 异常抛出时&#xff1a; 1、不泄露任何资源 2、不允许数据被破坏 异常安…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…...