𝓝𝓮𝓶𝓸&博客

【Java】包的命名规则

命名规范

  • 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo
  • 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG
  • 类:所有单词的首字母大写,如 TestJava

pascal命名法

  • 属性:第一个单词的首字母小写,之后每个单词的首字母大写,如 studentName

camel命名法:驼峰命名法。

  • 方法:第一个单词的首字母小写,之后每个单词的首字母大写,如 getInfo()

Java包的命名规则

  • util:对应英文utility(实用工具),一般存放工具类,就像java.lang.util包一样存放着各种各样的工具类方便你编程,这里你可以放自己写好的工具类为自己的程序提供方便。
  • business:一般存放业务类,处理程序业务的功能类就放在这里。
  • control:一般存放控制类,后台控制的一些类就放在这里,例如J2EE里的Servlet。
  • dao:对应英文Data Access Object,数据访问对象,一般存放与数据库(文本、Excel等)打交道的类,只关心数据库的增删改查。

用于操作的封装。

  • vo:对应英文Value Object,值对象,一般存放实体(Model)。

vo表示value object,主要实现数据的封装,常与数据库中一个表或视图相对应。
该类的实现基本上是一个固定的模板,因此很多建模工具(如rose等)能够根据数据库中的表和视图自动生成该文件,此过程称为“反向工程”。

  • driver:一般存放驱动类,一般显示菜单,调用dao等包中的方法来驱动程序。一般拥有在其中使用方法的主方法。

Object 划分

  1. PO(persistent object)持久对象
    PO 就是对应数据库中某个表中的一条记录,多个记录可以用 PO 的集合。PO 中应该不包含任何对数据库的操作。
  2. DO (Domain Object)领域对象
    就是从现实世界中抽象出来的有形或无形的业务实体。
  3. TO(Transfer Object)数据传输对象
    不同的应用程序之间传输的对象
  4. DTO (Data Transfer Object)数据传输对象
    这个概念来源于 J2EE 的设计模式,原来的目的是为了 EJB 的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象。
  5. VO(Value Object)值对象
    通常用于业务层之间的数据传递,和 PO 一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不和表对应,这根据业务的需要。用 new 关键宇创建,由 GC 回收的。
    View Object:视图对象
    接受页面传递来的数据,封装对象
    将业务处理完成的对象,封装成页面要用的数据
  6. BO(Business Object)业务对象
    从业务模型的角度看,见 UML 元件领域模型中的领域对象。封装业务逻辑的 Java 对象,通过调用 DAO 方法,结合 PO、VO 进行业务操作。Business Object:业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个 PO,工作经历对应一个 PO,社会关系对应一个 PO。建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO。这样处理业务逻辑时,我们就可以针对 BO 去处理。
  7. POJO(Plain Ordinary Java Object)简单无规则 Java 对象
    传统意义的 Java 对象。就是说在一些 Object/Relation Mapping 工具中,能够做到维护数据库表记录的 Persisent Object 完全是一个符合JavaBean 规范的纯 Java 对象,没有增加别的属性和方法。我的理解就是最基本的 JavaBean,只有属性字段及 setter 和 getter 方法!
    POJO 是 DO/DTO/BO/VO 的统称。
  8. DAO(Data Access Object)数据访问对象
    是一个 sun 的一个标准 J2EE 设计模式,这个模式中有个接口就是 DAO,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和 PO 结合使用,DAO 中包含了各种数据库的操作方法。通过它的方法,结合 PO 对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合 VO,提供数据库的 CRUD 操作。

常用类型

VO:View Object,主要用于展示层。它的作用是把某个指定前端页面的所有数据封装起来。他的作用主要是减少传输数据量大小和保护数据库隐私数据(如用户密码、用户邮箱等相关信息)不外泄,同时保护数据库的结构不外泄。

  • 用于表示具有一组相关属性的简单对象,通常是只读的。
  • VO主要用于数据展示和传输,在前端或API响应中使用。
  • VO通常包含与UI相关的属性,如页面展示需要的字段、格式化数据等。
  • VO可以帮助将数据从领域模型中解耦出来,提供给客户端使用。

DTO:Data Transfer Object,数据传输对象,用于展示层与服务层之间的数据传输对象。(注:实际开发中还存在BO,其作用和DTO类似,当业务逻辑不复杂时一般会被合并。)

  • 用于封装多个属性,用于数据传输和交互。
  • DTO通常用于在不同层(例如控制器和服务层之间)之间传递数据。
  • DTO可以帮助在不同的服务和组件之间进行数据传输,减少对领域模型的依赖。
  • DTO可以包含与业务逻辑相关的属性,如数据校验、数据转换等操作。

PO:Persistant Object,持久化对象,和数据库形成映射关系。简单说PO就是每一个数据库中的数据表,一个字段对应PO中的一个变量。(也就是我们常用的Entities)

几者之间的关系如下图:
image


在实际开发中,VO和DTO的使用场景可能有所重叠,取决于具体的应用架构和需求。以下是一些常见的使用场景:
MVC架构:

  • VO用于表示视图层需要显示的数据,封装了与UI相关的属性,以便于前端页面展示。
  • DTO用于在控制器和服务层之间传输数据,包含了与业务逻辑相关的属性。

微服务架构:

  • DTO用于在不同的微服务之间传递数据,帮助解耦服务之间的依赖。
  • DTO可以包含与分布式系统通信相关的属性,如序列化、反序列化等。

API开发:

  • DTO用于封装API请求和响应的数据,确保数据的正确传输和格式化。
  • DTO可以帮助定义API的输入和输出结构,方便接口文档的编写和维护。

使用方法

  • 在服务层中创建DTO:当从数据库获取数据时,将数据封装到DTO中,然后将其传递到控制器层。

  • 在控制器层中使用DTO:接收来自服务层的DTO,并将其作为响应发送给客户端。

  • 在UI层中使用VO:将VO作为模型对象,用于显示数据。

  • 数据转换:在某些情况下,你可能需要将DTO转换为VO,或反之。这可以通过手动转换或使用工具如MapStruct来完成。

  • 保持分离:确保DTO和VO的职责清晰分离,DTO主要用于数据传输,而VO用于表示和显示数据。

@PostMapping()
public XxxVO PageList(@RequestBody XxxDTO) {
	// DTO用来接收请求数据,VO用来传递响应数据
}

实例

SSM框架

  • pojo:对应英文Plain Ordinary Java Object,简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。其中写普通类属性。
  • dao:(持久层)xml中写数据库操作
  • service:(业务层)其中写各种接口还有实现,方法有关操作的可以调用dao中的方法,或 自己写其他服务(如 分页)
  • controller:(表现层)其中设置请求映射地址,ModelAndView 方法中,将存入的参数进行处理,可使用service方法,用ModelAndView传入页面,对页面进行操作(增加数据、跳转页面等)

页面发送请求给控制器,控制器调用业务层处理逻辑,业务层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。

部分代码示例

vo包中

package vo;

public class Student
{
	private String id;
	private String name;
	private String gender;
	private float java;
	private float english;
	private float math;
	private float totalScore;
	private float average;
}

driver包中:

package driver;

public class Driver 
{
	//存放目前集合中的学生信息
	public static List<Student> list=new ArrayList<Student>();

	public static void main(String args[])
	{
		int choice=menuChoice();
		while(choice!=7){
			switch(choice)
			{
				case 1:importFromExcel();break;
				case 2:importFromTxt();break;
				case 3:inputFromKeyboard();break;
				case 4:queryStudent();break;
				case 5:exportToExecel();break;
				case 6:exportToTxt();break;
				default:System.out.println("无效的选择");

			}
			choice=menuChoice();
		}
		System.out.println("程序成功退出");
		System.exit(0);

	}

	public static int menuChoice()
	{
		System.out.println("====学生成绩管理系统=====");
		System.out.println("1.	从excel中加载数据");
		System.out.println("2.	从文本文件加载数据");
		System.out.println("3.	键盘输入");
		System.out.println("4.	成绩查询");
		System.out.println("5.	输出到excel文件");
		System.out.println("6.	输出到纯文本文件");
		System.out.println("7.	退出");
		System.out.println("请输入选项:");
		Scanner scan=new Scanner(System.in);
		int choice=scan.nextInt();
		return choice;
	}
	public static void importFromExcel()
	{
		/*
		 * 调用dao中的方法
		 */
		StudentDAO dao=new StudentDAO();
		String fileName="c:/data/student.xls";
		List<Student> list1=dao.ReadFromExcel(fileName);	//dao中的方法
		list.addAll(list1); //将list1集合中的数据增加到list集合中
		System.out.println("成功从excel中导入"+list1.size()+"个学生");
	}
}

dao包中:

package dao;
	
public class StudentDAO 
{
	// 实现读学生文件,将读出的信息存放于student集合中
	public List<Student> ReadFromExcel(String fileName) 
	{

		List<Student> list = new ArrayList<Student>();
		File file = new File(fileName);
		try 
		{
			InputStream in = new FileInputStream(file);
			Workbook wb = Workbook.getWorkbook(in);
			Sheet s = wb.getSheet(0);
			for(int i = 1; i < s.getRows(); i++)   //第一行不要
			{
				Cell[] row = s.getRow(i);			
				Student student = new Student(row[0].getContents(), row[1].getContents(),   //填充数据
						row[2].getContents(), Float.parseFloat(row[3].getContents()),
						Float.parseFloat(row[4].getContents()), Float.parseFloat(row[5].getContents()));
				//由于读取的数据全部都是String 类型所以要转换成Float类型	
				student.setTotalScore(student.getEnglish()+student.getJava()+student.getMath());
				student.setAverage(student.getTotalScore()/3);
				list.add(student);						
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BiffException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}
}
posted @ 2018-11-28 22:25  Nemo&  阅读(5180)  评论(0编辑  收藏  举报