JDBC基本知识总结
一、JDBC简介
1、JDBC是SUN公司为了简化操作数据推出一套规范。数据库厂商的驱动就是对JDBC的实现。
2、Java Data Base Connectivity(java数据库连接),它主要由接口组成。
java.sql.* javax.sql.* JDK中
数据库的驱动jar包
二、JDBC的编码步骤
0、前提:拷贝数据库的驱动到构建路径中(classpath)
1、注册驱动
2、获取与数据库的链接
3、创建代表SQL语句的对象
4、执行SQL语句
5、如果是查询语句,需要遍历结果集
6、释放占用的资源
三、JDBC中常用的接口详解
1、DriverManager:
作用:
a、注册驱动:
方式一:(不建议使用)
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
原因:1、依赖具体驱动。2、导致驱动注册2遍
方式二:(建议)
Class.forName("com.mysql.jdbc.Driver");
b、获取与数据库的链接
url:SUN和数据库厂商间的协议。具体查阅数据库的文档。
public static Connection getConnection(String url,String user,Stringpassword)
throws SQLException
public static Connection getConnection(String url,Properties info)
throws SQLException
public static Connection getConnection(String url)
throws SQLException
2、Connection
所有的数据库操作都是基于链接之上的。
Statement createStatement():创建向数据库发送sql的statement对象。
3、Statement
作用:代表SQL语句对象。可以向数据库发送任何的SQL语句
ResultSetexecuteQuery(String sql):sql一般都是查询语句
int executeUpdate(Stringsql):sql一般是DML语句。insert update delete。返回值,操作几条记录。
boolean execute(String sql):sql可以是任意的语句。返回值不是代表成功与否。如果是查询语句,就有结果集,返回true。没有返回结果集的,返回false。
4、ResultSet
作用:封装了查询的结果集
boolean next():游标下移。返回值是有无记录
boolean previous():游标上移。
boolean absolute(int count):定位到指定的行。第一行是1。
void beforeFirst():移动游标到第一行的前面。
void afterLast():移动游标到最后一行的后面。
四、事务入门(重点)
1、MySQL:每一条语句都属于独立事务,默认自动管理的。
2、开启事务:start transaction; 日后的语句都会处于同一个事务之中。
提交事务:commit;
回滚事务:rollback;
3、JDBC如何控制事务
五、事务的特性(重点)
1、事务的特性(ACID):
原子性:处于事务中的多条语句是不可分割的。
一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如:转账,转账前A+B=2000,转账后A+B=2000
隔离性:多线程并发。一个事务不能被其他线程中的事务所打扰。
持久性:事务一旦提交,永久保存起来。
2、事务的隔离级别:属于事务的。都已开启了事务为前提。
不考虑事务的隔离级别,会出现以下情况(是错的)
- 脏读:一个线程中的事务读到了另外一个线程中未提交的数据。
- 不可重复读:一个线程中的事务读到了另外一个线程中已经提交的update的数据。
- 虚读:一个线程中的事务读到了另外一个线程中已经提交的insert的数据。
要想避免以上现象,通过更改事务的隔离级别来避免:
- READ UNCOMMITTED 脏读、不可重复读、虚读有可能发生。
- READ COMMITTED 避免脏读的发生,不可重复读、虚读有可能发生。
- REPEATABLE READ 避免脏读、不可重复读的发生,虚读有可能发生。
- SERIALIZABLE 避免脏读、不可重复读、虚读的发生。
级别依次升高,效率依次降低。
MySQL:默认REPEATABLE READ
ORACLE:默认READ COMMITTED
MySQL:
select @@tx_isolation;//查看当前的隔离级别
set transaction isolation level 级别;// 设置当前的事务隔离级别
练习:read uncommitted;
时间 |
T1 |
T2 |
说明 |
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 |
select * from account where name='aaa'; 有1100块 |
|
读到了另外一个线程中提交的update数据:不可重复读 |
t8 |
select count(*) from account; 有3条记录 |
|
|
t9 |
|
insert into account values(4,'ddd',1000); |
|
t10 |
select count(*) from account; 有4条记录 |
|
读到了另外一个线程中提交的insert数据:虚读(幻读) |
t11 |
commit; |
|
|
六、常用的数据库操作框架
1、ORM:Object Relation Mapping
Hibernate:非常流行
JPA:Java Persistent API.ORM标准
MyBatis:2010年开始。之前叫做iBatis(重视)
2、JDBC封装框架
DBUtils
Spring JDBC Template