表和表三种关系以及实战、

对应的学习天数是第33天开始,到时候再补上来。 


一:表: 

Hibernate: 
ORM:
      关系表:-------> javaBean 
      记录:--------->对象:new Student(“lisi”,21);
      字段:-------- >类当中的属性: 
      
类和类的关系; (对象和对象之间的关系)
  是一个:继承: 
  有一个:关联
  使用:依赖


 //继承关系:
  class SubClass扩展SupClass {
  
   private Address add; //有
   
   
   //使用 
   公共SubClass(地址添加){
      this.add = add; 
   }
  
  }
  


  表和表之间的关系:三种:(重点)

一对多的关系:(重要)
  用户订单 
  部门Emp 
  客户LinkMan 

 
  (1)创建表: 维护表和表之间的关系:  Customer Order 
  (2)创建实体类, 维护实体类之前的关系: 
  (3)保存和查询操作: 
  
  步骤一: 
  创建表: Customer 主键表,优先创建
        Order 外键表:  后创建:  
  
  
  #主键表:      
   create table customers (
       cid  int  primary key,
       cname varchar(100), 
       city  varchar(100)
   )
   
   #外键表: 

      CREATE TABLE orders(
      oid INT PRIMARY KEY, 
      oname VARCHAR(100), 
      num  INT (100), 
      price FLOAT (10,2), 
      customer_id INT  ,
      CONSTRAINT customer_id_forKey FOREIGN KEY(customer_id)  REFERENCES customers(cid)
   )

 步骤二:  实体类的设计: 
   Class Customer{
   
    //普通的属性; 
    //创建和Order之间的关系; 
    private List orders = new ArrayList();
   }
   
   Class Order {
   
     //Order的普通的属性: 
     private Customer customer = new Customer(); 
     
   }
   CUSTOMER.JAVA

package com.yidongxueyuan.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/*
 *    create table customers (
       cid  int  primary key,
       cname varchar(100), 
       city  varchar(100)
      )
 */
public class Customer  implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer cid; 
	private String cname; 
	private String city;
	
	
	//创建Customer 表和Order关系; 
	private List orders = new ArrayList();
	
	public Integer getCid() {
		return cid;
	}
	public void setCid(Integer cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public Customer(Integer cid, String cname, String city) {
		super();
		this.cid = cid;
		this.cname = cname;
		this.city = city;
	}
	public Customer() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Customer [cid=" + cid + ", cname=" + cname + ", city=" + city
				+ "]";
	}
	public List getOrders() {
		return orders;
	}
	public void setOrders(List orders) {
		this.orders = orders;
	} 
	
}

order.java

package com.yidongxueyuan.domain;

/*
 *  CREATE TABLE orders(
      oid INT PRIMARY KEY, 
      oname VARCHAR(100), 
      num  INT (100), 
      price FLOAT (10,2), 
      customer_id INT  ,---外键
      CONSTRAINT customer_id_forKey FOREIGN KEY(customer_id)  REFERENCES customers(cid)
   )
 */
public class Order {
	private Integer oid;
	private String oname;
	private Integer num;
	
	private float price;
	
	//Order只属于某一给客户: 
	private Customer customer = new Customer(); 
	
	public Integer getOid() {
		return oid;
	}
	public void setOid(Integer oid) {
		this.oid = oid;
	}
	public String getOname() {
		return oname;
	}
	public void setOname(String oname) {
		this.oname = oname;
	}
	public Integer getNum() {
		return num;
	}
	public void setNum(Integer num) {
		this.num = num;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public Order(Integer oid, String oname, Integer num, float price) {
		super();
		this.oid = oid;
		this.oname = oname;
		this.num = num;
		this.price = price;
	}
	public Order() {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "Order [oid=" + oid + ", oname=" + oname + ", num=" + num
				+ ", price=" + price + ", customer=" + customer + "]";
	}
	public Customer getCustomer() {
		return customer;
	}
	public void setCustomer(Customer customer) {
		this.customer = customer;
	}
	
}


  步骤三:使用QueryRunner实现多表的查询和保存操作:
  
  保存操作: Customer : 如果Customer有订单信息, 级联保存定义信息;     ····
  查询:       查询客户, 如果客户有订单信息, 查不查? (看需求: ) 
                  1 :查询客户信息, 查订单信息, 立即加载。
                  2 :查询客户信息, 不查询订单信息, 只有当用到订单信息的时候,才进行查询, 这样的加载称之:懒加载。 
  dao层实现如下:

   下面程序中的级联保存,当customer当中有 order时候,也会一起保存,称之为级联。

package com.yidongxueyuan.domain;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.yidongxueyuan.utils.C3P0Util;

/*
 * 直接写dao层的实现: 
 * 
 * 保存操作:
 */
public class CustomerDaoImpl {
	private QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());//指定, 没有考虑事务:

	//级联保存: 
	public void savaCustomer(Customer customer){//给定用户信息,进行保存: 
		try {
			//调用update方法: 进行保存: 
			String sql ="insert into customers (cid,cname,city) values(?,?,?)";
			qr.update(sql,customer.getCid(),customer.getCname(),customer.getCity());
			
			//判断: 如果客户存在订单信息, 应该把订单的信息也保存: 
			List orders = customer.getOrders();
			if(orders.size()>0){//说明有订单的信息:
				for(Order o: orders){
					String sql1 = "insert into orders (oid,oname,num,price,customer_id) values(?,?,?,?,?)"; 
					Object params[] = {o.getOid(),o.getOname(),o.getNum(),o.getPrice(),customer.getCid()};
					qr.update(sql1, params); //保存订单信息:
				}
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	//立即加载: 查询客户信息 立刻加载订单的信息: 
	public Customer findCustomerById(Integer customerId){//给定用户信息,进行保存: 
		try {
			//调用update方法: 进行保存: 
			String sql ="select * from customers where cid=?";
			Customer customer = qr.query(sql, new BeanHandler(Customer.class),customerId);
			
			if(customer!=null){
				//查订单: 去数据库sql : 
				String sql1 = "select * from orders where customer_id =?";
				List list = qr.query(sql1, new BeanListHandler(Order.class),customerId);
				//查询的订单信息属于某一个客户:
				customer.setOrders(list);
				
			}
			return customer;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null; 
	}
	
}


  

多对多的关系:  


  Teacher  Student 
  Student  Score 


   // Teachars : 
   // Students : 
   (1)创建表:   如何维护表和表之间的关系? 通过映射出来第三张表: 
   (2)创建实体: 维护实体和实体之间的关系: 
   (3)保存和查询操作:  
   
   
   步骤一: 创建表: 以及第三张映射表: 
      
   CREATE TABLE teachers(
     tid INT  PRIMARY KEY, 
     tname   VARCHAR(100), 
     salary  FLOAT(100,2)
   )
   
     CREATE TABLE Students(
     sid INT  PRIMARY KEY, 
     sname   VARCHAR(100), 
     grade  FLOAT(100,2)
   )
   
   CREATE TABLE teachers_Students(
           tid INT  , 
           sid INT,
           PRIMARY KEY(tid,sid)       联合主键
          创建两个外键: 
            约束t_id_fk FOREIGN KEY(tid)参考教师(tid),
            CONSTRAINT s_id_fk外键(sid)参考学生(sid)
           
   )
   
   步骤二:实体bean的设计  
   :: 
   class Teacher {
       
       // teacher普通的属性; 
       //建立了和学生之间的关系: 
     private List students = new ArrayList ();
   }

package com.yidongxueyuan.domain;

import java.util.ArrayList;
import java.util.List;

public class Teacher {
	private int tid; 
	private String tname; 
	private float salary;
	
	// Teacher 有多个学生: 
	private List students = new ArrayList();
	
	public int getTid() {
		return tid;
	}
	public void setTid(int tid) {
		this.tid = tid;
	}
	public String getTname() {
		return tname;
	}
	public void setTname(String tname) {
		this.tname = tname;
	}
	public float getSalary() {
		return salary;
	}
	public void setSalary(float salary) {
		this.salary = salary;
	}
	public Teacher(int tid, String tname, float salary) {
		super();
		this.tid = tid;
		this.tname = tname;
		this.salary = salary;
	}
	public Teacher() {
		super();
		// TODO Auto-generated constructor stub
	}
	public List getStudents() {
		return students;
	}
	public void setStudents(List students) {
		this.students = students;
	} 
	
	
	
	
	
}


   学生:

package com.yidongxueyuan.domain;

import java.util.ArrayList;
import java.util.List;

public class Student {
	private int sid; 
	private String sname; 
	private int grade;
	
	//实体和实体的关系:
	private List teachers = new ArrayList(); 
	
	
	public List getTeachers() {
		return teachers;
	}
	public void setTeachers(List teachers) {
		this.teachers = teachers;
	}
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public Student(int sid, String sname, int grade) {
		super();
		this.sid = sid;
		this.sname = sname;
		this.grade = grade;
	}
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "Student [sid=" + sid + ", sname=" + sname + ", grade=" + grade
				+ "]";
	} 
	
	
	
}


   
 步骤三:保存和查询操作; 
 //保存老师; 老师有关联的学生,保存学生。保存第三张映射表: 
   

package com.yidongxueyuan.domain;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.junit.Test;

import com.yidongxueyuan.utils.C3P0Util;

public class TeacherDaoImpl {
	private QueryRunner qr = new QueryRunner(C3P0Util.getDataSource());//指定, 没有考虑事务:

	//级联保存: 
	public void savaTeacher(Teacher t){
		
		try {
			String sql ="insert into teachers (tid, tname, salary) values(?,?,?)"; 
			//保存了老师: 
			qr.update(sql,t.getTid(),t.getTname(),t.getSalary());
			
			//查询老师是否存在关联的学生: 
			List students = t.getStudents();
			
			if(students.size()>0){
				for(Student stu: students){
					// stu 的id 去数据库表当中进行查询: 
					String sql1 ="select * from students where sid =?"; 
					Student student = qr.query(sql1, new BeanHandler(Student.class),stu.getSid());
					
//					在数据库不存在,插入操作:
					if(student == null){
						String sql2 ="insert into students (sid, sname,grade) values(?,?,?)"; 
						qr.update(sql2,stu.getSid(),stu.getSname(),stu.getGrade());
					}
					//维护第三张表的关系: 
					String sql3 ="insert into teachers_students values(?,?)";
					qr.update(sql3,t.getTid(), stu.getSid());
				}
			}
			
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
		
}


   
   
  
   
   
   
  
   
   
  
  
  
  
  
  

你可能感兴趣的:(java)