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

    一对多查询结果

    多对一查询结果

  • 相关阅读:
    Winform打包Exe Inno Setup
    electron build慢
    electron解压app.asar文件
    input readonly 禁止获得焦点 和选择
    JS export
    数据库插件 red-gate SQLToolbelt
    DataGridView修改值后,最后一个修改项页面不会刷新
    DbDataReaderExtensions DbDataRender转换为实体
    反射获得实体
    LINQ Expression AndAlso,OrElse和And,Or的区别
  • 原文地址:https://www.cnblogs.com/hq233/p/6752335.html
Copyright © 2020-2023  润新知