mybatis 一对多和多对一关联查询详解编程语言

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

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

mybatis 一对多和多对一关联查询详解编程语言

两个实体类

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

一对多查询结果

mybatis 一对多和多对一关联查询详解编程语言

多对一查询结果

mybatis 一对多和多对一关联查询详解编程语言

 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/16979.html

(0)
上一篇 2021年7月19日 19:47
下一篇 2021年7月19日 19:47

相关推荐

发表回复

登录后才能评论