jdbc学习笔记
知识概要:
1.JDBC简介
2.JDBC的编码步骤
3.JDBC中常用接口或类详解
4.JDBC中释放资源
5.JDBC进行CRUD
1.JDBC简介
JDBC:Java DataBase Connectivity
数据JavaEE开发技术之一
相关的API在JDK中:java.sql.* javax.sql.*
作用:编写数据库相关代码有一个统一标准
还需要数据库的驱动
JDBC与数据库驱动是什么关系?数据库驱动实现了JDBC规范
二、JDBC的编码步骤
0、搭建开发环境:把数据库驱动jar包加入到应用的构建路径(classpath)
1、注册驱动
2、获取与数据库的连接
3、创建代表SQL语句的对象
4、执行SQL语句
5、如果执行的查询语句,返回结果集,遍历结果集
6、释放占用的资源
三、JDBC中常用接口或类详解
1、DriverManager:
1.1注册驱动
方式一:DriverManger.registDriver(new com.mysql.jdbc.Driver());
不建议使用:依赖具体的数据库驱动;导致驱动注册2次;
方式二(推荐):Class.forName(“com.mysql.jdbc.Driver”);
1.2获取与数据库的连接
方式一:
DriverManager.getConnection(String url,String username,String password);
url:数据库厂商和JDBC之间的协议
具体的url地址参考数据库的说明文档
mysql:
jdbc:mysql://localhost:3306/day15
方式二:
DriverManager.getConnection(String url,Properties props);
props:
数据库的一些参数配置
方式三:
DriverManager.getConnection(String url);
2、Connection:4天中都会用
Statement createStatement();创建代表SQL语句的对象
3、Statement
ResultSet executeQuery(String sql):sql一定要用查询语句;专门用来执行查询的
int executeUpdate(String sql):sql一般为DML(INSERT DELETE UPDATE)语句,不能执行查询语句;返回值是该条语句影响到的行数。
boolean execute(String sql):sql可以是任意语句。如果是查询语句,有结果集,返回是true;否则就是false。特别注意:并不是成功与否。
4、ResultSet
boolean next();
boolean previous();向上移动游标
boolean absolute(int count);//第一条记录就是1
void beforeFirst()把游标移动到第一行的前面
void afterLast()把游标移动到最后一行的后面
四、JDBC中释放资源
五、JDBC进行CRUD 略:
六、事务的入门案例(重点)
1、MySQL:事务默认是自动提交的。即一条语句就是出于独立的事务之中。
2、MySQL:SQL(TPL)
start transaction:开启事务。后面的语句处于同一个事务之中。
rollback:回滚。事务结束
commit:提交事务。事务结束
3、JDBC控制事务
start transaction: Connection setAutoCommite(false)
rollback Connection.rollback();
commit Connection.commit();
七、事务的特性:(原理:面试)
1、原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2、一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账:转账前aaa+bbb=2000;转账后aaa+bbb=2000;
3、隔离性:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
4、持久性:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。
八、事务的隔离级别:(重点)
1、如果不考虑事务的隔离性,会出现什么问题?
脏读:一个线程中的事务读到了另一个线程中事务未提交的数据
不可重复读:一个线程中的事务读到了另一个线程中提交的update的数据,前后两次读到的内容不一致。
虚读:一个线程中的事务读到了另一个线程中提交的insert或delete的数据,前后读到的记录条数不一致。
2、事务的隔离级别:
READ UNCOMMITTED 脏读、不可重复读、虚读都有可能发生
READ COMMITTED 能避免脏读;不可重复读、虚读有可能发生(Oracle默认)
REPEATABLE READ 能避免脏读、不可重复读;虚读有可能发生(MySQL默认)
SERIALIZABLE 能避免脏读、不可重复读、虚读的发生
以上隔离级别:从上到下,级别越高,性能越低,数据也越安全。
MySQL:
查看当前数据库的隔离级别:
select @@tx_isolation;
更改隔离级别:(开启事务之前更改)
set transaction isolation level 四个级别之一
练习:account账户。演示脏读
|
时间 |
线程1(自己) READ UNCOMMITTED |
线程2 |
说明 |
|
t1 |
start transaction; |
||
|
t2 |
select * from account where name=’aaa’; 发现:1000块 |
||
|
t3 |
start transaction; |
||
|
t4 |
update account set money=money+100 where name=’aaa’; |
||
|
t5 |
select * from account where name=’aaa’; 发现:1100块 |
脏读发生了 |
|
|
t6 |
commit |
||
|
t7 |
commit |
演示不可重复读
|
时间 |
线程1(自己) READ COMMITTED |
线程2 |
说明 |
|
t1 |
start transaction; |
||
|
t2 |
select * from account where name=’aaa’; 发现:1000块 |
||
|
t3 |
start transaction; |
||
|
t4 |
update account set money=money+100 where name=’aaa’; |
||
|
t5 |
select * from account where name=’aaa’; 发现:1000块 |
避免了脏读 |
|
|
t6 |
commit |
||
|
t7 |
select * from account where name=’aaa’; 发现:1100块 |
发生了不可重复读 |
|
|
commit |
演示虚读
|
时间 |
线程1(自己) READ COMMITTED |
线程2 |
说明 |
|
t1 |
start transaction; |
||
|
t2 |
select * from account; 发现:3条记录 |
||
|
t3 |
start transaction; |
||
|
t4 |
insert into account values(4,’ddd’,1000); |
||
|
t5 |
commit |
||
|
t6 |
select * from account; 发现:4条记录 |
幻影数据。发生了虚读 |
|
|
t7 |
commit |
3、JDBC中设置隔离级别
Connection.setTransactionIsolation(int level);
九、丢失更新(非常普遍)
一个线程中的事务覆盖了另一个线程中已经提交的数据。
解决:利用数据库的锁机制
共享锁:可以有多把。
独占锁:(排它锁)只能有一把。只要外面有共享锁,会等。update、insert、delete会自动加独占锁。
jdbc学习笔记的更多相关文章
- JDBC 学习笔记(十一)—— JDBC 的事务支持
1. 事务 在关系型数据库中,有一个很重要的概念,叫做事务(Transaction).它具有 ACID 四个特性: A(Atomicity):原子性,一个事务是一个不可分割的工作单位,事务中包括的诸操 ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- JDBC 学习笔记(六)—— PreparedStatement
1. 引入 PreparedStatement PreparedStatement 通过 Connection.createPreparedStatement(String sql) 方法创建,主要用 ...
- JDBC学习笔记二
JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...
- JDBC学习笔记一
JDBC学习笔记一 JDBC全称 Java Database Connectivity,即数据库连接,它是一种可以执行SQL语句的Java API. ODBC全称 Open Database Conn ...
- JDBC学习笔记(2)——Statement和ResultSet
Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.Statement ...
- JDBC学习笔记(1)——JDBC概述
JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数 ...
- 【转】JDBC学习笔记(2)——Statement和ResultSet
转自:http://www.cnblogs.com/ysw-go/ Statement执行更新操作 Statement:Statement 是 Java 执行数据库操作的一个重要方法,用于在已经建立数 ...
- 【转】JDBC学习笔记(1)——JDBC概述
转自:http://www.cnblogs.com/ysw-go/ JDBC JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据.JDBC代表Java数据 ...
- JDBC学习笔记(1)
说明:本系列学习笔记主要是学习传智播客的李勇老师的教学课程和一本英文电子书<JDBC Recipes A Problem-Solution Approach>所作的笔记. 1,什么是JDB ...
随机推荐
- IEnumerable和IQueryable接口
之间的区别 IQueryable继承于IEnumerable IEnumerable:IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等一些扩展方法之前数据就已经加 ...
- [自制操作系统] BMP格式文件读取&图形界面系统框架/应用接口设计
本文将介绍在本人JOS中实现的简单图形界面应用程序接口,应用程序启动器,以及一些利用了图形界面的示例应用程序. 本文主要涉及以下部分: 内核/用户RW/RW调色板framebuffer共享区域 8bi ...
- MPLS LDP随堂笔记1
LDP 的使用原因(对于不同协议来说) LDP的四大功能 发现邻居 hello 5s 15s 224.0.0.2 发现邻居关系 R1 UDP 646端口 R2 UDP 646端口 此时形成邻居 建立邻 ...
- Vue项目搭建基础之Vue-cli模版测试
第一步安装node,nodejs.org下载node稳定版安装包.node -v (查看node版本)npm install -g vue-cli(安装Vue脚手架环境)vuevue listvu ...
- 软工+C(2017第6期) 最近发展区/脚手架
// 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...
- 【Alpha】第七次Daily Scrum Meeting
GIT 一.今日站立式会议照片 二.会议内容 1.讨论送礼物的方法和对象,使功能更加完善. 2.对于程序还存在的问题提出自己的看法,尽量让功能更加的饱满. 三.燃尽图 四.遇到的困难 能 ...
- 201521123107 《Java程序设计》第1周学习总结
第1周学习总结 1.本周学习总结 本周我们正式开始了对一门新的编程语言java的学习.本周的主要内容是初步了解了java的发展过程,java具有简约且简单 .平台无关性等优点.java的3个关键的工具 ...
- 201521123110 java课程设计
一.需求分析 功能要求:计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,给出所用时间和评语.保留用户测试成绩,做出成绩排行榜.排行榜存放到文件中. 二.本组课题及本人任务 • ...
- chrome保存网页为单个文件(mht格式)
网页归档(英语:MIME HTML或MIME Encapsulation of Aggregate HTML Documents,又称单一文件网页或网页封存盘案)为以多用途互联网邮件扩展格式,将一个多 ...
- Java:@Override标签的多态性详解
Override(重写)是子类与父类的一种多态性体现. Override允许子类改变父类的一些行为. 为什么需要Override:当父类不满足子类的一些要求时我们就需要子类对父类的一些行为进行重写. ...