mybatis 一对多和多对一关联查询

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

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);
    }

}

一对多查询结果

多对一查询结果

时间: 2024-10-22 20:16:37

mybatis 一对多和多对一关联查询的相关文章

beego orm 一对多、多对多 关联查询

一对多 model ype User struct {Id int64 json:"id"Name string json:"name,omitempty" orm:"size(50)"Passwords string json:"passwords" orm:"size(32)"Baby []Baby json:"baby" orm:"reverse(many)"}

Mybatis深入了解(六)----关联查询(高级映射)

一对一查询 resultType resultMap 一对多查询 resultType resultMap 多对多查询 一对一查询 resultType resultType:使用resultType实现非常简单,如果POJO中没有包括查询的列名,可以新建扩展类继承父类,并在子类中添加列名对应的属性,即可完成映射. package cn.itcast.ssm.po; /** * 订单的扩展类 * @author Administrator * */ //通过此类映射订单和用户查询的结果,让此类继

NHibernate教程(11)--多对多关联查询

本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型: 在图上,我已经清晰的标注了表之间的关系,上两篇分析Customer和Order之间的"外键关系"或者称作"父子关系"."一对多关系"和关联查询,这一篇以Order为中心,分析Order和Product之间的关系,直接看下面一幅图的两张表: 上面两

MyBatis一对多和多对多xml配置

MyBatis一对多和多对多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"> <mapper namespace="com.ktcx.

Hibernate一对多、多对一关联

一对多.多对一关联:在多方加外键 示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group   多对一单向关联 在User(多方)中建Group(一方)对象,并添加@ManyToOne注解 1.建Group实体类和User实体类,添加Annotation注解,如下 @Entity @Table(name="_group") //group在MySQL中是关键字,不能直接做表名 public class Group { privat

Mybatis 一对一、一对多、多对多关联

示例项目:MIPO_CRM 一.一对一关联 示例:订单与销售机会 描述:在业务员与客户的联系人的联系记录中可以生成一条销售机会,而此条销售机会可生成一条订单,两者呈一对一关联. 1.表设计 opportunity(销售机会) orders(订单) 2.pojo Opportunity /** * 销售机会机会 * @author Administrator * */ public class Opportunity implements Serializable{ private int opi

MyBatis——一对多、多对一

遇见你之前心猿意马.可遇见你之后,猿跳走了,马飞奔而去,只剩心意,全然为你. 1.多对一处理 多对一: 多个学生,对应一个老师 对于学生这边而言,关联,多个学生,关联一个老师[多对一] 对于老师而言,集合,一个老师有很多学生[一对多] SQL: CREATE TABLE `teacher`( `id` int(10) Not null, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARS

mybatis 一对多和多对一

在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的"多"中也只有一条数据.id和result的唯一不同是id表示的结果将是当比较对象实例时用到的标识属性.这帮助来改进整体表现,特别是缓存和嵌入结果映射.所以不同数据的id应该唯一区别,不然导致数据结果集只有一条数据. 一.表 二.实体 1.person [java] view plain copy package com.kerwin.mybatis.pojo;

Mybatis一对多,多对一中主子表字段名一致产生的问题及解决方案

数据库两张表的字段名都和两个类的属性名称一样,这时在关联查询出现一个问题. 学生类: package com.pojo; public class Student { private int id; private String name; private int age; private ClassInfo classInfo; public Student() { } public Student(String name, int age) { super(); this.name = na