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 ...
随机推荐
- 关于JS正则——你知道多少?
正则表达式 1. 使用正则 创建正则表达式有两种方式,一种是以字面量方式创建,另一种是使用RegExp构造函数来创建. var expression = / pattern / flags; var ...
- Automatic Generation of Animated GIFs from Video论文研读及实现
论文地址:Video2GIF: Automatic Generation of Animated GIFs from Video 视频的结构化分析是视频理解相关工作的关键.虽然本文是生成gif图,但是 ...
- 《深入浅出MySQL》之数据类型
MySQL提供了多种数据类型,主要包括数值型.字符串型和日期时间类型.本次博客就来谈谈MySQL中常用的数据类型吧(版本:mysql-5.7.19)! 数值类型 MySQL支持所有标准SQL中数值类型 ...
- The Last
第八次课程作业 感慨 没想到这就最后一次课程作业了,还以为会跟我到大学毕业呢.既然是最后一次就说说心里话.起初收到做博客作业的消息还觉得蛮有新意的(因为第一次作业不难),后来不断的作业涌现出来了,还都 ...
- 第二次项目冲刺(Beta阶段)5.19
1.提供当天站立式会议照片一张 会议内容: ①新成员加入,熟悉团队. ②制定新一轮的任务计划. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 王婧 #42文件分类改为按个人分类 #42文 ...
- 201521123104《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: pu ...
- 201521123092《Java程序设计》第七周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下 publ ...
- Win8打开chm右侧空白解决方法
Win8下打开CHM文件,左侧有目录,但是右侧空白.而且打开的时候,还弹出很多IE窗口. 感觉应该不是文件本身的问题.下面是我的解决方法,其他系统也可以试一试. 最初打开文件如下 首先:1,右键关联c ...
- 201521123119 《Java程序设计》第13周学习总结
1. 本周学习总结 Q以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 Q1. 网络基础 Q1.1 比较ping www.baidu.com与ping cec. ...
- 201521123108 《Java程序设计》第13周学习总结
1. 本周学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 答: 回复 ...