Mybatis實(shí)現(xiàn)關(guān)聯(lián)關(guān)系映射的方法示例
類和類有關(guān)聯(lián),將查詢的結(jié)果注入到對象和對象的關(guān)聯(lián)關(guān)系中
Mybatis處理的關(guān)聯(lián)關(guān)系 包括一對一關(guān)聯(lián) 和 一對多關(guān)聯(lián) ,例如學(xué)生關(guān)聯(lián)班級是一對一 ;班級關(guān)聯(lián)學(xué)生是一對多。
Mybatis實(shí)現(xiàn)關(guān)聯(lián)關(guān)系映射,有兩種方式:多表連接
和 子查詢
數(shù)據(jù)庫表結(jié)構(gòu)
tb_project
tb_cmpany
一、實(shí)現(xiàn)Project關(guān)聯(lián)Company一對一關(guān)聯(lián)
Company.java
package com.hyxy.po; import java.util.List; public class Company { private int cId; private String cName; public int getcId() { return cId; } public void setcId(int cId) { this.cId = cId; } public String getcName() { return cName; } public void setcName(String cName) { this.cName = cName; } }
Project.java
Project中聲明Company類型的屬性
package com.hyxy.po; public class Project { private int pId; private String projectName; private int cId; private int empId; private int amt; private Company company; public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } public int getpId() { return pId; } public void setpId(int pId) { this.pId = pId; } public String getProjectName() { return projectName; } public void setProjectName(String projectName) { this.projectName = projectName; } public int getcId() { return cId; } public void setcId(int cId) { this.cId = cId; } public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } public int getAmt() { return amt; } public void setAmt(int amt) { this.amt = amt; } }
ProjectDao.java
package com.hyxy.dao; import com.hyxy.po.Project; import java.util.List; public interface ProjectDao { public List<Project> select(); }
ProjectMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--所有映射文件中的sql語句,為了區(qū)分多個映射文件,使用命名空間+id進(jìn)行區(qū)分。namespace命名空間--> <mapper namespace="com.hyxy.dao.CompanyDao"> <!--自定義結(jié)果映射--> <resultMap id="resultMap" type="com.hyxy.po.Company"> <!--如果數(shù)據(jù)庫中有主鍵,寫id映射--> <id column="companyid" property="cId"></id> <result column="companyname" property="cName"></result> <!--一對多關(guān)系映射 (全類名.resultMap)--> <collection property="list" resultMap="com.hyxy.dao.ProjectDao.resultMap"> </collection> </resultMap> <!-- 查詢所有的項(xiàng)目信息,多表連接查詢關(guān)聯(lián)的客戶信息, 把項(xiàng)目信息注入到Project對象中,把客戶信息注入到Company對象中 Company對象注入到Project對象的company屬性中 --> <select id="select" resultMap="resultMap"> select * from tb_company c inner join tb_project p on p.companyid=c.companyid </select> </mapper>
Test1.java
package com.hyxy; import com.hyxy.dao.ProjectDao; import com.hyxy.po.Project; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.Reader; import java.util.List; //接口綁定,動態(tài)查詢,關(guān)聯(lián)關(guān)系查詢 public class Test1 { public static void main(String[] args) { Reader reader=null; try{ reader= Resources.getResourceAsReader("configuration.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession=sqlSessionFactory.openSession(); //一對一 ProjectDao projectDao=sqlSession.getMapper(ProjectDao.class); List<Project> list =projectDao.select(); for(Project p:list){ System.out.println(p.getcId()+","+p.getProjectName()+","+p.getCompany().getcName()); } }catch (IOException e){ e.printStackTrace(); } } }
運(yùn)行結(jié)果:
或者
ProjectMapper.xml
<!-- 使用已經(jīng)定義好的一個 resultMap --> <association property="company" resultMap="com.hyxy.dao.CompanyDao.resultMap"> </association>
CompanyMapper.xml
<mapper namespace="com.hyxy.dao.CompanyDao"> <resultMap id="resultMap" type="com.hyxy.po.Company"> <id column="companyid" property="cId"></id> <result column="companyname" property="cname"></result> </resultMap> </mapper>
二、實(shí)現(xiàn)Company關(guān)聯(lián)Project一對多關(guān)系
Company類中聲明 List<Project> 屬性
Company.java
package com.hyxy.po; import java.util.List; public class Company { private int cId; private String cName; private List<Project> list;//實(shí)現(xiàn)Company關(guān)聯(lián)Project 一對多 public List<Project> getList() { return list; } public void setList(List<Project> list) { this.list = list; } public int getcId() { return cId; } public void setcId(int cId) { this.cId = cId; } public String getcName() { return cName; } public void setcName(String cName) { this.cName = cName; } }
CompanyDao.java
package com.hyxy.dao; import com.hyxy.po.Company; import java.util.List; public interface CompanyDao { public List<Company> select(); }
CompanyMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!--所有映射文件中的sql語句,為了區(qū)分多個映射文件,使用命名空間+id進(jìn)行區(qū)分。namespace命名空間--> <mapper namespace="com.hyxy.dao.CompanyDao"> <!--自定義結(jié)果映射--> <resultMap id="resultMap" type="com.hyxy.po.Company"> <!--如果數(shù)據(jù)庫中有主鍵,寫id映射--> <id column="companyid" property="cId"></id> <result column="companyname" property="cName"></result> <!--一對多關(guān)系映射 (全類名.resultMap)--> <collection property="list" resultMap="com.hyxy.dao.ProjectDao.resultMap"> </collection> </resultMap> <select id="select" resultMap="resultMap"> select * from tb_company c inner join tb_project p on p.companyid=c.companyid </select> </mapper>
Test2.java
package com.hyxy; import com.hyxy.dao.CompanyDao; import com.hyxy.po.Company; import com.hyxy.po.Project; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.Reader; import java.util.List; //接口綁定,動態(tài)查詢,關(guān)聯(lián)關(guān)系查詢 public class Test2 { public static void main(String[] args) { Reader reader=null; try{ reader= Resources.getResourceAsReader("configuration.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession=sqlSessionFactory.openSession(); //一對多 CompanyDao companyDao=sqlSession.getMapper(CompanyDao.class); List<Company> list= companyDao.select(); for(Company c:list){ System.out.println(c.getcName()); for(Project p:c.getList()){ System.out.println(p.getProjectName()); } System.out.println("--------------------"); } }catch (IOException e){ e.printStackTrace(); } } }
運(yùn)行結(jié)果:
一對一關(guān)聯(lián)使用<association>,一對多關(guān)聯(lián)使用<collection>
三、Mybatis子查詢方式實(shí)現(xiàn)關(guān)聯(lián)關(guān)系查詢
ProjectMapper.xml
<association property="company" javaType="com.hyxy.po.Company" column="companyid" select="com.hyxy.dao.CompanyDao.selectById"> </association>
<select id="select" resultMap="resultMap"> select * from tb_project </select>
CompanyMapper.xml
<mapper namespace="com.hyxy.dao.CompanyDao"> <resultMap id="resultMap" type="com.hyxy.po.Company"> <id column="companyid" property="companyId"></id> <result column="companyname" property="companyName"></result> <collection property="list" resultMap="com.hyxy.dao.ProjectDao.resultMap"> </collection> </resultMap> <select id="select" resultMap="resultMap"> select * from tb_company c inner join tb_project p on c.companyid = p.companyid </select> <select id="selectById" resultMap="resultMap" parameterType="int"> select * from tb_company where companyid = #{id} </select> </mapper>
到此這篇關(guān)于Mybatis實(shí)現(xiàn)關(guān)聯(lián)關(guān)系映射的方法示例的文章就介紹到這了,更多相關(guān)Mybatis 關(guān)聯(lián)關(guān)系映射內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis查詢數(shù)據(jù),賦值給List集合時,數(shù)據(jù)缺少的問題及解決
這篇文章主要介紹了MyBatis查詢數(shù)據(jù),賦值給List集合時,數(shù)據(jù)缺少的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring?Boot的優(yōu)點(diǎn)及項(xiàng)目創(chuàng)建步驟詳解
這篇文章主要介紹了Spring?Boot的優(yōu)點(diǎn)及項(xiàng)目創(chuàng)建步驟,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案
統(tǒng)?的數(shù)據(jù)返回格式使? @ControllerAdvice 和 ResponseBodyAdvice 的?式實(shí)現(xiàn),下面給大家分享Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案,感興趣的朋友一起看看吧2024-03-03在idea中將java項(xiàng)目中的單個類打包成jar包操作
這篇文章主要介紹了在idea中將java項(xiàng)目中的單個類打包成jar包操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08VSCode新手教程之配置Java環(huán)境的詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于VSCode新手教程之配置Java環(huán)境的詳細(xì)教程,工欲善其事必先利其器,想要工作順利我們先搭建好JAVA的開發(fā)環(huán)境,需要的朋友可以參考下2023-10-10