数据表与简单Java类映射转换(一对多、多对多、角色与权限) - Java基础知识 6

                                                        目录

数据表与简单Java类映射转换

一对多映射

多对多映射

角色与权限


学习笔记

数据表与简单Java类映射转换

简单Java是学习到现在面向对象的简单Java类设计基础,但是对于实际开发中,简单Java类的定义有依据的,根据数据表的结构来实现简单Java类。

在数据库中实际上提供了若干个数据表,那么一个实体数据表都可以变数出一些具体的事物概念,例如:雇员信息表、部门信息表,一看就知道描述部门的信息。

那么按照这个思路,程序类的设计和这些实体表的设计差别不大;所以在实际的开发之中数据表与简单Java类之间的映射关系如下:

  • 数据表的设计 = 类的定义 ;
  • 表中的字段 = 类的成员属性 ;
  • 表的外键关联 = 引用实现;
  • 表的一行记录 = 类的一个实例化对象 ;
  • 表的多行记录 = 对象数组 ;

 

以上图中可以发现如下关联关系:

  • 一个部门可以对应多个部员;
  • 一个雇员属于一个部门 ;
  • 一个雇员有一个领导 ;

将以上的数据表转换为简单Java类的定义,在整体程序代码之中,要求获得以下信息:

  • 根据部门信息,获取以下内容:

         |- 一个部门完整信息

         |- 一个部门中所有雇员的信息

         |- 一个雇员的领导信息

  • 根据雇员信息获得以下内容:

        |- 一个雇员所在的部门信息

        |-一个雇员对应的领导信息

对于数据表与简单Java之间的映射,最好的解决步骤:先抛开所有的关联字段不看,写出类的基本组成,而后根据引用配置关联字段的关系。

第一步:定义Empt、Dept 实体类

class Dept{
	private long deptno ; //描述数据表主键时候建议类型用long
	private String dname ;
	private String loc ;

	public Dept(){}
	public Dept(long deptno, String dname, String loc){
		this.deptno = deptno ;
		this.dname = dname ;
		this.loc = loc ;
	}

	public String getInfo(){
		return "【部门信息】部门编号:" + this.deptno + 
			   "、部门名称:" + this.dname +
			   "、部门位置:" + this.loc ;
	}
	//setter、getter略
}

class Emp{
	private long empno ;
	private String ename ;
	private String job ;
	private double sal ;
	private double comm ;
	
	public Emp(){}
	public Emp(long empno, String ename, String job, double sal, double comm){
		this.empno = empno ;
		this.ename = ename ;
		this.job = job ;
		this.sal = sal ;
		this.comm = comm ;

	}

	public String getInfo(){
		return "【雇员信息】雇员编号:" + this.ename +
			   "、雇员名字:" + this.ename +
			   "、雇员职位:" + this.job +
			   "、基本工资:" + this.sal +
			   "、佣金:" + this.comm ;
	}
	//setter getter 略
}


public class ArrayDemo{
	public static void main(String args[]){

	}
}

第二步:配置所有的关联字段

class Dept{
	private long deptno ; //描述数据表主键时候建议类型用long
	private String dname ;
	private String loc ;
	private Emp emps [] ;

	public Dept(){}
	public Dept(long deptno, String dname, String loc){
		this.deptno = deptno ;
		this.dname = dname ;
		this.loc = loc ;
	}
	
	public void setEmp(Emp [] emps){
		this.emps = emps ;
	}
	public Emp [] getEmp(){
		return this.emps ;
	}

	public String getInfo(){
		return "【部门信息】部门编号:" + this.deptno + 
			   "、部门名称:" + this.dname +
			   "、部门位置:" + this.loc ;
	}
	//setter、getter略
}

class Emp{
	private long empno ;
	private String ename ;
	private String job ;
	private double sal ;
	private double comm ;
	private Dept dept ; //所属部门
	private Emp mgr ; // 所属领导
	
	public Emp(){}
	public Emp(long empno, String ename, String job, double sal, double comm){
		this.empno = empno ;
		this.ename = ename ;
		this.job = job ;
		this.sal = sal ;
		this.comm = comm ;

	}
	
	public void setDept(Dept dept){
		this.dept = dept ;
	}
	public void setMgr(Emp mgr){
		this.mgr = mgr ; 
	}
	public Dept getDeept(){
		return this.dept ;
	}
	public Emp getMgr(){
		return this.mgr ;
	}

	public String getInfo(){
		return "【雇员信息】雇员编号:" + this.ename +
			   "、雇员名字:" + this.ename +
			   "、雇员职位:" + this.job +
			   "、基本工资:" + this.sal +
			   "、佣金:" + this.comm ; 
	}
	//setter getter 略
}


public class ArrayDemo{
	public static void main(String args[]){

	}
}

在以后项目开发中,一定分两个步骤实现的:

  • 第一步:根据表的结构关系进行表的配置(本文分第一、二步);
  • 第二步:根据要求根据结构获取数据 ;

 

范例:实现项目的开发要求

class Dept{
	private long deptno ; //描述数据表主键时候建议类型用long
	private String dname ;
	private String loc ;
	private Emp emps [] ;

	public Dept(){}
	public Dept(long deptno, String dname, String loc){
		this.deptno = deptno ;
		this.dname = dname ;
		this.loc = loc ;
	}
	
	public void setEmp(Emp [] emps){
		this.emps = emps ;
	}
	public Emp [] getEmp(){
		return this.emps ;
	}

	public String getInfo(){
		return "【部门信息】部门编号:" + this.deptno + 
			   "、部门名称:" + this.dname +
			   "、部门位置:" + this.loc ;
	}
	//setter、getter略
}

class Emp{
	private long empno ;
	private String ename ;
	private String job ;
	private double sal ;
	private double comm ;
	private Dept dept ; //所属部门
	private Emp mgr ; // 所属领导
	
	public Emp(){}
	public Emp(long empno, String ename, String job, double sal, double comm){
		this.empno = empno ;
		this.ename = ename ;
		this.job = job ;
		this.sal = sal ;
		this.comm = comm ;

	}
	
	public void setDept(Dept dept){
		this.dept = dept ;
	}
	public void setMgr(Emp mgr){
		this.mgr = mgr ; 
	}
	public Dept getDept(){
		return this.dept ;
	}
	public Emp getMgr(){
		return this.mgr ;
	}

	public String getInfo(){
		return "【雇员信息】雇员编号:" + this.ename +
			   "、雇员名字:" + this.ename +
			   "、雇员职位:" + this.job +
			   "、基本工资:" + this.sal +
			   "、佣金:" + this.comm ; 
	}
	//setter getter 略
}


public class ArrayDemo{
	public static void main(String args[]){
		// 第一步:根据关系进行类的定义, 定义出各个关系的实例化对象,此时没有任何的关联定义
		Dept dept = new Dept(10, "财务部", "上海");
		Emp empA = new Emp(5478L, "张三", "程序员", 800.00, 0.0) ;
		Emp empB = new Emp(2478L, "李四", "事务员", 500.00, 1320.0) ;
		Emp empC = new Emp(5478L, "王五", "KING", 5430.00, 450.0) ;

		// 进行关联设计
		empA.setDept(dept) ; // 设置部员与部门的关联
		empB.setDept(dept) ;
		empC.setDept(dept) ;

		empA.setMgr(empC) ; // 设置部员与领导的关联
		empB.setMgr(empC) ;

		dept.setEmp(new Emp [] {empA, empB, empC} ) ; // 设置部门与雇员的关联

		// 第二步:根据关系获取数据
		System.out.println(dept.getInfo()) ;
		for (int i = 0; i < dept.getEmp().length ; i ++){
			System.out.println( "\t|- " + dept.getEmp()[i].getInfo() ) ;
			if(dept.getEmp()[i].getMgr() != null){
				System.out.println("\t\t|-【领导信息】" + dept.getEmp()[i].getMgr().getInfo()) ;
			}
		}
		System.out.println("----------------------------------------------");
		System.out.println(empA.getDept().getInfo()) ;
		System.out.println(empB.getDept().getInfo()) ;
		System.out.println(empC.getDept().getInfo()) ;
	}
}

这种转换形式需要熟练的掌握,牵扯到引用和代码链的使用。

一对多映射

 

按照要求将表结构转换为类结构,同时获取如下信息:

  • 获取一个完整的分类信息
  • 可以根据分类获取其对应的所有子类信息

class Item{
	private long iid ;
	private String title ;

	private SubItem subItems [] ;

	public Item(){}
	public Item(long iid, String title){
		this.iid = iid ;
		this.title = title ;
	}
	
	public void setSubItems(SubItem subItems []){
		this.subItems = subItems ;
	}
	public SubItem [] getSubItems(){
		return this.subItems ;
	}

	public String getInfo(){
		return "【分类信息】分类ID: " + this.iid +
			   "、分类名称:" + this.title ;
	}

	// setter getter略
}

class SubItem{
	private long sid ;
	private String title ;

	private Item item;

	public SubItem(){}
	public SubItem(long sid, String title){
		this.sid = sid ;
		this.title = title ;
	}
	
	public void setItem(Item item){
		this.item = item ;
	}
	public Item getItem(){
		return this.item ;
	}

	public String getInfo(){
		return "【子分类信息】分类id: " + this.sid +
			   "、分类名称:" + this.title ; 
	}
	//setter getter 略
	
}


public class ArrayDemo{
	public static void main(String args[]){
		// 第一步: 根据结构设置设置数据
		Item item = new Item(12343L, "java");
		SubItem subitems [] = new SubItem [] {
			new SubItem(13453L, "基础知识"),
			new SubItem(56443L, "引用知识"),
			new SubItem(87543L, "高级特性")
		} ;
		item.setSubItems(subitems) ;
		for (int i = 0; i < subitems.length ; i ++){
			subitems[i].setItem(item) ;
		}
		// 第二步 : 获取数据
		System.out.println(item.getInfo()) ;

		for (int i = 0; i < item.getSubItems().length ; i++){
			System.out.println("\t|- " + item.getSubItems()[i].getInfo()) ;
		}

	}
}

多对多映射

此时这个程序只需要考虑实体表的设计即可,也就是说对于中间的访问信息表不要求进行转换处理,只需要定义两个类。

class Member{
	private String mid ;
	private String name ;
	
	private Product products [] ;

	public Member(){}
	public Member(String mid, String name){
		this.mid = mid ;
		this.name = name ;
	}
	
	public void setProducts(Product products []){
		this.products = products ;
	}
	public Product [] getProducts(){
		return this.products ;
	}

	public String getInfo(){
		return "【用户信息】Id:" + this.mid +
			   "、姓名:" + this.name ;
	}
	//setter getter 略
}

class Product{
	private long pid ;
	private String title ;
	private double price ;

	private Member members[] ;

	public Product(){}
	public Product(long pid, String title, double price){
		this.pid = pid ;
		this.title = title ;
		this.price = price ;
	}

	public void setMembers(Member members []){
		this.members = members ;
	}
	public Member [] getMembers(){
		return this.members ;
	}
	
	public String getInfo(){
		return "【商品信息】ID:" + this.pid +
			   "、名称:" + this.title +
			   "、价格:" + this.price ;

	}
	//setter getter 略
}

public class ArrayDemo{
	public static void main(String args[]){
		// 第一步: 根据结构设置对象数组
		Member memA = new Member("575", "张三") ;
		Member memB = new Member("577", "李四") ;
		Product proA = new Product(1L, "java开发", 79.8) ; 
		Product proB = new Product(2L, "耳机", 2479.8) ;
		Product proC = new Product(3L, "手机", 3079.8) ;
		memA.setProducts(new Product[] {proA, proB, proC}) ;
		memB.setProducts(new Product[] {proA}) ;
		proA.setMembers(new Member [] {memA, memB}) ;
		proB.setMembers(new Member [] {memA}) ;
		proC.setMembers(new Member [] {memA}) ;
		
		// 第二步:根据要求获取数据
		System.out.println("----------根据用户查看浏览商品信息----------") ;
		System.out.println(memA.getInfo()) ;
		for (int i = 0; i < memA.getProducts().length ; i++ ){
			System.out.println("\t|- " + memA.getProducts()[i].getInfo()) ;
		}
		System.out.println("----------根据商品找到被浏览信息----------") ;
				System.out.println(proA.getInfo()) ;
		for (int i = 0; i < proA.getMembers().length ; i++ ){
			System.out.println("\t|- " + proA.getMembers()[i].getInfo()) ;
		}
		
	}
}

角色与权限

 

四个表但是定义三个类,关系表不作为一个类的出现。

class Member{
	private String mid ;
	private String name ;
	private Role roles [] ;

	public Member(){}
	public Member(String mid, String name ){
		this.mid = mid ;
		this.name = name ;
	}
	
	public void setRoles(Role roles []){
		this.roles = roles ;
	}
	public Role [] getRoles(){
		return this.roles ;
	}

	public String getInfo(){
		return "【用户信息】ID:" + this.mid + 
			   "、名称:" + this.name ;
	}
	// setter getter略
}
class Role{
	private long rid ;
	private String title;
	private Member members [];
	private Privilege privileges [] ;


	public Role(){}
	public Role(long rid, String title){
		this.rid = rid ;
		this.title = title ;
	}
	
	public void setMembers(Member members []){
		this.members = members;
	}
	public void setPrivileges(Privilege privileges []){
		this.privileges = privileges ;
	}
	public Member [] getMembers(){
		return this.members ;
	}
	public Privilege [] getPrivileges(){
		return this.privileges ;
	}

	public String getInfo(){
		return "【角色信息】ID:" + this.rid + 
			   "、名称:" + this.title ;
	}
	// setter getter略
}

class Privilege{
	private long pid ;
	private String title ;
	private Role role ;

	public Privilege(){}
	public Privilege(long pid, String title){
		this.pid = pid ;
		this.title = title ;
	}

	public void setRole(Role role){
		this.role =role ;
	}
	public Role getRole(){
		return this.role ;
	}

	public String getInfo(){
		return "【权限信息】ID:" + this.pid +
			   "、名称:" + this.title ;		
	}
	// setter getter略
}

public class ArrayDemo{
	public static void main(String args[]){
		// 第一步: 根据结构设置对象数组
		Member memA = new Member("4566", "张三") ;
		Member memB = new Member("5466", "李四") ;
		Role roleA = new Role(1L, "系统配置") ;
		Role roleB = new Role(2L, "备份服务") ;
		Role roleC = new Role(3L, "人事管理") ;
		Privilege priA = new Privilege(1000L, "系统初始化") ;
		Privilege priB = new Privilege(1001L, "系统还原") ;
		Privilege priC = new Privilege(1002L, "系统环境处理") ;
		Privilege priD = new Privilege(2000L, "备份员工数据") ;
		Privilege priE = new Privilege(2001L, "备份部门数据") ;
		Privilege priF = new Privilege(2002L, "备份公文数据") ;
		Privilege priG = new Privilege(3000L, "增加员工") ;
		Privilege priH = new Privilege(3001L, "编辑员工") ;
		Privilege priI = new Privilege(3002L, "浏览员工") ;
		Privilege priJ = new Privilege(3003L, "员工离职") ;
	    // 增加角色与权限的对应关系
		roleA.setPrivileges(new Privilege[] {priA, priB, priC} ) ;
		roleB.setPrivileges(new Privilege[] {priD, priE, priF} ) ;
		roleC.setPrivileges(new Privilege[] {priG, priH, priI, priJ} ) ;
		//增加权限与角色的对应
		priA.setRole(roleA) ;
		priB.setRole(roleA) ;
		priC.setRole(roleA) ;
		priD.setRole(roleB) ;
		priE.setRole(roleB) ;
		priF.setRole(roleB) ;
		priG.setRole(roleC) ;
		priH.setRole(roleC) ;
		priI.setRole(roleC) ;
		priJ.setRole(roleC) ;
		// 增加用户与角色的对应关系
		memA.setRoles(new Role [] {roleA, roleB}) ;
		memB.setRoles(new Role [] {roleA, roleB, roleC}) ;

		roleA.setMembers(new Member[] {memA, memB}) ;
		roleB.setMembers(new Member[] {memA, memB}) ;
		roleC.setMembers(new Member[] {memB}) ;
		
		// 第二步:根据要求获取数据
		System.out.println("-----------根据用户查找信息--------") ;
		System.out.println(memA.getInfo()) ;
		for (int i = 0 ; i < memA.getRoles().length ; i ++ ){
			System.out.println("\t|- " + memA.getRoles()[i].getInfo()) ;
			for (int j = 0; j < memA.getRoles()[i].getPrivileges().length ; j ++){
					System.out.println("\t\t|- " + memA.getRoles()[i].getPrivileges()[j].getInfo()) ;
			}
		}
		System.out.println("-----------根据角色查找信息--------") ;
		System.out.println(roleA.getInfo() ) ;
		System.out.println("\t|- 浏览此角色下的所有权限信息") ;
		for (int i = 0; i < roleA.getPrivileges().length ; i++){
			System.out.println("\t\t|- " + roleA.getPrivileges()[i].getInfo());

		}
		System.out.println("\t|- 浏览此角色下的所有用户信息") ;
		for (int i = 0 ; i < roleA.getMembers().length; i++ ){
			System.out.println("\t\t|- " + roleA.getMembers()[i].getInfo()) ;
		}
		System.out.println("-----------根据权限查找信息--------") ;
		System.out.println(priA.getInfo() ) ;
		for (int i = 0 ; i < priA.getRole().getMembers().length; i++){
			System.out.println("\t|- " +priA.getRole().getMembers()[i].getInfo() );
		}



	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值