PO、VO、DAO、BO、DTO、POJO 分别代表着什么?
-
PO :(persistant object),持久对象
可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。 -
VO :(value object),值对象
通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.
PO只能用在数据层,VO用在商业逻辑层和表示层。各层操作属于该层自己的数据对象,这样就可以降低各层之间的耦合,便于以后系统的维护和扩展。
-
DAO :(Data Access Objects),数据访问对象接口
DAO是Data Access Object数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
J2EE开发人员使用数据访问对象(DAO)设计模式把底层的数据访问逻辑和高层的商务逻辑分开.实现DAO模式能够更加专注于编写数据访问代码.
DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.一个典型的DAO实现有下列几个组件:
-
一个DAO工厂类;
-
一个DAO接口;
-
一个实现DAO接口的具体类;
-
数据传递对象(有些时候叫做值对象)
-
-
BO :(Business Object),业务对象层
表示应用程序领域内“事物”的所有实体类。这些实体类驻留在服务器上,并利用服务类来协助完成它们的职责。 -
DTO Data Transfer Object数据传输对象
主要用于远程调用等需要大量传输对象的地方。比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用WEB service来获取数据,没有必要把整个PO对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO -
POJO :(Plain Old Java Objects),简单的Java对象
实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接.其中有一些属性及其getter、setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法
字符输入输出(I/O)流、缓冲流
字符输入输出(I/O)流 用来解决设备间数据传输的问题。包括文件copy,读写文件,上传文件以及下载文件等。对于到底是输入流还是输出流,我们是站在Java程序的角度来看待的,对于程序来说从文件中读取数据即时向程序中输入数据,因此就是输入流,相反则是输出流。
一、输出流
输出流 即往文件中写数据,我们需要用到 java.io.FileWriter 这个类。
- 1、构造方法
- FileWriter ( String fileName ) : 传递一个文件名称,执行写入时,会覆盖文件原来的内容。
- FileWriter ( String fieName, boolean append ) : 当append为true时,执行写入会追加到原文件中(追加时不换行)
- 2、写数据流程
- 创建输出流对象;
- 创建对象时,系统为我们做了三件事情:
- 1.调用系统资源创建一个文件
- 2.创建输出流对象
- 3.把对象指向文件。
- 同时需要注意,如果我们在写构造函数参数的时候,没有加上盘符,则文件创建的路径为当前项目的相对路径。
-
public class FileWriteDemo { public static void main(String[] args) throws IOException { // 创建对象 FileWriter fw = new FileWriter("f:\\test.txt"); // 调用write方法写数据 fw.write("Hello Java IO."); // 刷新缓冲区 fw.flush(); // 释放资源,通知系统释放和该文件相关的资源 fw.close(); } }
- 创建对象时,系统为我们做了三件事情:
- 调用该对象的写数据方法
- 执行write方法后接着打开文件会发现write中的内容并没有写入到文件中,这是因为:硬盘存储数据的基本单位是字节,而我们却是一次性写字符串,这样的话字符串是写不进去,其数据全部存储在缓冲区中。因此,我们需要调用flush()方法来刷新缓冲区。
- 常用的写数据方法,对write()方法的重载
-
void write (String str) : 写字符串,上示代码中已经展示过了。
-
void write (String str , int index, int len) :写字符串中的部分数据,从index开始,长度为len。
-
void write (int ch) :写一个字符数据,既可以是char 类型又可以是char 类型对应的int 值。
-
void write (char[ ] chs) :写一个字符数组。
-
void write (char[ ] chs, int index, int len) :写字符数组的部分数据,从index开始,长度len。
-
-
public class FileWriteDemo { public static void main(String[] args) throws IOException { FileWriter fw = new FileWriter("f:\\test.txt"); //写入:llo Jav fw.write("Hello Java IO.",2,7); //换行 fw.write("\r\n"); //写入:a fw.write('a'); //写入:a fw.write(97); //换行 fw.write("\n"); //写入: abcdef char[] chs = {'a','b','c','d','e'}; fw.write(chs); //换行 fw.write("\r"); //写入: cde fw.write(chs,2,3); fw.close(); } }
- 3、刷新缓冲区
- 4、释放资源
- close()方法在释放资源前,会先检查缓冲区中的数据,如果缓冲区中还存在数据,则会先执行一次flush操作。
- 创建输出流对象;
二、输入流
输入流 即从文件中读数据,我们需要用到 java.io.FileReader 这个类。
-
构造方法 FileReader ( String fileName ) : 传文件名称。
-
写数据流程
-
创建输入流对象;
-
调用该对象的读数据方法;
-
释放资源
public class FileReaderDemo { public static void main(String[] args) throws IOException { //创建对象 FileReader fr = new FileReader("f:\\test.txt"); int ch ; //调用读取数据的方法 while ((ch = fr.read()) != -1){ System.out.print((char) ch); } //释放资源 fr.close(); } }
-
read()方法一次只能读取一个字符的值,并且返回这个字符的整型值。每执行一次read(),就会指向下一个字符,当返回值为-1时,代表没有值了,因此可以用来当作判断条件。你说文件中有-1怎么办?--完全没关系,因为-1在文件中那是两字符。。。
- 常用方法
public class FileReaderDemo { public static void main(String[] args) throws IOException { FileReader fr = new FileReader("f:\\test.txt"); char[] chs = new char[1024]; int len ; while((len = fr.read(chs)) != -1){ System.out.print(new String(chs,0,len)); } fr.close(); } }
-
int read ( char [ ] chs) : 一次读取一个字符数组的数据, 返回实际读取的字符的个数,并将chs 的值改为读取的数据。chs 数组的大小一般为1024或1024的整数倍。重复执行read方法,当文件中还有数据时会指向下一组数据,当文件中的字符全部读取后,继续执行read()会返回-1,可以用来当作判断条件。
-
read()返回本次实际读取的字符的个数,换行符( \n, \r )也算一个。因此,如果最后一次读取的字符个数不是chs 定义的长度,即len<chs.length,新chs 数组在len 之前是读取的新数据,len之后的数据会保留上一次的结果,当直接输出显示数组时会重复显示len之后的内容。所以我们用new String(chs,0,len) 来输出,保证没有多余的内容。
-
-
三、字符缓冲流
BufferedWriter : 文本写入字符输出流,缓冲各个字符,实现高效写入。
BufferedReader : 从字符输入流中读取文本,缓冲各个字符,高效读出。
字符缓冲流与IO流进行文本的读写步骤唯一不同的是创建对象,不再是创建FileWriter和FileReader对象,而是:
创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("f:\\test.txt"));
创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("f:\\test.txt"));
bw,br 与fw,fr有相同的功能,唯一的区别是使用字符缓冲流更加高效。
四、缓冲流的特殊功能
BufferedWriter
void newLine() : 写一个由系统决定的换行符(win:\r\n ; Linux:\n ; mac:\r)。
BufferedReader
String readLine() : 一次读取不包括换行符的一行,返回一个字符串。读取不到数据会返回null,可作为结束的条件。
public class BufferedStreamDemo {
public static void main(String[] args) throws IOException {
// 创建输出缓冲流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("f:\\test.txt"));
for (int i = 0; i < 10; i++) {
bw.write("hello");
//写一个换行符
bw.newLine();
bw.flush();
}
// 释放资源
bw.close();
// 创建输入缓冲流对象
BufferedReader br = new BufferedReader(new FileReader("f:\\test.txt"));
String line;
while ((line = br.readLine()) != null) {
//readLine()不读取换行符,因此可以用println()来输出
System.out.println(line);
}
// 释放资源
br.close();
}
}