JDBC学习笔记第六篇
#MYSQL代码
CREATE TABLE t_bank(
id iNT PRIMARY KEY AUTO_INCREMENT COMMENT '账号主键',
account VARCHAR(20) NOT NULL UNIQUE COMMENT '账号',
money INT UNSIGNED COMMENT '金额不能为负'
);
INSERT INTO t_bank(account,money)VALUES
('ergouzi',1000),('lvdandan',1000);
SELECT * FROM t_bank;
//BankDao类
package com.shayiheng.api.transaction;
/**
* @Author Tom
* @Date 2023/12/22 13:44
* @Description: bank表的数据库操作方法存储类
*
* 事物的特性
* 1.原子性(Atomicity):指事物是一个不可分割的工作单位,事物中的操作要么都发生,要么一个都不发生
* 2.一致性(Consistency):事物必须使数据库从一个一直性变换到另一个一直性状态
* 3.隔离性(Isolation):事物的隔离性是指一个事物的执行不能被其他事物干扰
* 4.持久性(Durability):持久性是指一个事物一旦被提交,它对数据库中的数据的改变是永久性的
*
* 事物的类型
* 自动提交:每条语句自动存储一个事物中,执行成功自动提交,执行失败自动会滚。
* 手动提交:手动开启事物,添加语句,手动提交或者手动会滚即可!
*
*
* Sql开启事务的方式
* 针对自动提交:关闭自动提交即可,多条语句添加以后,最终手动提交或者回滚!(推荐)
* SET autocommit= off; //关闭当前连接自动事物提交方式
* # 只有当前连接有效
* # 编写SQL语句即可
* SQL
* SQL
* SQL
* #手动提交或者会滚[结束当前的事物]
* COMMIT / ROLLBACK;
* 手动开启事务:开启事物代码,添加SQL语句,事物提交或者事物回滚!(不推荐)
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/**
*
*/
public class BankDao {
/**
* 加钱的数据库操作方法(jdbc)
* @param account 加钱的账号
* @param account 价钱的金额
*/
public void add(String account,int money,Connection connection) throws ClassNotFoundException, SQLException {
//1 2 接收业务层传来的连接
//3.编写SQL语句结果,动态的部分使用?代替
String sql= "update t_bank set money = money + ? where account= ? ;";
//4.创建预编译preparedStatement
PreparedStatement statement = connection.prepareStatement(sql);
//5.占位符赋值
statement.setObject(1,money);
statement.setObject(2,account);
//6.发送sql语句
statement.executeUpdate();
//7.关闭资源
statement.close();
System.out.println("加钱成功");
}
/**
* 加钱的数据库操作方法(jdbc)
* @param account 减钱的账号
* @param account 减钱的金额
*/
public void sub(String account,int money,Connection connection) throws ClassNotFoundException, SQLException {
//1 2 接收业务层传来的连接
//3.编写SQL语句结果,动态的部分使用?代替
String sql= "update t_bank set money = money - ? where account= ? ;";
//4.创建预编译preparedStatement
PreparedStatement statement = connection.prepareStatement(sql);
//5.占位符赋值
statement.setObject(1,money);
statement.setObject(2,account);
//6.发送sql语句
statement.executeUpdate();
//7.关闭资源
statement.close();
System.out.println("减钱成功");
}
}
//BankServer类
package com.shayiheng.api.transaction;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @Author Tom
* @Date 2023/12/22 13:58
* @Description: 银行卡业务方法,调用dao方法
*/
public class BankServer {
@Test
public void start() throws SQLException, ClassNotFoundException {
//二狗子给lu蛋蛋转500
transfer("ergouzi","e",500);
}
//在业务开启事务
public void transfer(String addAccount,String subAccount,int money) throws SQLException, ClassNotFoundException {
BankDao bankDao = new BankDao();
//一个事物的最基本要求,必须是同一个连接对象 connection
//一个转账方法 属于一个事务
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.
getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
//3.开启事务
try{
//开启事务 MYSQL会自动事物提交,给它关闭就行
connection.setAutoCommit(false);
//执行数据库动作
//执行数据库动作
bankDao.add(addAccount,money,connection);
System.out.println("----------");
bankDao.sub(subAccount,money,connection);
//事物提交
connection.commit();
}catch (Exception e){
//事物回滚
connection.rollback();
//抛出异常
throw e;
}finally {
connection.close();
}
}
}