Java——简单Java类深入(数据表与简单Java类、一对多映射、双向一对多映射、多对多映射)
目录
1、数据表与简单Java类的映射
简单Java类是整个项目开发的灵魂,其有严格的开发标准,最为重要的是它要与数据表完全对应。由于目前没有接触过多的程序设计功能,所以对于此处的访问就有了一些限制,目前要求可以完成如下两个操作:
- 根据数据表的结构关系进行数据以及引用的设置;
- 根据数据表的结构可以取出所需要的数据。
选用熟悉的数据结构:dept、emp,实现这样的转换操作。现在开发要求如下:
1)使用以下的数据表与表中的字段:
- 雇员表emp:empno、ename、job、sal、comm、mgr、deptno;
- 部门表dept:deptno、dname、loc。
2)数据操作要求:
- 根据表结构完整的设置雇员、经理、部门的关系;
- 可以完成如下输出:
--可以输出一个雇员的完整信息,包括雇员 的领导、以及所在的部门信息;
--可以输出一个部门的完整信息,以及这个部门的所有雇员信息,以及这个雇员的领导信息。
【第一步】:写出基本字段的映射转换
- 雇员表emp:empno、ename、job、sal、comm、mgr、deptno;
- 部门表dept:deptno、dname、loc。
class Emp{
private int empno;
private String name;
private String job;
private double sal;
private double comm;
public Emp(){}
public Emp(int empno, String name, String job, double sal, double comm) {
this.empno = empno;
this.name = name;
this.job = job;
this.sal = sal;
this.comm = comm;
}
//setter getter暂时省略
public String getInfo(){
return "雇员编号:"+this.empno +",姓名:"+this.name +",职位:"+this.job+",佣金:"+this.sal+",佣金:"+this.comm;
}
}
class Dept{
private int deptno;
private String dname;
private String loc;
public Dept(){}
public Dept(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
//setter getter暂时省略
public String getInfo(){
return "部门编号:"+this.deptno +",名称:"+this.dname +",位置:"+this.loc;
}
}
【第二步】:设计关系字段
本程序存在两个关系:
- 自身关联:mgr字段,mgr也是一个雇员;
- 外键关联:deptno字段;
class Emp{
private int empno;
private String name;
private String job;
private double sal;
private double comm;
private Emp mgr;//领导,一个雇员一个领导
private Dept dept;//部门,一个雇员属于一个部门
public Emp(){}
public Emp(int empno, String name, String job, double sal, double comm) {
this.empno = empno;
this.name = name;
this.job = job;
this.sal = sal;
this.comm = comm;
}
public Emp getMgr() {
return mgr;
}
public void setMgr(Emp mgr) {
this.mgr = mgr;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
//setter getter暂时省略
public String getInfo(){
return "雇员编号:"+this.empno +",姓名:"+this.name +",职位:"+this.job+",佣金:"+this.sal+",佣金:"+this.comm;
}
}
class Dept{
private int deptno;
private String dname;
private String loc;
private Emp[] emps;
public Dept(){}
public Dept(int deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
//setter getter暂时省略
public Emp[] getEmps() {
return emps;
}
public void setEmps(Emp[] emps) {
this.emps = emps;
}
public String getInfo(){
return "部门编号:"+this.deptno +",名称:"+this.dname +",位置:"+this.loc;
}
}
【第三步】:执行数据操作
- 设置数据关系;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步:根据已有的表结构设置数据
//1、准备好所有独立的类对象
Dept dept =new Dept(10,"技术部","China");
Emp empA = new Emp(100,"张三","硬件工程师",800.0,0.0);
Emp empB = new Emp(100,"李四","软件工程师",900.0,0.0);
//2、设置关系
empA.setMgr(empB);//设置雇员与领导关系
empA.setDept(dept);//设置雇员与部门关系
empB.setDept(dept);//设置雇员与部门关系
dept.setEmps(new Emp[]{empA,empB});//一个部门包含多个雇员
}
}
- 取出雇员完整数据;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步:根据已有的表结构设置数据
//1、准备好所有独立的类对象
Dept dept =new Dept(10,"技术部","China");
Emp empA = new Emp(100,"张三","硬件工程师",800.0,0.0);
Emp empB = new Emp(100,"李四","软件工程师",900.0,0.0);
//2、设置关系
empA.setMgr(empB);//设置雇员与领导关系
empA.setDept(dept);//设置雇员与部门关系
empB.setDept(dept);//设置雇员与部门关系
dept.setEmps(new Emp[]{empA,empB});//一个部门包含多个雇员
//第二步:根据表结构,利用引用关系取出数据
System.out.println("雇员信息:"+empA.getInfo()); //输出雇员基本信息
System.out.println("领导信息:"+empA.getMgr().getInfo()); //输出雇员领导信息
System.out.println("部门信息:"+empA.getDept().getInfo()); //输出雇员部门信息
}
}
- 取出部门的完整信息
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步:根据已有的表结构设置数据
//1、准备好所有独立的类对象
Dept dept =new Dept(10,"技术部","China");
Emp empA = new Emp(100,"张三","硬件工程师",800.0,0.0);
Emp empB = new Emp(100,"李四","软件工程师",900.0,0.0);
//2、设置关系
empA.setMgr(empB);//设置雇员与领导关系
empA.setDept(dept);//设置雇员与部门关系
empB.setDept(dept);//设置雇员与部门关系
dept.setEmps(new Emp[]{empA,empB});//一个部门包含多个雇员
//第二步:根据表结构,利用引用关系取出数据
System.out.println("雇员信息:"+empA.getInfo()); //输出雇员基本信息
System.out.println("领导信息:"+empA.getMgr().getInfo()); //输出雇员领导信息
System.out.println("部门信息:"+empA.getDept().getInfo()); //输出雇员部门信息
System.out.println("==================================");
System.out.println(dept.getInfo());//部门信息
for(int x=0;x<dept.getEmps().length;x++){
System.out.println(dept.getEmps()[x].getInfo());
if(dept.getEmps()[x].getMgr()!=null)
System.out.println(dept.getEmps()[x].getMgr().getInfo());
}
}
}
2、一对多数据映射
【举例】:课程分类
一个课程分类有多个子分类,要求:
- 利用简单Java类实现数据表的还原;
- 进行如下输出:
--可以输出一个子分类的信息,同时输出它所对应的分类信息;
--可以输出一个分类的信息,及所包含的所有子分类信息;
第一步:实现基本字段
class Item{
private int iid;
private String title;
private String note;
//setter getter 无参省略
public Item(int iid, String title, String note) {
this.iid = iid;
this.title = title;
this.note = note;
}
public String getInfo(){
return "id:"+this.iid+",名称:"+this.title+",简介:"+this.note;
}
}
class SubItem{
private int sid;
private String title;
private String note;
public SubItem(int sid, String title, String note) {
this.sid = sid;
this.title = title;
this.note = note;
}
public String getInfo(){
return "id:"+this.sid+",名称:"+this.title+",简介:"+this.note;
}
}
第二步:设置关联
class Item{
private int iid;
private String title;
private String note;
private SubItem[] subItems;
public Item(int iid, String title, String note) {
this.iid = iid;
this.title = title;
this.note = note;
}
//其他 setter getter 无参省略
public SubItem[] getSubItems() {
return subItems;
}
public void setSubItems(SubItem[] subItems) {
this.subItems = subItems;
}
public String getInfo(){
return "id:"+this.iid+",名称:"+this.title+",简介:"+this.note;
}
}
class SubItem{
private int sid;
private String title;
private String note;
private Item item;
public SubItem(int sid, String title, String note) {
this.sid = sid;
this.title = title;
this.note = note;
}
public Item getItem() {
return item;
}
public void setItem(Item item) {
this.item = item;
}
public String getInfo(){
return "id:"+this.sid+",名称:"+this.title+",简介:"+this.note;
}
}
第三步:设置并取得数据
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//准备出所有独立对象
Item item = new Item(100,"化工专业","搞化学的");
SubItem subItemA = new SubItem(1001,"炼油","炼油的");
SubItem subItemB = new SubItem(1002,"提纯","提纯的");
//设置彼此引用关系
item.setSubItems(new SubItem[]{subItemA,subItemB});
subItemA.setItem(item);
subItemB.setItem(item);
//取出数据
System.out.println(subItemA.getInfo());
System.out.println(subItemA.getItem().getInfo());
System.out.println(item.getInfo());
for(int i=0;i<item.getSubItems().length;i++){
System.out.println(item.getSubItems()[i].getInfo());
}
}
}
以上是基本功,以后开发都要基于此步骤。
3、双向一对多映射
【举例】:用户-课程-考试成绩
要求:
- 根据数据表结构进行简单Java类转换;
- 实现如下的信息输出:
--根据课程取得全部参与该课程的用户信息及考试成绩;
--用户可取得自己参加的所有课程信息及考试成绩;
【关系分析】:一个用户可参加多个课程,每个课程可以有多个用户参加,每个用户对于每个课程都会有成绩,此时最麻烦的是用户课程关系表中除了关联字段外,还有其他字段,这样的表一个要单独定义成一个实体类,所以,以上需要三个类。
第一步:完成基本字段
class User{
private int uid;
private String name;
public User(int uid, String name) {
this.uid = uid;
this.name = name;
}
public String getInfo(){
return "用户编号:"+this.uid+",姓名:"+this.name;
}
}
class Course{
private int cid;
private String title;
private int num;
private String note;
public Course(int cid, String title, int num, String note) {
this.cid = cid;
this.title = title;
this.num = num;
this.note = note;
}
public String getInfo(){
return "课程编号:"+this.cid+",名称:"+this.title +",课时:"+this.num+",简介:"+this.note;
}
}
第二步:进行字段关联,一般以外键为主;
为了进行关联,需要引入一个新的类:要保存用户、课程等信息的联系;
class User{
private int uid;
private String name;
private UserCourse ucs[];
public User(int uid, String name) {
this.uid = uid;
this.name = name;
}
public String getInfo(){
return "用户编号:"+this.uid+",姓名:"+this.name;
}
public UserCourse[] getUcs() {
return ucs;
}
public void setUcs(UserCourse[] ucs) {
this.ucs = ucs;
}
}
class Course{
private int cid;
private String title;
private int num;
private String note;
private UserCourse ucs[];
public Course(int cid, String title, int num, String note) {
this.cid = cid;
this.title = title;
this.num = num;
this.note = note;
}
public String getInfo(){
return "课程编号:"+this.cid+",名称:"+this.title +",课时:"+this.num+",简介:"+this.note;
}
public UserCourse[] getUcs() {
return ucs;
}
public void setUcs(UserCourse[] ucs) {
this.ucs = ucs;
}
}
class UserCourse{
private User user;
private Course course;
private String note;
private double score;
public UserCourse(User user, Course course, String note, double score) {
this.user = user;
this.course = course;
this.note = note;
this.score = score;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Course getCourse() {
return course;
}
public void setCourse(Course course) {
this.course = course;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
第三步:测试程序
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步:设置类与类之间的关系
//1、定义单独类对象
User userA = new User(100,"张三");
User userB = new User(101,"李四");
User userC = new User(102,"王五");
Course courseA = new Course(1,"Oracle",10,"-");
Course courseB = new Course(2,"Java",50,"-");
//2、设置关联
UserCourse uca = new UserCourse(userA,courseA,"无评价",100.0);
UserCourse ucb = new UserCourse(userA,courseB,"无评价",90.0);
UserCourse ucc = new UserCourse(userB,courseA,"无评价",99.0);
UserCourse ucd = new UserCourse(userC,courseA,"无评价",79.0);
UserCourse uce = new UserCourse(userC,courseB,"无评价",77.0);
//3、在用户中设置关系
userA.setUcs(new UserCourse[]{uca,ucb});
userB.setUcs(new UserCourse[]{ucc});
userC.setUcs(new UserCourse[]{ucd,uce});
courseA.setUcs(new UserCourse[]{uca,ucc,ucd});
courseB.setUcs(new UserCourse[]{ucb,uce});
//第二部:获取数据
//输出课程信息
System.out.println(courseA.getInfo());
System.out.println(courseB.getInfo());
//输出参与该课程的用户信息
for(int i=0;i<courseA.getUcs().length;i++){
System.out.println("参与课程的用户信息:"+courseA.getUcs()[i].getUser().getInfo()+",考试成绩:"+courseA.getUcs()[i].getScore());
}
//输出用户信息及参与的所有课程
System.out.println(userA.getInfo());
for(int i=0;i<userA.getUcs().length;i++){
System.out.println("参与课程:"+userA.getUcs()[i].getCourse().getInfo()+",考试成绩:"+userA.getUcs()[i].getScore());
}
}
}
与上一个程序相比,唯一麻烦的是中间关系表上有其他字段,代码链是本次程序的重点所在。
4、多对多数据映射
【举例】:权限-权限组-用户-角色-角色权限组
要求:
- 1、将数据还原为简单Java类;
- 2、数据输出:
--根据一个用户,输出其对应的角色以及每个角色对应的权限,以及包含的具体的权限详情;
--一个权限可以输出具备此权限的角色,以及具备此角色的所有管理员,同时输出该权限的所有权限详情;
--一个角色可以输出它所包含的管理员,每个管理员对应的具体权限,以及权限详情;
【第一步】:数据表转换为简答Java类
//用户
class User{
private String userid;
private String name;
private String password;
public User(String userid, String name, String password) {
this.userid = userid;
this.name = name;
this.password = password;
}
public String getInfo(){
return "用户ID:"+this.userid+",姓名:"+this.name+",密码"+this.password;
}
}
//角色
class Role{
private int rid;
private String title;
public Role(int rid, String title) {
this.rid = rid;
this.title = title;
}
public String getInfo(){
return "角色编号:"+this.rid+",名称:"+this.title;
}
}
//权限组
class Group{
private int gid;
private String title;
public Group(int gid, String title) {
this.gid = gid;
this.title = title;
}
public String getInfo(){
return "权限组编号:"+this.gid+",组名称:"+this.title;
}
}
//权限
class Action{
private int aid;
private String title;
private String url;
public Action(int aid, String title, String url) {
this.aid = aid;
this.title = title;
this.url = url;
}
public String getInfo(){
return "权限编号:"+this.aid+",权限名称:"+this.title+",权限路径:"+this.url;
}
}
第二步:设置关系
- 一个角色包含多个用户,一对多关系;
- 一个权限组包含多个权限,一对多关系;
- 一个角色对应有多个权限组,每个权限组可能有多个角色,多对多关系;
//用户
class User{
private String userid;
private String name;
private String password;
private Role role;
public User(String userid, String name, String password) {
this.userid = userid;
this.name = name;
this.password = password;
}
public String getInfo(){
return "用户ID:"+this.userid+",姓名:"+this.name+",密码"+this.password;
}
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
//角色
class Role{
private int rid;
private String title;
private User users[];
private Group groups[];
public Role(int rid, String title) {
this.rid = rid;
this.title = title;
}
public String getInfo(){
return "角色编号:"+this.rid+",名称:"+this.title;
}
public User[] getUsers() {
return users;
}
public void setUsers(User[] users) {
this.users = users;
}
public Group[] getGroups() {
return groups;
}
public void setGroups(Group[] groups) {
this.groups = groups;
}
}
//权限组
class Group{
private int gid;
private String title;
private Action actions[];
private Role roles[];
public Group(int gid, String title) {
this.gid = gid;
this.title = title;
}
public String getInfo(){
return "权限组编号:"+this.gid+",组名称:"+this.title;
}
public Action[] getActions() {
return actions;
}
public void setActions(Action[] actions) {
this.actions = actions;
}
public Role[] getRoles() {
return roles;
}
public void setRoles(Role[] roles) {
this.roles = roles;
}
}
//权限
class Action{
private int aid;
private String title;
private String url;
private Group group;
public Action(int aid, String title, String url) {
this.aid = aid;
this.title = title;
this.url = url;
}
public String getInfo(){
return "权限编号:"+this.aid+",权限名称:"+this.title+",权限路径:"+this.url;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
【第三步】:定义实例对象,测试程序
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步:根据表结构设置关系
//1、定义单独类对象
User ua = new User("user-a","用户A","1111");
User ub = new User("user-b","用户B","1111");
User uc = new User("user-c","用户C","1111");
//2、定义权限
Action act1 = new Action(1,"新闻管理","www....");
Action act2 = new Action(2,"用户管理","www....");
Action act3 = new Action(3,"备份管理","www....");
Action act4 = new Action(4,"缓存管理","www....");
Action act5 = new Action(5,"数据管理","www....");
//3、定义权限组
Group g1 = new Group(1,"数据管理");
Group g2 = new Group(2,"人事管理");
Group g3 = new Group(3,"信息管理");
//4、定义角色信息
Role r1 = new Role(10,"超级管理员角色");
Role r2 = new Role(10,"普通管理员角色");
//5、设置权限组与权限的关系,一对多
act1.setGroup(g1);
act2.setGroup(g1);
act3.setGroup(g2);
act4.setGroup(g2);
act5.setGroup(g3);
g1.setActions(new Action[]{act1,act2});
g2.setActions(new Action[]{act3,act4});
g3.setActions(new Action[]{act5});
//6、权限组与角色的关系
r1.setGroups(new Group[]{g1,g2,g3});
r2.setGroups(new Group[]{g2,g3});
g1.setRoles(new Role[]{r1});
g2.setRoles(new Role[]{r1,r2});
g3.setRoles(new Role[]{r1,r2});
//7、定义用户与角色关系
ua.setRole(r1);
ub.setRole(r2);
uc.setRole(r2);
r1.setUsers(new User[]{ua});
r2.setUsers(new User[]{ub,uc});
}
}
【第四步】:输出信息
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//第一步:根据表结构设置关系
//1、定义单独类对象
User ua = new User("user-a","用户A","1111");
User ub = new User("user-b","用户B","1111");
User uc = new User("user-c","用户C","1111");
//2、定义权限
Action act1 = new Action(1,"新闻管理","www....");
Action act2 = new Action(2,"用户管理","www....");
Action act3 = new Action(3,"备份管理","www....");
Action act4 = new Action(4,"缓存管理","www....");
Action act5 = new Action(5,"数据管理","www....");
//3、定义权限组
Group g1 = new Group(1,"数据管理");
Group g2 = new Group(2,"人事管理");
Group g3 = new Group(3,"信息管理");
//4、定义角色信息
Role r1 = new Role(10,"超级管理员角色");
Role r2 = new Role(10,"普通管理员角色");
//5、设置权限组与权限的关系,一对多
act1.setGroup(g1);
act2.setGroup(g1);
act3.setGroup(g2);
act4.setGroup(g2);
act5.setGroup(g3);
g1.setActions(new Action[]{act1,act2});
g2.setActions(new Action[]{act3,act4});
g3.setActions(new Action[]{act5});
//6、权限组与角色的关系
r1.setGroups(new Group[]{g1,g2,g3});
r2.setGroups(new Group[]{g2,g3});
g1.setRoles(new Role[]{r1});
g2.setRoles(new Role[]{r1,r2});
g3.setRoles(new Role[]{r1,r2});
//7、定义用户与角色关系
ua.setRole(r1);
ub.setRole(r2);
uc.setRole(r2);
r1.setUsers(new User[]{ua});
r2.setUsers(new User[]{ub,uc});
//第二步:取出数据
//根据一个用户,输出其对应的角色以及每个角色对应的权限,以及包含的具体的权限详情;
System.out.println(ua.getInfo());
System.out.println("角色:"+ua.getRole().getInfo());
for(int x=0;x<ua.getRole().getGroups().length;x++){
System.out.println("权限组:"+ua.getRole().getGroups()[x].getInfo());
for(int y=0;y<ua.getRole().getGroups()[x].getActions().length;y++){
System.out.println("权限:"+ua.getRole().getGroups()[x].getActions()[y].getInfo());
}
}
System.out.println("========================================");
//一个权限可以输出具备此权限的角色,以及具备此角色的所有管理员,同时输出该权限的所有权限详情;
System.out.println(act1.getInfo());
for(int x=0;x<act1.getGroup().getRoles().length;x++){
System.out.println("角色:"+act1.getGroup().getRoles()[x].getInfo());
for(int y=0;y<act1.getGroup().getRoles()[x].getUsers().length;y++){
System.out.println("用户"+act1.getGroup().getRoles()[x].getUsers()[y].getInfo());
}
}
System.out.println("========================================");
//一个角色可以输出它所包含的管理员,每个管理员对应的具体权限,以及权限详情;
System.out.println(r1.getInfo());
for(int x=0;x<r1.getUsers().length;x++){
System.out.println("用户:"+r1.getUsers()[x].getInfo());
for(int y=0;y<r1.getGroups().length;y++){
System.out.println("权限组:"+r1.getGroups()[y].getInfo());
for(int z=0;z<r1.getGroups()[y].getActions().length;z++){
System.out.println("权限:"+r1.getGroups()[y].getActions()[z].getInfo());
}
}
}
}
}
作于202004142310,已归档
———————————————————————————————————
本文为博主原创文章,转载请注明出处!
若本文对您有帮助,轻抬您发财的小手,关注/评论/点赞/收藏,就是对我最大的支持!
祝君升职加薪,鹏程万里!
文章来源: winter.blog.csdn.net,作者:Winter_world,版权归原作者所有,如需转载,请联系作者。
原文链接:winter.blog.csdn.net/article/details/105418417
- 点赞
- 收藏
- 关注作者
评论(0)