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

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

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

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

标签:Mybatis,关联关系,映射
0
投稿

猜你喜欢

  • Java List集合排序实现方法解析

    2023-01-06 05:40:14
  • JSON.toJSONString()空字段不忽略修改的问题

    2023-06-16 03:12:37
  • 同步调用和异步调用WebService

    2022-11-27 07:10:03
  • 关于IDEA配置文件字符集的问题

    2022-11-01 13:06:44
  • Swing常用组件之单选按钮和复选框

    2023-02-15 13:35:05
  • SpringBoot整合Shiro实现登录认证的方法

    2022-03-23 01:12:19
  • myEclipse配置jdk1.7教程

    2022-07-21 11:25:35
  • c#开发cad预览图块步骤详解

    2022-12-30 10:49:07
  • Android studio实现简易计算器App功能

    2023-03-07 07:57:57
  • Java @RequestMapping注解功能使用详解

    2022-08-15 11:06:10
  • Java设计模式之观察者模式_动力节点Java学院整理

    2022-01-14 12:27:47
  • Spring MVC 基于URL的映射规则(注解版)

    2021-05-23 15:05:09
  • Android4.0平板开发之隐藏底部任务栏的方法

    2023-11-29 15:11:44
  • Java中FilterInputStream和FilterOutputStream的用法详解

    2023-10-02 06:47:03
  • Java使用Scanner类进行控制台输入实现方法

    2021-08-08 18:34:26
  • JVM内存参数配置详解

    2022-05-20 19:17:57
  • Java设计模式七大原则之单一职责原则详解

    2022-05-12 20:48:58
  • Spark网站日志过滤分析实例讲解

    2021-06-08 12:59:24
  • MyBatis ofType和javaType的区别说明

    2021-09-10 22:56:43
  • Java中对象的比较操作实例分析

    2023-03-05 03:58:09
  • asp之家 软件编程 m.aspxhome.com