Mybatis 一对一、一对多、多对一

灵感来源于:https://www.cnblogs.com/xdp-gacl/p/4264440.html

转发自:https://www.cnblogs.com/hq233/p/6752335.html

首先  数据库量表之间字段关系(没有主外键)

studentmajor表的id字段对应student表里major字段

两个实体类

package com.model;

import java.util.Date;

public class Student {
    private Integer sno;
    private String sname;
    private String ssex;
    private Integer sclass;
    private StudentMajor studentmajor;

    public Student() {
        super();
    }
    public Student(Integer sno, String sname, String ssex, Integer sclass, StudentMajor studentmajor) {
        super();
        this.sno = sno;
        this.sname = sname;
        this.ssex = ssex;
        this.sclass = sclass;
        this.studentmajor = studentmajor;
    }
    public StudentMajor getStudentmajor() {
        return studentmajor;
    }
    public void setStudentmajor(StudentMajor studentmajor) {
        this.studentmajor = studentmajor;
    }
    public Integer getSno() {
        return sno;
    }
    public void setSno(Integer sno) {
        this.sno = sno;
    }

    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public String getSsex() {
        return ssex;
    }
    public void setSsex(String ssex) {
        this.ssex = ssex;
    }

    @Override
    public String toString() {
        return "Student [sno=" + sno + ", sname=" + sname + ", ssex=" + ssex + ", sclass=" + sclass + ", studentmajor="
                + studentmajor + "]";
    }
    public Integer getSclass() {
        return sclass;
    }
    public void setSclass(Integer sclass) {
        this.sclass = sclass;
    }

}

package com.model;

import java.util.List;

public class StudentMajor {
    private Integer id;
    private String mcode;
    private String mname;
    private List<Student> students;
    public StudentMajor() {
        super();
    }
    public StudentMajor(Integer id, String mcode, String mname, List<Student> students) {
        super();
        this.id = id;
        this.mcode = mcode;
        this.mname = mname;
        this.students = students;
    }
    @Override
    public String toString() {
        return "StudentMajor [id=" + id + ", mcode=" + mcode + ", mname=" + mname + ", students=" + students + "]";
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getMcode() {
        return mcode;
    }
    public void setMcode(String mcode) {
        this.mcode = mcode;
    }
    public String getMname() {
        return mname;
    }
    public void setMname(String mname) {
        this.mname = mname;
    }
    public List<Student> getStudents() {
        return students;
    }
    public void setStudents(List<Student> students) {
        this.students = students;
    }

}

定义两个接口

package com.dao;
import java.util.List;
import java.util.Map;

import com.model.Student;

public interface StudentMapper {
    /**
     * 全表查询
     */
    public List<Student> selectall();
  /**
     * 根据专业查人员,给一对多用
     */
    public List<Student> selectz(Integer major);
}

package com.dao;
import java.util.List;
import com.model.StudentMajor;

public interface StudentMajorMapper {
    /**
     * 全表查询
     * @return
     */
    public List<StudentMajor> selectAll();
    /**
     * 根据主键查数据,给多对一用
     * @param id
     * @return
     */
    public StudentMajor select(Integer id);
}

定义两个实体类的映射方法

<?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">
 <mapper namespace="com.dao.StudentMapper">

    <!-- 多对一查询  -->
    <resultMap type="Student" id="slist">
        <!-- 跟一对一一样用association标签,实体类定义的成员,要跟数据库字段名对应上 -->
        <association property="studentmajor" column="major"
        select="com.dao.StudentMajorMapper.select"/> <!-- 用接口里定义的方法,根据student表中的major字段查出对应数据 -->
    </resultMap>
    <!-- 查全部 -->
    <select id="selectall" resultMap="slist" >
        select * from student
    </select>
    <!-- 根据专业查人员  -->
    <select id="selectz" parameterType="Integer" resultType="student">
        select * from student s where s.major=#{major}
    </select>
 </mapper>

<?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">
 <mapper namespace="com.dao.StudentMajorMapper">

     <!-- 一对多查询关联  -->
     <resultMap type="StudentMajor" id="slist">
         <!-- 实体类属性对应数据库的主键字段,不然主键会查不到 -->
         <id property="id" column="id"/>
         <!-- 用collection标签 ,也是实体类属性要对应数据库字段-->
         <collection property="students" column="id"
         select="com.dao.StudentMapper.selectz">
         </collection>
     </resultMap>

     <!-- 全表查询 -->
     <select id="selectAll" resultMap="slist">
         select * from studentmajor
     </select>

     <!-- 根据主键查 -->
     <select id="select" parameterType="Integer" resultType="StudentMajor">
         select * from studentmajor where id=#{id}
     </select>

 </mapper>

JUnit测试

package com.util;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.dao.StudentMajorMapper;
import com.dao.StudentMapper;
import com.model.Student;
import com.model.StudentMajor;

public class JJJtest {
    private SqlSession ss;
    private StudentMapper sm;
    private StudentMajorMapper smm;

    @Before
    public void setUp() throws Exception {
        ss=SqlSessionUtil.getSqlSession();
        sm=ss.getMapper(StudentMapper.class);
        smm=ss.getMapper(StudentMajorMapper.class);

    }
    @After
    public void tearDown() throws Exception {
        ss.commit();
        ss.close();
    }
    //一对多查询
    public void test() {
        List<StudentMajor> list=smm.selectAll();
        for(StudentMajor a:list){
            System.out.println(a);
        }
    }
    //根据专业查人员,给一对多用
    public void selectz(){
        List<Student> l=sm.selectz(3);
        for(Student a:l){
            System.out.println(a);
        }
    }

//多对一查询
    @Test
    public void selectall() {
        List<Student> st=sm.selectall();
        for(Student tt:st){
            System.out.println(tt);
        }
    }
    //根据主键查询,给多对一用
    public void select(){
        StudentMajor a=smm.select(1);
        System.out.println(a);
    }

}

一对多查询结果

多对一查询结果

原文地址:https://www.cnblogs.com/Bkxk/p/10175616.html

时间: 2024-07-30 13:42:28

Mybatis 一对一、一对多、多对一的相关文章

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

django mysql 表的一对一 一对多 多对多

表结构的设计 一对一 多对一  将key写在多 多对多 外键: 描述  多对一的关系 写在多的一方 class Book(models.Model) title = models.CharField(max_length=32,unique=Ture) publisher = models.ForeignKey (to=Publisher,on_deleete=models.CASADE) publisher = models.ForeignKey(to='Publisher', on_dele

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

Hibernate 映射文件的配置 核心文件的配置 一对一 一对多 多对多 hibernate实现分页 Hibernate中session的关闭问题总结

以留言系统为实例 1 .配置映射文件:首先得引入约束dtd <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 然后<hibernate-mapping></hibernate-mapping>映射标签 <

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ

多对多 一对一 一对多 主从 关联 字典

 "订单"表中的主键.  "产品"表中的主键.  一个订单可以包含多种产品 ...   ... 且每种产品可以出现在多个订单上.   课程文本 在多对多关系中,一个表中的一个记录与第二个表中的多个记录相关,第二个表中的一个记录与第一个表中的多个记录相关. 这种类型的关系需要一个称为连接表的第三个表.连接表包含另两个表中的主键,并将它们用作其外键. 例如,"订单"表和"产品"表具有多对多关系.一个订单可以包含多种产品,每种产品可

Hibernate 集合映射 一对多多对一 inverse属性 + cascade级联属性 多对多 一对一 关系映射

1 . 集合映射 需求:购物商城,用户有多个地址. // javabean设计 // javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set<String> address; private List<String> addressList = new ArrayList<String>(); //private Str

mybatis的一对多,多对一,以及多对对的配置和使用

1.本文章是无意中看见易百教程的Mybatis教程才注意到这个问题,平时都仅仅是在用CRUD,忽略了这方面的问题,真实十分羞愧 2.首先我们开始对mybatis的一对多的探究 根据这个应用场景,我们需要获取在查询一个用户信息的时候还要去读取这个用户发布的帖子 现在我们来看一看用户级联文章在JavaBean中的编写方式,这就是一对多在JavaBean中的配置 现在我们再来看一看Mybatis的Mapper该如何编写一对多?很简单,就是在resultMap标签中配置<collection>标签,用

mybatis学习笔记(11)-多对多查询

mybatis学习笔记(11)-多对多查询 mybatis学习笔记11-多对多查询 示例 多对多查询总结 resultMap总结 本文实现多对多查询,查询用户及用户购买商品信息. 示例 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表:orders.orderdetail.items sql SELECT orders.*, user.username, user.sex, user.address, orderdetail.id orderdeta

mybatis之一对多

今天主要话题围绕这么几个方面? mybatis一对多示例 sql优化策略 一.mybatis之一对多 在说一对多之前,顺便说一下一对一. 一对一,常见的例子,比如以常见的班级例子来说,一个班主任只属于一个班级(排除某个班主任能力超群可兼任多个班级). 例如: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper