欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java之mySQL数据库入门(事务)

程序员文章站 2022-09-14 15:07:11
SQL语句数据定义语言(DDL Data Definition Language):创建、修改或删除数据库中表、视图、索引等对象的操作,常用命令为create、alter和drop。/*创建:create database 数据库名 [ character set 字符集 ] */create database student character set utf8/*创建表:*/create table student(id char(12),name varchar(20),m...

SQL语句

  1. 数据定义语言DDL Data Definition Language):创建、修改或删除数据库中表、视图、索引等对象的操作,常用命令为create、alter和drop。
/*创建:
create database 数据库名 [ character set 字符集 ] */
create database student character set utf8
/*创建表:*/
create table student(
	id char(12),
	name varchar(20),
	mobile char(11),
	address varchar(30)
)

/*删除:
drop database 数据库名称*/
drop database student

/*修改:
alter database 数据库名 character set 编码*/
alter database student character set utf8
  1. 数据查询语言DQL Data Query Language):按照指定的组合、条件表达式或排序检索已存在的数据库中数据,不改变数据库中数据,常用命令为select。
/*查询:
select from student [where ='']*/
delete from student where id='001'

/*查看正在使用的数据库 select database()*/
select database()

/*查看MySQL数据库管理系统中所有数据库:show databases*/
show database

/*查看某个数据库的定义信息:show create database 数据库名*/
show create database
  1. 数据操纵语言DML Data Manipulation Language):向表中添加、删除、修改数据操作,常用命令有insert、update和delete。
/*删除数据*/
delete from student where id='001'

/*修改数据*/
update student set name='Jim',mobile='13528375637' where id='002'

/*添加数据*/
insert into student (id,name,mobile,address) value('001','Jack','13526509597','henan')/*依次对应添加*/
insert into student value('002','Make','18703628548','zhengzhou')/*默认全部依次添加*/
  1. 数据控制语言DCL Data Control Language):用来授予或收回访问数据库的某种特权、控制数据操纵事务的发生时间及效果、对数据库进行监视等操作,常用命令有GRANT、REVOKE、COMMIT、ROLLBACK。
rollback;
commit;

事务

事务四大特性(ACID):

  1. 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节。如果事务执行过程中出错就会回滚到事务开始前的状态,所有的操作就像没有发生一样不会对数据库有任何影响。
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,即一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是5000,这就是事务的一致性。
  3. 隔离性(Isolation):当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离,比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转入钱。
  4. 持久性(Durability):一个事务一旦被提交,则对数据库的所有更新将被保存到数据库中,不能回滚。

完成一个事务:
(在转账时,转出和转入必须同时成功才能修改余额数据,若有任意一个不成功,则不对数据库内容进行修改)

通过Navicat Premium操作:

#创建一个用户信息表
create table account(
  id char(36) primary key,
  card_id varchar(20) unique,
  name varchar(8) not null,
  money float(10,2) default 0
);

insert into account values('6ab71673-9502-44ba-8db0-7f625f17a67d','1234567890','张三',1000);
insert into account (id,card_id,name) values('9883a53d-9127-4a9a-bdcb-96cf87afe831','0987654321','张三');
select * from account

update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_id='0987654321';
select * from account

update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_d='0987654321';
select * from account

#默认:每一条sql语句都是一个独立的事务,执行完单条sql语句后直接持久化到磁盘
set autocommit=0;#设置执行完一条sql语句后不再自动提交
update account set money=money-100 where card_id='1234567890';
update account set money=money+100 where card_d='0987654321';
commit;#手动提交
rollback;#手动回滚
select * from account

通过Java操作:

package com.jd.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Test {

	public boolean batch(String...sqls) {
		Connection connection = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");//1、加载驱动
			String url = "jdbc:mysql://127.0.0.1:3306/test";
			connection = DriverManager.getConnection(url ,"root","root");//2、获取连接
			connection.setAutoCommit(false);//3、关闭自动提交
			Statement statement = connection.createStatement();//4、创建sql语句
			for (String sql : sqls) {
				statement.addBatch(sql);
			}
			statement.executeBatch();//5、执行sql语句
			connection.commit();//6、手动提交
			return true;
		} catch (Exception e) {
			try {
				if (connection!=null) {
					connection.rollback();//7、若出现问题,则进行回滚
				}
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		return false;
	}
	
	public static void main(String[] args) {
		if(new Test().batch("update account set money=money-100 where card_id='1234567890'","update account set money=money+100 where card_id='0987654321'")) {
			System.out.println("Yes");
			return;
		}
		System.out.println("No");
	}
}

本文地址:https://blog.csdn.net/weixin_45949075/article/details/107141247