MyBatis實(shí)現(xiàn)多表聯(lián)查的詳細(xì)代碼
一、通過映射配置文件實(shí)現(xiàn)多表聯(lián)查
首先,使用Mysql數(shù)據(jù)庫,創(chuàng)建兩個(gè)表,分別為學(xué)生表Student表和班級(jí)表Class表,在Student表中添加列classid參照主表的列id的外鍵約束。
學(xué)生表Student表:

班級(jí)表Class表 :

現(xiàn)在去寫Dao層和實(shí)體類
Student實(shí)體類:
package com.ape.bean;
import java.util.Date;
public class Student {
private Integer sid;
private String sname;
private Date birthday;
private String ssex;
private int classid;
/*
一對一
*/
private Classs banji;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(Integer sid, String sname, Date birthday, String ssex, int classid, Classs banji) {
this.sid = sid;
this.sname = sname;
this.birthday = birthday;
this.ssex = ssex;
this.classid = classid;
this.banji = banji;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSsex() {
return ssex;
}
public void setSsex(String ssex) {
this.ssex = ssex;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public Classs getBanji() {
return banji;
}
public void setBanji(Classs banji) {
this.banji = banji;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", birthday=" + birthday +
", ssex='" + ssex + '\'' +
", classid=" + classid +
", banji=" + banji +
'}';
}
}Class實(shí)體類:
package com.ape.bean;
import java.util.List;
public class Classs {
private int classid;
private String classname;
/*
一對多
*/
private List<Student> xuesheng;
public Classs() {
}
public Classs(int classid, String classname, List<Student> xuesheng) {
this.classid = classid;
this.classname = classname;
this.xuesheng = xuesheng;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
public List<Student> getXuesheng() {
return xuesheng;
}
public void setXuesheng(List<Student> xuesheng) {
this.xuesheng = xuesheng;
}
@Override
public String toString() {
return "Classs{" +
"classid=" + classid +
", classname='" + classname + '\'' +
", xuesheng=" + xuesheng +
'}';
}
}Mapper接口:
public interface ClassMapper {
public List<Class> findClass();
}public interface StudentMapper {
public List<Student> findStudent();
/*
一對多
*/
public List<Student> findduobiao();
}一對一關(guān)系的xml文件配置:
實(shí)現(xiàn)一對一的關(guān)系查詢,即一條student信息對應(yīng)一條class信息
<resultMap id="stu_class_Map" type="Student">
<result column="sid" property="sid" />
<result column="sname" property="sname"/>
<result column="birthday" property="birthday"/>
<result column="ssex" property="ssex"/>
<result column="classid" property="classid"/>
<!-- 一對一的關(guān)系映射,配置封裝student的內(nèi)容 -->
<association property="banji">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
</association>
</resultMap>
<select id="findduobiao" resultMap="stu_class_Map">
select * from student inner join class on student.classid = class.classid;
</select>這里主要配置的就是resultMap了,配置javabean類中屬性與數(shù)據(jù)庫列名的對應(yīng)關(guān)系,association是用來指定從表方的引用實(shí)體屬性的。
注意最后寫的findstudent方法中,是使用到resultMap作為接收結(jié)果值返回,與上文配置的resultMap相對應(yīng)。
一對多查詢xml文件配置:
<resultMap id="class_stu_Map" type="Classs">
<result column="classid" property="classid"/>
<result column="classname" property="classname"/>
<!-- Class中的集合映射 -->
<collection property="xuesheng">
<result column="sid" property="sid" />
<result column="sname" property="sname"/>
<result column="birthday" property="birthday"/>
<result column="ssex" property="ssex"/>
<result column="classid" property="classid"/>
</collection>
</resultMap>
<select id="yiduiduo" resultMap="class_stu_Map">
select * from class left join student on class.classid = student.classid order by class.classid;
</select>雖然知道使用這條sql語句查詢后的結(jié)果會(huì)有重復(fù)項(xiàng),但是不用擔(dān)心,應(yīng)為mybatis會(huì)自動(dòng)識(shí)別到重復(fù)的內(nèi)容,只保留一個(gè)。
二、使用注解的方式
還是同樣的我們需要再建實(shí)體類,跟上面的一樣;其次Mapper接口中的方法需要加注解。
一對一:
public interface AccountDao {
@Select("select * from account")
@Results(id="accountMap",value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
@Result(property = "user",column = "uid",one =
@One(select="mediacomm.dao.UserDao.findUserById",fetchType= FetchType.DEFAULT))
})
List<Account> findAccountWithUser();public interface UserDao {
@Select("select * from user where id=#{id}")
User findUserById(int id);一對多:
public interface UserDao {
@Select(value = "select * from user")
@Results(id = "userMap",value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "password",property = "password"),
@Result(column = "address",property = "address"),
@Result(property = "accounts",column = "id",
many = @Many(select = "mediacomm.dao.AccountDao.findAccountByUid",fetchType = FetchType.DEFAULT))
})
List<User> findAllUser();
public interface AccountDao {
@Select("select * from account where uid=#{uid}")
List<Account> findAccountByUid(int uid);到此這篇關(guān)于MyBatis如何實(shí)現(xiàn)多表聯(lián)查的文章就介紹到這了,更多相關(guān)MyBatis多表聯(lián)查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis-Plus實(shí)現(xiàn)多表聯(lián)查的方法實(shí)戰(zhàn)
- Mybatis-Plus多表關(guān)聯(lián)查詢的使用案例解析
- MyBatis多表關(guān)聯(lián)查詢的實(shí)現(xiàn)示例
- mybatis-plus多表聯(lián)查join的實(shí)現(xiàn)
- MyBatis-Plus多表聯(lián)查(動(dòng)態(tài)查詢)的項(xiàng)目實(shí)踐
- MyBatis-Plus多表聯(lián)查的實(shí)現(xiàn)方法(動(dòng)態(tài)查詢和靜態(tài)查詢)
- Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢
- Mybatis-Plus 多表聯(lián)查分頁的實(shí)現(xiàn)代碼
- MyBatis-Flex實(shí)現(xiàn)多表聯(lián)查(自動(dòng)映射)
相關(guān)文章
詳解使用spring validation完成數(shù)據(jù)后端校驗(yàn)
這篇文章主要介紹了詳解使用spring validation完成數(shù)據(jù)后端校驗(yàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
java線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法
下面小編就為大家?guī)硪黄猨ava線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
Spring Boot配置Thymeleaf(gradle)的簡單使用
今天小編就為大家分享一篇關(guān)于Spring Boot配置Thymeleaf(gradle)的簡單使用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的示例代碼
Mybatis-Plus是一個(gè)優(yōu)秀的Mybatis增強(qiáng)工具,目前更新到3.1.1,本文通過示例代碼給大家介紹SpringBoot集成Mybatis-plus并實(shí)現(xiàn)自動(dòng)生成相關(guān)文件的問題,感興趣的朋友跟隨小編一起看看吧2021-12-12
Spring指定bean在哪個(gè)應(yīng)用加載(示例詳解)
本文通過實(shí)例代碼介紹了Spring指定bean在哪個(gè)應(yīng)用加載,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-08-08

