国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Mybatis【一對多、多對一、多對多】知識要點

JerryWangSAP / 2034人閱讀

摘要:我來看一下查詢結果我們的實體與映射表中,實體是沒有關聯其他的字段的,僅僅是寫出了該實體的自帶的屬性。

Mybatis【多表連接】

我們在學習Hibernate的時候,如果表涉及到兩張的話,那么我們是在映射文件中使用..等標簽將其的映射屬性關聯起來的...那么在我們Mybatis中又怎么做呢???

先來回顧一下我們SQL99的語法:

一)內連接(等值連接):查詢客戶姓名,訂單編號,訂單價格
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c inner join orders o
    where c.id = o.customers_id;
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c join orders o
    where c.id = o.customers_id; 
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c,orders o
    where c.id = o.customers_id;
    ---------------------------------------------------
    select c.name,o.isbn,o.price
    from customers c join orders o
    on c.id = o.customers_id;
    ---------------------------------------------------
    注意:內連接(等值連接)只能查詢出多張表中,連接字段相同的記錄




二)外連接:按客戶分組,查詢每個客戶的姓名和訂單數
    ---------------------------------------------------
    左外連接:
    select c.name,count(o.isbn)
    from  customers c left outer join orders o
    on c.id = o.customers_id
    group by c.name; 
    ---------------------------------------------------
    右外連接:
    select c.name,count(o.isbn)
    from  orders o right outer join customers c   
    on c.id = o.customers_id
    group by c.name; 
    ---------------------------------------------------
    注意:外連接既能查詢出多張表中,連接字段相同的記錄;又能根據一方,將另一方不符合相同記錄強行查詢出來




三)自連接:求出AA的老板是EE
    ---------------------------------------------------
    內自連接:
    select users.ename,boss.ename
    from emps users inner join emps boss 
    on users.mgr = boss.empno;
    ---------------------------------------------------
    外自連接:
    select users.ename,boss.ename
    from emps users left outer join emps boss 
    on users.mgr = boss.empno;
    ---------------------------------------------------
    注意:自連接是將一張表,通過別名的方式,看作多張表后,再進行連接。
      這時的連接即可以采用內連接,又可以采用外連接

由于我們Mybatis中并沒有像Hibernate這樣全自動化的,因此我們是沒有..等標簽的,我們還是使用手寫SQL語句來使我們的關聯屬性連接起來...

一對一

需求:

學生和身份證

設計表:

--mysql

create table cards(
    cid int(5) primary key,
    cnum varchar(10)
);

create table students(
    sid int(5) primary key,
    sname varchar(10),
    scid int(5),
    constraint scid_fk foreign key(scid) references cards(cid)
);

insert into cards(cid,cnum) values(1,"111");
insert into students(sid,sname,scid) values(1,"哈哈",1);

select * from cards;
select * from students;

實體
/**
 * 身份證(單方)
 * @author AdminTC
 */
public class Card {
    private Integer id;
    private String num;
    public Card(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
}
/**
 * 學生(單方)
 * @author AdminTC
 */
public class Student {
    private Integer id;
    private String name;
    private Card card;//關聯屬性
    public Student(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Card getCard() {
        return card;
    }
    public void setCard(Card card) {
        this.card = card;
    }
}
映射文件

由于我們有兩個實體,因此我們會有兩個映射文件

Student映射文件





    
    
        
        
    

Card映射文件






    
    
        
        
        
    

DAO層

現在我想根據學生的編號查詢學生的信息和身份證信息

由于該查詢著重是查詢學生的信息,于是我們在學生的映射文件中寫SQL語句

按照需求,我們寫出來的SQL語句是這樣子的。


select * from zhongfucheng.students s,zhongfucheng.cards c where c.cid = s.scid and sid=1;

我來看一下查詢結果:

我們的實體與映射表中,Student實體是沒有關聯其他的字段的,僅僅是寫出了該實體的自帶的屬性

    
        
        
    

明顯地,我們Student是不能封裝返回的結果,因此我們需要將關聯屬性進行關聯起來!

    
        
        

        
        
    

我們關聯了以后,Student實體就能夠封裝返回的結果了

    
        
        

        
        
    

    

查詢編號為1的學生信息【包括身份證編號】


    public Student findById(int id) throws Exception {
        //得到連接對象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        try{

            return sqlSession.selectOne("studentNamespace.findById", id);

          /*  sqlSession.commit();*/
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }

    public static void main(String[] args) throws Exception {
        StudentDao studentDao = new StudentDao();
        Student student = studentDao.findById(1);

        System.out.println(student.getId() + "----" + student.getName() + "----" + student.getCard().getNum());

    }

一對多

需求:

一個班級有多個學生,查詢java學科有哪些學生信息

設計數據庫表

create table grades(
  gid int(5) primary key,
  gname varchar(10)
);

create table students(
  sid int(5) primary key,
  sname varchar(10),
  sgid int(5),
  constraint sgid_fk foreign key(sgid) references grades(gid)
);

insert into grades(gid,gname) values(1,"java");

insert into students(sid,sname,sgid) values(1,"哈哈",1);
insert into students(sid,sname,sgid) values(2,"呵呵",1);


select * from grades;
select * from students;

實體
package zhongfucheng2;

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

/**
 * 學科(單方)
 * @author AdminTC
 */
public class Grade {
    private Integer id;
    private String name;
    private List studentList = new ArrayList();//關聯屬性
    public Grade(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List getStudentList() {
        return studentList;
    }
    public void setStudentList(List studentList) {
        this.studentList = studentList;
    }
}


package zhongfucheng2;

/**
 * 學生(多方)
 * @author AdminTC
 */
public class Student {
    private Integer id;
    private String name;
    private Grade grade;//關聯屬性
    public Student(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Grade getGrade() {
        return grade;
    }
    public void setGrade(Grade grade) {
        this.grade = grade;
    }
}
映射文件SQL語句



    
    
        
        
    


    

    
    









    
    
        
        
    


DAO
public List findByGrade(String  grade) throws Exception {
        //得到連接對象
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        try{

            return sqlSession.selectList("studentNamespace.findByGrade", grade);
          /*  sqlSession.commit();*/
        }catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }

    public static void main(String[] args) throws Exception {
        StudentDao studentDao = new StudentDao();
        List student = studentDao.findByGrade("java");

        for (Student student1 : student) {
            System.out.println(student1.getName());
        }
    }

多對多

需求:

學生和課程

數據庫表
create table students(
    sid int(5) primary key,
    sname varchar(10)
);

create table courses(
    cid int(5) primary key,
    cname varchar(10)
);

create table middles(
    msid int(5),
    mcid int(5),
    primary key(msid,mcid)
);

insert into students(sid,sname) values(1,"哈哈");
insert into students(sid,sname) values(2,"呵呵");

insert into courses(cid,cname) values(1,"java");
insert into courses(cid,cname) values(2,"android");

insert into middles(msid,mcid) values(1,1);
insert into middles(msid,mcid) values(1,2);
insert into middles(msid,mcid) values(2,1);
insert into middles(msid,mcid) values(2,2);

select * from students;
select * from courses;
select * from middles;

實體
package cn.itcast.javaee.mybatis.many2many;

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

/**
 * 課程(多方)
 * @author AdminTC
 */
public class Course {
    private Integer id;
    private String name;
    private List studentList = new ArrayList();//關聯屬性
    public Course(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List getStudentList() {
        return studentList;
    }
    public void setStudentList(List studentList) {
        this.studentList = studentList;
    }
}


package cn.itcast.javaee.mybatis.many2many;

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

/**
 * 學生(多方)
 * @author AdminTC
 */
public class Student {
    private Integer id;
    private String name;
    private List courseList = new ArrayList();//關聯屬性
    public Student(){}
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List getCourseList() {
        return courseList;
    }
    public void setCourseList(List courseList) {
        this.courseList = courseList;
    }
}
映射文件




    
    
        
        
        
    
    
    
    
    
    







    
    
        
        
        

    
    
    



DAO

package cn.itcast.javaee.mybatis.many2many;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import cn.itcast.javaee.mybatis.util.MybatisUtil;

/**
 * 持久層
 * @author AdminTC
 */
public class StudentCourseDao {
    /**
     * 查詢哈哈選學了哪些課程
     * @param name 表示學生的姓名
     */
    public List findAllByName(String name) throws Exception{
        SqlSession sqlSession = null;
        try{
            sqlSession = MybatisUtil.getSqlSession();
            return sqlSession.selectList("courseNamespace.findAllByName",name);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }
    /**
     * 查詢java課程有哪些學生選修
     * @param name 表示學生的課程
     */
    public List findAllByCourseName(String name) throws Exception{
        SqlSession sqlSession = null;
        try{
            sqlSession = MybatisUtil.getSqlSession();
            return sqlSession.selectList("studentNamespace.findAllByCourseName",name);
        }catch(Exception e){
            e.printStackTrace();
            throw e;
        }finally{
            MybatisUtil.closeSqlSession();
        }
    }
    
    
    
    
    
    
    public static void main(String[] args) throws Exception{
        StudentCourseDao dao = new StudentCourseDao();
        List courseList = dao.findAllByName("哈哈");
        System.out.print("哈哈選學了" + courseList.size()+"個課程,分別是:");
        for(Course c : courseList){
            System.out.print(c.getName()+" ");
        }
        System.out.println("
-----------------------------------------------------");
        List studentList = dao.findAllByCourseName("android");
        System.out.println("選修了android課程的學生有"+studentList.size()+"個,分別是:");
        for(Student s : studentList){
            System.out.print(s.getName()+" ");
        }
    }
}

總結

對于Mybatis的多表連接就非常簡單了,由于SQL語句全是由我們自己寫,如果我們返回的數據類型在當前的實體中是不夠封裝的話,那么我們只要再關聯對應的映射屬性就行了

如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關注微信公眾號:Java3y

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68777.html

相關文章

  • 通過項目逐步深入了解Mybatis<三>

    摘要:場合常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用將每一條記錄映射到中,在前端頁面遍歷中是即可。作用將關聯查詢信息映射到一個對象中。 相關閱讀: 1、通過項目逐步深入了解Mybatis 2、 通過項目逐步深入了解Mybatis 本項目所有代碼及文檔都托管在 Github地址:https://github.com/zhisheng17/myb...

    khlbat 評論0 收藏0
  • Yii2中hasOne、hasMany以及關聯查詢的用法

    摘要:前言是特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。為什么?因為這種方式關聯查詢出來...

    lmxdawn 評論0 收藏0
  • Yii2中hasOne、hasMany以及關聯查詢的用法

    摘要:前言是特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。為什么?因為這種方式關聯查詢出來...

    BDEEFE 評論0 收藏0
  • Yii2中hasOne、hasMany以及關聯查詢的用法

    摘要:前言是特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數據全部展現出來,列表包含一對一,一對多,以及多對多的關系。不能破壞自有的表頭排序功能,以及中的存值。相關資料中多表關聯查詢 前言 hasOne、hasMany是Yii2特有的用于多表關聯查詢的函數,平時在使用多表關聯查詢的時候建議使用它們。為什么?因為這種方式關聯查詢出來...

    qc1iu 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<