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

班級表Class表 :

現(xiàn)在去寫Dao層和實體類
Student實體類:
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實體類:
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();
}一對一關系的xml文件配置:
實現(xiàn)一對一的關系查詢,即一條student信息對應一條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"/>
<!-- 一對一的關系映射,配置封裝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ù)庫列名的對應關系,association是用來指定從表方的引用實體屬性的。
注意最后寫的findstudent方法中,是使用到resultMap作為接收結果值返回,與上文配置的resultMap相對應。
一對多查詢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語句查詢后的結果會有重復項,但是不用擔心,應為mybatis會自動識別到重復的內(nèi)容,只保留一個。
二、使用注解的方式
還是同樣的我們需要再建實體類,跟上面的一樣;其次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);到此這篇關于MyBatis如何實現(xiàn)多表聯(lián)查的文章就介紹到這了,更多相關MyBatis多表聯(lián)查內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MyBatis-Plus實現(xiàn)多表聯(lián)查的方法實戰(zhàn)
- Mybatis-Plus多表關聯(lián)查詢的使用案例解析
- MyBatis多表關聯(lián)查詢的實現(xiàn)示例
- mybatis-plus多表聯(lián)查join的實現(xiàn)
- MyBatis-Plus多表聯(lián)查(動態(tài)查詢)的項目實踐
- MyBatis-Plus多表聯(lián)查的實現(xiàn)方法(動態(tài)查詢和靜態(tài)查詢)
- Spring boot2基于Mybatis實現(xiàn)多表關聯(lián)查詢
- Mybatis-Plus 多表聯(lián)查分頁的實現(xiàn)代碼
- MyBatis-Flex實現(xiàn)多表聯(lián)查(自動映射)
相關文章
Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊問題
這篇文章主要介紹了Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊,簡單介紹了lock鎖及鎖的底層知識,結合案例給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04
MyBatis深入解讀動態(tài)SQL的實現(xiàn)
動態(tài) SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態(tài) SQL,可以徹底擺脫這種痛苦2022-04-04

