1. 程式人生 > >hibernate09--連接查詢

hibernate09--連接查詢

create ges ret nat before 賦值 測試數據 一個數 left join

創建實體類

技術分享
package cn.bdqn.bean;

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

/**
 * @author 小豆腐
 *
 *員工的實體類
 */
public class Emp {

    private Integer empNo; 
    private String empName;
    private String job;
    private Double salary;
    private Date hireDate;
    
    //多個員工屬於一個部門
    private  Dept dept;

    public Integer getEmpNo() {
        return empNo;
    }

    public void setEmpNo(Integer empNo) {
        this.empNo = empNo;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getJob() {
        return job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Double getSalary() {
        return salary;
    }

    public void setSalary(Double salary) {
        this.salary = salary;
    }

    public Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public Emp(Integer empNo, String empName, String job, Double salary,
            Date hireDate, Dept dept) {
        super();
        this.empNo = empNo;
        this.empName = empName;
        this.job = job;
        this.salary = salary;
        this.hireDate = hireDate;
        this.dept = dept;
    }

    public Emp() {
        super();
    }

    @Override
    public String toString() {
        return "Emp [empNo=" + empNo + ", empName=" + empName + ", job=" + job
                + ", salary=" + salary + ", hireDate=" + hireDate + ", dept="
                + dept + "]";
    }
}
技術分享

技術分享
package cn.bdqn.bean;

import java.util.HashSet;
import java.util.Set;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * 
 *  部門的實體類
 */
public class Dept {
    
    private  Integer  deptNo;
    private  String  deptName;
    private  String  location;  
    //一個部門對應多個員工
    private  Set<Emp> emps=new HashSet<>();
    public Integer getDeptNo() {
        return deptNo;
    }
    public void setDeptNo(Integer deptNo) {
        this.deptNo = deptNo;
    }
    public String getDeptName() {
        return deptName;
    }
    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }
    public Set<Emp> getEmps() {
        return emps;
    }
    public void setEmps(Set<Emp> emps) {
        this.emps = emps;
    }
    public Dept(Integer deptNo, String deptName, String location, Set<Emp> emps) {
        super();
        this.deptNo = deptNo;
        this.deptName = deptName;
        this.location = location;
        this.emps = emps;
    }
    public Dept() {
        super();
    }
    @Override
    public String toString() {
        return "Dept [deptNo=" + deptNo + ", deptName=" + deptName
                + ", location=" + location + ", emps=" + emps.size() + "]";
    }
    
    
    
    
}
技術分享

創建對應的數據庫表

技術分享

技術分享

創建對應的映射文件

技術分享
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.bdqn.bean">
    <class name="Dept">
       <id name="deptNo"> 
          <generator class="assigned"/><!-- 手動給主鍵賦值 -->
       </id>  
       <property name="deptName" column="dName"/>
       <property name="location" column="loc"/>
       <!-- 設置一對多  
       name:本類中的關聯屬性名  集合的名稱
       column: 就是數據庫表中的外鍵
       order-by="id desc" 按照 街道的id 進行 降序排列
       inverse:是由誰來維護表與表之間的關系! 默認是false!(維護)    true(不維護)
       -->
       <set name="emps" cascade="all" inverse="true">
        <key column="DEPTNO"/>
         <one-to-many class="Emp"/>
       </set>
  </class>
</hibernate-mapping>
技術分享

技術分享
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.bdqn.bean">
  <class name="Emp">
       <id name="empNo"> 
          <generator class="assigned"/><!-- 手動給主鍵賦值 -->
       </id>  
       <property name="empName"/>
       <property name="job"/>
       <property name="salary"/>
       <property name="hireDate"/>
       <!-- 配置多對一關聯
       name:對應的是  本類中 關聯關系的屬性名
       column:對應數據庫中 兩個表的  外鍵!
       class:關聯的實體類
       -->
       <many-to-one  name="dept" column="DEPTNO" class="Dept"/> 
  </class>
</hibernate-mapping>
技術分享

在hibernate.cfg.xml文件中 管理兩個映射文件之後,創建測試類代碼

技術分享
public class EmpTest {
    Session session =null;
    Transaction transaction=null;
    
    @Before
    public  void  before(){
         session = HibernateSessionUtil.getCurrentSession();
         transaction= session.beginTransaction();
    }
    
    /**
     * 先給兩個表中 增加測試數據
     */
    @Test
    public  void  testAdd(){
        /**
         * 因為我們設置了級聯操作 cascade=all
         * 那麽我們就可以在保存部門信息的時候保存員工
         */
        Dept dept=new Dept();
        dept.setDeptNo(2);
        dept.setDeptName("市場部");
        dept.setLocation("2樓");
        //創建員工
        Emp emp1=new Emp(5, "員工5", "程序猿5", 5000.0,dept);
        Emp emp2=new Emp(6, "員工6", "程序猿6", 545000.0,dept);
        Emp emp3=new Emp(7, "員工7", "程序猿7", 2000.0,dept);
        Emp emp4=new Emp(8, "員工8", "程序猿8", 98000.0,dept);
        Set<Emp> emps=new HashSet<>();
        emps.add(emp1);
        emps.add(emp2);
        emps.add(emp3);
        emps.add(emp4);
        dept.setEmps(emps);  //把所有的員工放入了集合中
        session.save(dept);
        transaction.commit();
    }
    
    
    /**
     *  所有的迫切連接返回的都是一個對象!     有fetch===》迫切連接
     *  所有的非迫切連接返回的都是一個數組!
     *  
     *  
     *  01.使用內連接查詢  兩個表的所有數據
     *  sql語句
     *  select * from emp inner join dept 
          on dept.deptno=emp.deptno
        
        hql語句
        from Emp e inner join e.dept(Emp類中的關聯屬性名)
     */
    @Test
    public  void  test01(){
        String hql="from Emp e inner join e.dept";
         List<Object[]> list = session.createQuery(hql).list();
         for (Object[] objects : list) {
            System.out.println(objects[0]);  //Emp對象
            System.out.println(objects[1]); //Dept對象
        }
    }
    
    /**
     * 02.迫切內連接   返回的就是一個對象
     */
    @Test
    public  void  test02(){
        String hql="from Emp e inner join fetch e.dept";
         List<Emp> list = session.createQuery(hql).list();
         for (Emp emp : list) {
            System.out.println(emp);  //Emp對象
        }
    }
    /**
     * 03.隱式內連接   返回的就是一個對象
     * e.dept.deptNo  通過這個屬性 進行關聯連接
     */
    @Test
    public  void  test03(){
        String hql="from Emp e  where e.dept.deptNo=:dNo";
        List<Emp> list = session.createQuery(hql).setParameter("dNo", 2).list();
        for (Emp emp : list) {
            System.out.println(emp);  //Emp對象
        }
    }
    /**
     * 04.隱式內連接 投影 查詢        查詢部門編號為2的所有員工的姓名和薪水
     * e.dept.deptNo  通過這個屬性 進行關聯連接
     */
    @Test
    public  void  test04(){
        String hql="select empName,salary from Emp e where e.dept.deptNo=:dNo ";
        List<Object[]> list = session.createQuery(hql).setParameter("dNo", 2).list();
        for (Object[] objects : list) {
            System.out.print(objects[0]+"\t");  //姓名
            System.out.println(objects[1]);  //薪水
        }
    }
    /**
     * 05.使用左外連接   查詢員工和部門的信息
     *  以左表為準,右表中沒有對應的數據,返回null!
     */
    @Test
    public  void  test05(){
        String  hql="from  Emp e left join e.dept";
        List <Object[]>list = session.createQuery(hql).list();
        for (Object[] objects : list) {
            System.out.print(objects[0]+"\t"); //Emp對象
            System.out.println(objects[1]); //Dept對象
        }
    }
    /**
     * 06.使用迫切左外連接   查詢員工和部門的信息
     *  以左表為準,右表中沒有對應的數據,對象的屬性null!
     *  Emp類中的dept屬性為null!
     */
    @Test
    public  void  test06(){
        String  hql="from  Emp e left join fetch e.dept";
        List <Emp>list = session.createQuery(hql).list();
        for (Emp emp : list) {
            System.out.println(emp); //Emp對象
        }
    }
    /**
     * 07.使用右外連接   查詢員工和部門的信息
     *  以右表為準,左表中沒有對應的數據,返回null!
     */
    @Test
    public  void  test07(){
        String  hql="from  Emp e right join e.dept";
        List <Object[]>list = session.createQuery(hql).list();
        for (Object[] objects : list) {
            System.out.print(objects[0]+"\t"); //Emp對象
            System.out.println(objects[1]); //Dept對象
            System.out.println("***********************************");
        }
    }
    /**
     * 08.使用迫切右外連接   查詢員工和部門的信息
     *  對象就是null!   雖然可以寫  迫切右外連接  但是沒有實際的意義!
     *  @Test
      public  void  test08(){
        String  hql="from  Emp e right join fetch e.dept";
        List <Emp>list = session.createQuery(hql).list();
        for (Emp emp : list) {
            System.out.println(emp.getEmpName()); //Emp對象   空指針異常
        }
    }
     */
    
    
    
}

hibernate09--連接查詢