软件编程
位置:首页>> 软件编程>> java编程>> Mybatis实现关联关系映射的方法示例

Mybatis实现关联关系映射的方法示例

作者:aigo-2021  发布时间:2022-09-18 05:36:12 

标签:Mybatis,关联关系,映射

类和类有关联,将查询的结果注入到对象和对象的关联关系中

Mybatis处理的关联关系 包括一对一关联一对多关联 ,例如学生关联班级是一对一 ;班级关联学生是一对多。

Mybatis实现关联关系映射,有两种方式:多表连接子查询

数据库表结构

tb_project 

Mybatis实现关联关系映射的方法示例

tb_cmpany

Mybatis实现关联关系映射的方法示例

 一、实现Project关联Company一对一关联

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语句,为了区分多个映射文件,使用命名空间+id进行区分。namespace命名空间-->
<mapper namespace="com.hyxy.dao.CompanyDao">
   <!--自定义结果映射-->
   <resultMap id="resultMap" type="com.hyxy.po.Company">
       <!--如果数据库中有主键,写id映射-->
       <id column="companyid" property="cId"></id>
       <result column="companyname" property="cName"></result>
       <!--一对多关系映射  (全类名.resultMap)-->
       <collection property="list" resultMap="com.hyxy.dao.ProjectDao.resultMap">
       </collection>

</resultMap>
   <!--
       查询所有的项目信息,多表连接查询关联的客户信息,
       把项目信息注入到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;
//接口绑定,动态查询,关联关系查询
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();
       }
   }
}

运行结果:

Mybatis实现关联关系映射的方法示例

 或者

ProjectMapper.xml

<!-- 使用已经定义好的一个 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>

二、实现Company关联Project一对多关系

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;//实现Company关联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语句,为了区分多个映射文件,使用命名空间+id进行区分。namespace命名空间-->
<mapper namespace="com.hyxy.dao.CompanyDao">
   <!--自定义结果映射-->
   <resultMap id="resultMap" type="com.hyxy.po.Company">
       <!--如果数据库中有主键,写id映射-->
       <id column="companyid" property="cId"></id>
       <result column="companyname" property="cName"></result>
       <!--一对多关系映射  (全类名.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;

//接口绑定,动态查询,关联关系查询
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();
       }
   }
}

运行结果:

Mybatis实现关联关系映射的方法示例

一对一关联使用<association>,一对多关联使用<collection>

 三、Mybatis子查询方式实现关联关系查询

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>

来源:https://blog.csdn.net/aigo_2021/article/details/125833490

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com