第一部分部分
1.jdbc批处理
1.1
之前:使用jdbc每次只能发送1条语句sql,如果同时执行2000条插入,向数据库服务器发
送2000条插入语句。这种做法的效率不高
现在:使用jdbc的批处理执行2000次插入,但每次向数据库的服务器发送20条sql,一共只
需要发送100次就可以了!那么这种做法的效率会比之前的做法的效率更高
批处理:
一次发送多条语句
1.2批处理的API
Statement
void addBatch(String sql)把sql语句添加到缓存区(没有发送)
int[] executeBatch()执行批处理缓存中sql语句(发送到数据库执行)
void clearBath() 清空缓存区sql语句
stmt. addBatch("select * from student");
stmt.executeBatch()
PreparedStatement
void addBatch 把参数添加到缓存区
int[] executeBatch()执行批处理缓存中所有参数(发送到数据库执行)
void clearBath() 清空缓存区参数的列表
stmt. addBatch("select * from student whereid=?");
for(){
stmt.setInt(1,1);
stmt. addBatch();
}
mysql不支持PreparedStatement优化的,也不支持批处理优化
oracle:数据库既支持PreparedStatement优化,也支持批处理优化
2.jdbc处理大容量的数据
2.1什么是大容量
字符:
存储字符内容:
mysql char varchar 长度有限 65535
大容量的字符字段
mysql: text longtext(4GB字符内容)
oracle clob longclob
字节:
mysql blob(65kb) mediumblob(16MB) longblob(4GB)
日期的处理:
把dateTime字段插入一个字符串内容
stmt.setSting(3,"2018-1-30 16:59:59");
把dateTime字段插入一个Date类型数据
注意:setDate()方法中设置的是java.sql.Date1类型,而不是java.util.Date类型
stmt.setDate(3, new java.sql.Date(new Date().getTime()));
in=rs.getBinaryStaream("file");
等价于
blob=rs.getBlob(“file”);
blob.etBinaryStaream();
new BufferedOutputStream(new FileOutputStream(“文件名”));
3.JDBC的自增长
4.事务:
4.1数据库事务:
innoDE数据库类型,支持事务
MyISAm:不支持事务,但是执行效率高
set autocommit=0
commit
roolback
4.2jdbc事务
Connection setAutoCommit(false):开启事务
Connection commit(); 提交事务
Connection rollba() 回滚事务
4.3事务的四大特性
原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对
其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性:持续性也称永久性(Perfnanence ) ,指一个事务一旦提交,它对数据库中数
据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果
有任何影响。
2 .并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?
答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’夕数据。
( l )丢失修改(lost update ) 两个事务 Tl 和T2读入同一数据并修改,T2提交的结果破坏了
(覆盖了) Tl 提交的结果,导致 Tl 的修改被丢失。
( 2 )不可重复读( Non 一 Repeatable Read ) 不可重复读是指事务 Tl 读取数据后,事务几
执行更新操作,使 Tl 无法再现前一次读取结果。
( 3 )读“脏”数据( Dirty Read ) 读“脏’夕数据是指事务 Tl 修改某一数据,并将其写回磁盘,
事务几读取同一数据后, Tl 由于某种原因被撤销,这时 Tl 已修改过的数据恢复原值,
几读到的数据就与数据库中的数据不一致,则几读到的数据就为“脏”数据,即不正确的数据。
避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,、
幻读:一个事务读到了另一个已将提交的插入的数据
数据库可以设置不同级别的隔离性来防止以上现象(是否能够防止现象)
脏读 不可重复读 幻读
read uncommitted 否 否 否
read committed 是 否 否
repeatable-read 是 是 否
serializable 是 是 是
总结:
批处理
大容量的数据
获取自增长的值
事务
什么是事务
数据库如何使用?
jdbc如何使用事务
事务有哪些特性
第二部分
jdbc的操作:
1)获取连接
2)创建Statement
3)执行sql语句(update delete insert select)
4)得到结果集,处理结果集
5)关闭资源
1连接池
1.1简介:
连接池:
1)Connection对象的利用率,提高执行sql的效率
2)控制java程序使用的最大的连接数,从而防止数据库的崩溃
1.2常用的连接池工具
DBCP(Database Conncetion Pool)
是Apache组织的产品
使用步骤
1)导入包
commons-dbcp-1.4.jar核心包
commons-pool1.5.6.jar辅助包
2)BasicDataSource连接池对象
C3P0
是开源框架(hibernate内置默认的连接池工具C3P0)
c3p0-0.9.1.2.jar 核心包
2.BeanUtils
2.1简介,
BeanUtils工具就是方便开发者操作Javabean对象
2.2BeanUtils工具的作用
1)拷贝Javabean对象的属性
2.)从一个Javabean拷贝另一个Javabean的对象(里面所有属性)
3)从一个map集合拷贝到Javabean对象中
2.3使用步骤:
1.)导入包
commons-beanutils-1.8.3jar核心包
commons-logging-1.13jar 辅助包
3.元数据
3.1简介:
元数据:可以编写出更加通用的jdbc代码
什么是元数据?
1)连接数据库
知道连接的那个数据库,必须使用数据库的元数据对象(DATABaseMetaData)
2)预编译statement执行sql
insert into student(xxx)values(?,?)
预编译sql之后,知道预编译的sql有几个参数,必须使用参数元数据(ParameterMetaData)
3)执行查询sql,返回结果集
ResultSet rs 知道表的字段数,和字段名称,必须使用结果集的元数据(ResultMetaData)
4.DBUtils工具
4.1简介:
最简单的jdbc代码的封装
4.2核心API
QeuryRunner类
update()更新
query()查询
使用步骤导包:
JDBC优化:
1.连接池: 管理连接对象
DBCP
C3P0
2)BeanUtils工具 拷贝Javabean对象
3)元数据为了明白用元数据写出更加通用的jdbc代码
4)DButils对jdbc的简单封装
QueryRunner
update()
query()
ReusltHandler接口:把结果集封装成不同的对象
BeanHandler
BeanListHandler
ScalarHandler