JDBC(二)

这篇博客详细介绍了JDBC中BLOB类型的存储和读取,以及如何使用PreparedStatement操作。同时,文章讨论了接口DAO的设计,提倡使用工厂模式以降低Service层与DAO层的耦合。此外,还详细阐述了事务的ACID特性,并列举了常用的JDBC API,包括事务控制、获取插入ID、批处理和分页。最后,讲解了数据库连接池的概念和DataSource的使用,以及JdbcTemplate在优化DAO层代码中的作用。
摘要由CSDN通过智能技术生成
 

BLOB

BLOB用来存储大段的二进制数据, 例如图片, 音频, 视频. LONGBLOB最大4G

存储BLOB

PreparedStatement ps = conn.prepareStatement("insert into big_binary(file) values(?)");

File file = new File("src/cn/itcast/jdbc1/clob_blob/IMG_0007.jpg");

InputStream in = new FileInputStream(file);

ps.setBinaryStream(1, in, (int) file.length());

ps.executeUpdate();


读取BLOB

PreparedStatement ps = conn.prepareStatement("select file from big_binary");

ResultSet rs = ps.executeQuery();

if (rs.next()) {

InputStream in = rs.getBinaryStream(1);

// 这个InputStream就是从数据库中读取数据的流, 操作这个流来读取数据

}


接口DAO

在实际应用中, 我们的JDBC代码通常都是在数据访问层, 也就是DAO


为了解除Service层和DAO之间的耦合, 通常会定义一个DAO接口, 其中包含各种对实体的操作


由于实际操作数据库可能使用各种不同技术, 但只要都实现之前定义好的接口, Service层通过接口就可以调用DAO层的代码了


在更换底层DAO的时候, Service层的代码由于都是针对接口调用而不需要改变.


工厂模式

场景和问题:java程序开发讲究面向借口,隐藏具体的实现类。

解决方案:可以使用工厂方法,又成为简单工厂的设计模式。

工厂模式中主要用createXXX()或getFactory()方法来返回接口,并且在该方法内部创建实现类。

工厂模式中主要涉及:接口,实现类,工厂类(返回接口并且创建实现类)和调用类。

工厂模式的本质:重在选择,在工厂模式中起重要作用的是各种类,工厂只提供功能接口;选择功能的实现:外部传入参数或者从配置文件中获取。

工厂模式使用的步骤:首先创建一个接口,然后创建若干个实现接口的类,第三创建工厂类并且提供返回接口的方法createXXX();最后在其他的类中调用工厂中的接口。


工厂模式是指在Service层中不直接创建DAO层对象, 而是通过一个工厂类来读取配置文件创建.


在更换DAO层的实现时只要修改配置文件就可以, 不需对所有Service中的代码更改, 提高代码的维护性.


写一个单例工厂, 工厂中根据配置文件生成DAO, 提供方法获取DAO.

事务ACID

原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。

一致性(consistency):在事务处理执行前后,数据库是一致的(两个账户要么都变,或者都不变)

隔离性(isolcation):一个事务处理对另一个事务处理没有影响。

持续性(durability):事务处理的效果能够被永久保存下来。

常用API

connection.setAutoCommit(false);

关闭自动提交, 打开事务。

connection.commit();

提交事务。

connection.rollback();

回滚事务。

Savepoint sp = conn.setSavepoint();

设置保存点

conn.rollback(sp);

回滚到保存点

conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

设置隔离级别, 可以通过Connection中的常量设置

隔离级别

在多线程并发访问数据库并且使用事务的时候, 可能会遇到脏读, 不可重复读, 幻读的情况, 需要设置隔离级别来避免


脏读: 读到的线程未提交的数据

不可重复读: 在一个事务中读取同一个记录两次, 获取数据不同

幻读: 在一个事务中, 读取到的记录数不同


隔离级别

脏读

不可重复读

幻读

读未提交 Read Uncommitted

读已提交 Read Committed

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值