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 ...
随机推荐
- Java环境的搭建
一.JDK的下载 JDK又称Java SE,可以从Oracle公司的官网上https://www.oracle.com/index.html下载. 1.打开Oracle官网.将光标移到[Menu]-[ ...
- IEnumerable和IQueryable接口
之间的区别 IQueryable继承于IEnumerable IEnumerable:IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等一些扩展方法之前数据就已经加 ...
- 到处是坑的微信公众号支付开发(java)
之前公司项目开发中支付是用阿里的支付做的,那叫一个简单,随意:悲催的是,现在公司开发了微信公众号,所以我步入了全是坑的微信支付开发中... ------------------------------ ...
- 软件工程(GZSD2015)第二次作业小结
第二次作业,从4月7号开始,陆续开始提交作业.根据同学们提交的作业报告,相比第一次作业,已经有了巨大改变,大家开始有了完整的实践,对那些抽象的名词也开始有了直观的感受,这很好.然后有一些普遍存在的问题 ...
- 201521123061 《Java程序设计》第六周学习总结
201521123061 <Java程序设计>第六周学习总结 ***代码阅读:Child压缩包内 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核 ...
- 201521123122 《java程序设计》 第三周学习总结
1. 本章学习总结 你对于本章知识的学习总结 链接点击此处 2. 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private s ...
- 201521123014 《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 Q1. 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...
- Python3.x 和Python2.x 区别
1.性能Py3.0运行 pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果.Py3.1性能比Py2.5慢 ...
- 201521123048 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- FreeMarker模板使用小结
手册写的不错,忘记的时候可以翻翻n(*≧▽≦*)n --------------------------------------------分割线--------------------------- ...