Java - Part 11

一、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 数据数据的表现形式(不包含输出字节)

你可能感兴趣的:(Java - Part 11)