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 |