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; /* 一對(duì)一 */ 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; /* 一對(duì)多 */ 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(); /* 一對(duì)多 */ public List<Student> findduobiao(); }
一對(duì)一關(guān)系的xml文件配置:
實(shí)現(xiàn)一對(duì)一的關(guān)系查詢,即一條student信息對(duì)應(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"/> <!-- 一對(duì)一的關(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ù)庫列名的對(duì)應(yīng)關(guān)系,association是用來指定從表方的引用實(shí)體屬性的。
注意最后寫的findstudent方法中,是使用到resultMap作為接收結(jié)果值返回,與上文配置的resultMap相對(duì)應(yīng)。
一對(duì)多查詢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接口中的方法需要加注解。
一對(duì)一:
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);
一對(duì)多:
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)容請(qǐng)搜索腳本之家以前的文章或繼續(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ì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03java線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法
下面小編就為大家?guī)硪黄猨ava線程池:獲取運(yùn)行線程數(shù)并控制線程啟動(dòng)速度的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Spring Boot配置Thymeleaf(gradle)的簡(jiǎn)單使用
今天小編就為大家分享一篇關(guān)于Spring Boot配置Thymeleaf(gradle)的簡(jiǎn)單使用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12SpringBoot集成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-12Spring指定bean在哪個(gè)應(yīng)用加載(示例詳解)
本文通過實(shí)例代碼介紹了Spring指定bean在哪個(gè)應(yīng)用加載,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-08-08