对应的学习天数是第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
}
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
}
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();
}
}
}