一、JDBC批处理
批处理是指将多条SQL语句分组到批处理中,并通过对数据库的一次调用提交它们,当需要一次向数据库发送多条SQL语句时,可以减少连接数据库的开销,从而提高性能.
1.Statement批处理
- 使用createStatement()方法创建Statement对象
- 使用setAutoCommit()方法将auto-commit设置为false(禁用自动提交)
- 使用addBatch()添加SQL语句
- 使用executeBatch()方法执行所有SQL语句
- 使用commit()方法提交所有更改
2.PrepareStatement批处理
- 使用占位符创建SQL语句
- 使用prepareStatement()方法创建PrepareStatement对象
- 使用setAutoCommit()方法将auto-commit设置为false(禁用自动提交)
- 使用addBatch()方法添加SQL语句
- 使用executeBatch()方法执行所有SQL语句
- 使用commit()方法提交所有更改
3.两种方式的区别
- Satement批处理可以添加不同SQL语句,而PrepareStatement只能添加一种类型的SQL语句,因为占位符已经固定
- PrepareStatement效率比Statement高,而且更加安全
二、数据库事务
1、事务的定义
数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
2、事务的特点ACID
- Atomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
- Conssistency(一致性):一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态
- Isolation(隔离性):事务查看数据时数据所处的状态,要么时零一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
- Durability(持久性):持久性事务完成之后,它对于系统的影响时永久性的
3、事务隔离级别
- Read Uncommitted(读未提交),也称之为脏读,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果
- Read Committed(读已提交),一个事务只能看见已经提交事务所作的改变,但会出现不可重复读。
- Repeatable Read(可重复读),确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,但会导致幻读
- Serializable 可串行化,在每个读的数据行上加上共享锁,但是效率最低。
4、JDBC事务处理
JDBC默认是自动提交,我们如果想要手动提交,就要使用Connection对象的setAutoCommit()方法,传入一个boolean值false。
- 4.1 事务的提交和回滚
调用connection对象的commit()方法与rollback()方法。
三、File类
File类是一个路径,是文件和目录路径名的抽象表示形式,可以代表的是一个目录,也可以是一个文件。提供众多对文件夹和文件的操作,File类构造方法可以根据一个路径得到File对象,也可以根据一个目录和子文件/目录得到File对象
1、创建功能
- createNewFile():创建文件,如果存在就不创建了
- mkdir():创建文件夹,如果存在就不创建了
- mkdirs():创建文件夹,如果父文件夹不存在,自动创建
2、重命名与删除功能
- renameTo(File dest):把文件重命名为指定的文件路径
- delete():删除文件或者文件夹
重命名只是将File代表的文件或者文件夹命名,File对象所表示的路径还是创建时赋予的路径
java中的删除不走回收站,直接删除
要删除一个文件夹,不能包含文件或者文件夹,必须是空的
3、判断功能
- isDirectory():判断是否是目录
- isFile():判断是否是文件
- exists():判断是否存在
4、获取功能
- getAbsolutePath():获取绝对路径
- getPath():获取路径
- getName():获取名称
- length():获取长度:字节数,返回的是一个long.
- String[] list():获取指定目录下的所有文件或者文件夹的名称数组
- File[] listFiles():获取指定目录下的所欲文件或者文件夹的File数组
四、字节流
1、IO流
- 1.1 定义
- IO流用来处理设备之间的数据传输
- Java对数据的操作是通过流的方式
- Java用于操作流的类都在IO包中
- 流按流向分为两种:输入流、输出流
- 流按操作类型分为两种:字节流与字符流
- 1.2 IO流常用父类
- 字节流的抽象父类
- InputStream
- OutputStream
- 字符流的抽象父类
- Reader
- Writer
- 字节流的抽象父类
- 1.3 使用步骤
- 使用前,导入IO包中的类
- 使用中,进行IO异常处理
- 使用后,释放资源
2、 FileInputStream
以字节的形式读取文件内容
- 构造方法:
- FileInputStream(String name):根据字符串地址来连接到一个本地文件
- FileInputStream(File file):根据一个File类对象连接到一个本地文件
- 常用方法:
- read() : 从此输入流中读取一个数据字节
- read(byte[] b) : 从此输入流中将最多b.length个字节的数据读入一个byte数组中
- read(byte[] b,int off,int len) : 从此输入流中读取最多 len个字节的数据读入到一个byte[] 数组中
- close() : 关闭此输入流并释放与此流有关的所有系统资源
3、 FileOutputStream
以字节的形式将数据写入到文件中
- 构造方法:
- FileOutputStream(String name):根据字符串地址来连接到一个本地文件
- FileOutputStream(File file):根据一个File类对象连接到一个本地文件
- FileOutputStream(File file,boolean append):在文件末尾继续写入
- 常用方法:
- write(int b) : 将指定字节写入此文件输出流
- write(byte[] b) : 将b.length个字节从指定byte数组写入此文件输出流中
- write(byte[] b,int off, int len) : 将指定byte数组中从偏移量off开始的len个字节写入此文件输出量
- close() : 关闭输出流并释放与此流有关的所有系统资源
4、小数组读写
一次读写一个字节的方法太慢了,所以采用小数组读写:
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("");
FileOutputStream fos = new FileOutputStream("");
//创建一个和资源文件大小相同的字节数组
byte[] bs = new byte[1024*8];
int len = 0;
while((len=fis.read(bs))!= -1){
//最后一次读取的时候可能并不能装满整个数组
fos.write(bs, 0, len);
}
fis.close();
fos.close();
}
5、字节输入缓冲流
字节输入缓冲流BufferedInputStream,在内部建立了一个缓冲区域,读取文件的时候,一次性读取大量的字节,缓冲到缓冲区中,然后再返回给我们,有点类似小数组读写,不过是在内存中操作。
- 5.1 常用方法
- read() : 一次读取一个字节
- read(byte[] b, int off, int len) : 从此字节输入流中给定偏移量处开始各字节读取到指定的byte数组中
- close() : 关闭并释放资源,实际关闭的是内部真正工作的字节流
6、字节输出缓冲流
BufferedOutputStream字节输出缓冲流,将我们写的字节先存放到一个小数组中,等数组满了之后再写入到本地文件中
- 6.1 常用方法
- write(int b) : 将指定的字节写入此缓冲流的输出流
- write(byte[] b, int off, int len) : 将指定byte数组中从偏移量off开始的len个字节吸入此缓冲流的输入流
- flush() : 刷新此缓冲流的输出流
- close() : 关闭流,并释放资源
小数组读写相较于缓冲流效率较高,因为小数组读写只有一个数组,二缓冲流有两个数组
7、流的异常处理
如果在读写文件中出现了异常,无论如何都需要关闭读写流,在JDK 1.7之前,需要手动关闭,在JDK 1.7之后,不需要手动关闭,但是需要创建的流对象实现了AutoCloseable接口
public static void main(String[] args) {
try(
FileInputStream fis = new FileInputStream("");
FileOutputStream fos = new FileOutputStream("");
){
int i ;
while((i=fis.read())!= -1){
fos.write(i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
五、字符流
字符流是可以直接读写字符的IO流,相较于我们自己转换,Java提供的字符流能够很方便地将字节转换为字符
1、FileReader
字符输入流,底层使用的还是字节流,可以理解为在字节流的基础上包装了一些与字符操作的方法。
- 常用方法:
- int read():读取单个字符
- int read(char[] cbuf):将读取的字符读入字符数组
- void close():关闭资源
2、FileWriter
字符输出流,也是一个缓冲流,将字符写入到文件中,可以直接写入字符串,它的使用方法基本和BufferedOutputStream一样,写完之后需要flush()。
六、字符缓冲流
通过缓冲区来储存字符,效果和用法都和字节缓冲流一样。
- 常用方法:
- bufferedReader.readLine():读取一文本行
- bufferedWriter.newLine():写入一文本行
七、LineNumberReader
是BufferedReader的子类,具有相同的功能,并且可以统计行号,默认从0开始
- 常用方法
- getLineNumber():获取当前行号
- setLineNumber():设置当前行号
八、转换流
转换流可以实现字节流与字符流之间的转换
- InputStreamReader(字节流,编码):按照指定的编码将字节输入流转换成字符输入流
- OutputStreamReader(字节流,编码):按照指定的编码将字符输出流转换为字节输出流
九、内存流
用于程序和内存进行数据的读写
- ByteArrayOutputStream 内存输出流,从程序到内存
- ByteArrayInputStream 内存输入流,从内存到程序
十、对象操作流(序列化流)
序列化流可以将Java中的对象写出到文件中,或者读取一个对象到Java程序中,写入本地的对象必须是心啊Serializable接口
- ObjecOutputStream 将对象写入到本地
- ObjectInputStream 从本地读取文件生成对象
十一、打印流
打印流可以很方便的将对象的toString()结果输出,并且可以自动计上换行,而且可以使用自动刷出的模式,具有方向性
- PrintStream 数据数据的表现形式
- PrintWriter 数据数据的表现形式(不包含输出字节)