摘要:我來看一下查詢結(jié)果我們的實體與映射表中,實體是沒有關(guān)聯(lián)其他的字段的,僅僅是寫出了該實體的自帶的屬性。
Mybatis【多表連接】
我們在學(xué)習(xí)Hibernate的時候,如果表涉及到兩張的話,那么我們是在映射文件中使用
先來回顧一下我們SQL99的語法:
一)內(nèi)連接(等值連接):查詢客戶姓名,訂單編號,訂單價格 --------------------------------------------------- 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; --------------------------------------------------- 注意:內(nèi)連接(等值連接)只能查詢出多張表中,連接字段相同的記錄 二)外連接:按客戶分組,查詢每個客戶的姓名和訂單數(shù) --------------------------------------------------- 左外連接: 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; --------------------------------------------------- 注意:外連接既能查詢出多張表中,連接字段相同的記錄;又能根據(jù)一方,將另一方不符合相同記錄強行查詢出來 三)自連接:求出AA的老板是EE --------------------------------------------------- 內(nèi)自連接: 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; --------------------------------------------------- 注意:自連接是將一張表,通過別名的方式,看作多張表后,再進(jìn)行連接。 這時的連接即可以采用內(nèi)連接,又可以采用外連接
由于我們Mybatis中并沒有像Hibernate這樣全自動化的,因此我們是沒有
需求:
學(xué)生和身份證
設(shè)計表:--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; } }
/** * 學(xué)生(單方) * @author AdminTC */ public class Student { private Integer id; private String name; private Card card;//關(guān)聯(lián)屬性 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層
現(xiàn)在我想根據(jù)學(xué)生的編號查詢學(xué)生的信息和身份證信息!
由于該查詢著重是查詢學(xué)生的信息,于是我們在學(xué)生的映射文件中寫SQL語句
按照需求,我們寫出來的SQL語句是這樣子的。
select * from zhongfucheng.students s,zhongfucheng.cards c where c.cid = s.scid and sid=1;
我來看一下查詢結(jié)果:
我們的實體與映射表中,Student實體是沒有關(guān)聯(lián)其他的字段的,僅僅是寫出了該實體的自帶的屬性。
明顯地,我們Student是不能封裝返回的結(jié)果,因此我們需要將關(guān)聯(lián)屬性進(jìn)行關(guān)聯(lián)起來!
我們關(guān)聯(lián)了以后,Student實體就能夠封裝返回的結(jié)果了
查詢編號為1的學(xué)生信息【包括身份證編號】
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()); }一對多
需求:
一個班級有多個學(xué)生,查詢java學(xué)科有哪些學(xué)生信息
設(shè)計數(shù)據(jù)庫表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; /** * 學(xué)科(單方) * @author AdminTC */ public class Grade { private Integer id; private String name; private ListstudentList = new ArrayList ();//關(guān)聯(lián)屬性 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; /** * 學(xué)生(多方) * @author AdminTC */ public class Student { private Integer id; private String name; private Grade grade;//關(guān)聯(lián)屬性 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()); } }
需求:
學(xué)生和課程
數(shù)據(jù)庫表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 ListstudentList = new ArrayList ();//關(guān)聯(lián)屬性 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; /** * 學(xué)生(多方) * @author AdminTC */ public class Student { private Integer id; private String name; private List映射文件courseList = new ArrayList ();//關(guān)聯(lián)屬性 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 { /** * 查詢哈哈選學(xué)了哪些課程 * @param name 表示學(xué)生的姓名 */ public List總結(jié)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課程有哪些學(xué)生選修 * @param name 表示學(xué)生的課程 */ 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("哈哈選學(xué)了" + courseList.size()+"個課程,分別是:"); for(Course c : courseList){ System.out.print(c.getName()+" "); } System.out.println(" -----------------------------------------------------"); List studentList = dao.findAllByCourseName("android"); System.out.println("選修了android課程的學(xué)生有"+studentList.size()+"個,分別是:"); for(Student s : studentList){ System.out.print(s.getName()+" "); } } }
對于Mybatis的多表連接就非常簡單了,由于SQL語句全是由我們自己寫,如果我們返回的數(shù)據(jù)類型在當(dāng)前的實體中是不夠封裝的話,那么我們只要再關(guān)聯(lián)對應(yīng)的映射屬性就行了!
如果文章有錯的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號:Java3y
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68777.html
摘要:場合常見一些明細(xì)記錄的展示,比如用戶購買商品明細(xì),將關(guān)聯(lián)查詢信息全部展示在頁面時,此時可直接使用將每一條記錄映射到中,在前端頁面遍歷中是即可。作用將關(guān)聯(lián)查詢信息映射到一個對象中。 相關(guān)閱讀: 1、通過項目逐步深入了解Mybatis 2、 通過項目逐步深入了解Mybatis 本項目所有代碼及文檔都托管在 Github地址:https://github.com/zhisheng17/myb...
摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時在使用多表關(guān)聯(lián)查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時在使用多表關(guān)聯(lián)查詢的時候建議使用它們。為什么?因為這種方式關(guān)聯(lián)查詢出來...
摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時在使用多表關(guān)聯(lián)查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時在使用多表關(guān)聯(lián)查詢的時候建議使用它們。為什么?因為這種方式關(guān)聯(lián)查詢出來...
摘要:前言是特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時在使用多表關(guān)聯(lián)查詢的時候建議使用它們。需求分析使用一條查詢語句就能把列表的數(shù)據(jù)全部展現(xiàn)出來,列表包含一對一,一對多,以及多對多的關(guān)系。不能破壞自有的表頭排序功能,以及中的存值。相關(guān)資料中多表關(guān)聯(lián)查詢 前言 hasOne、hasMany是Yii2特有的用于多表關(guān)聯(lián)查詢的函數(shù),平時在使用多表關(guān)聯(lián)查詢的時候建議使用它們。為什么?因為這種方式關(guān)聯(lián)查詢出來...
閱讀 3699·2021-08-10 09:42
閱讀 592·2019-08-30 15:55
閱讀 893·2019-08-30 15:54
閱讀 3116·2019-08-30 13:45
閱讀 557·2019-08-29 16:23
閱讀 1995·2019-08-29 16:23
閱讀 987·2019-08-29 15:18
閱讀 2267·2019-08-29 12:57