Mybaits总结--一对多查询

一、表结构

CREATE TABLE `class` (
  `c_id` int(2) NOT NULL AUTO_INCREMENT,
  `c_name` varchar(30) DEFAULT NULL,
  `teacher_id` int(2) DEFAULT NULL,
  PRIMARY KEY (`c_id`),
  KEY `t_id_fk` (`teacher_id`),
  CONSTRAINT `t_id_fk` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`t_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `teacher` (
  `t_id` int(2) NOT NULL AUTO_INCREMENT,
  `t_name` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`t_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `student` (
  `s_id` int(2) NOT NULL AUTO_INCREMENT,
  `s_name` varchar(30) DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`s_id`),
  KEY `c_id_fk` (`class_id`),
  CONSTRAINT `c_id_fk` FOREIGN KEY (`class_id`) REFERENCES `class` (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

二、实体,在一的一方有多的一方的集合(这边实例包含了一对一和一对多)

class实体

public class Classes {
    //省去getter和setter
	private Integer id;
	private String name;
	private Teacher teacher;
    private List<Student> students;
}

teacher实体

public class Teacher {
    //省去getter和setter
	private Integer id;
	private String name;
}

student实体

public class Student {

	private Integer id;
	private String name;
}

三、mapper映射文件

1、嵌套结果,使用SQL的联表查询,使用<collection>标签,其中ofType 属性指定List<T> 中的 T的全类名或者别名

<select id="getClasses" parameterType="int" resultMap="getClassMap">
     select * from class c, teacher t, student s where c.teacher_id = t.t_id and c.c_id = s.class_id and c.c_id = #{id}
  </select>
  
  <resultMap type="Classes" id="getClassMap">
     <id property="id" column="c_id"/>
     <result property="name" column="c_name"/>
     
     <association property="teacher" javaType="Teacher">
        <id property="id" column="teacher_id"/>
        <result property="name" column="t_id"/>
     </association>
     
     <collection property="students" ofType="Student">
        <id property="id" column="s_id"/>
        <result property="name" column="s_name"/>
     </collection>
  </resultMap>

2、嵌套查询,sql 语句使用多条sql 语句查询,使用<collection>标签不需要指定ofType 属性,List<T> 中的T 根据select 属性指定的select 的标签返回的类型,column 属性指定select 标签的sql 语句的参数

<select id="getClasses2" parameterType="int" resultMap="getClssesMap2">
     select * from class where c_id = #{id}
  </select>
  <select id="getTeacher" resultType="Teacher">
     select t_id id, t_name name from teacher where t_id = #{id}
  </select>
  <select id="getStudent" resultType="Student">
     select s_id id, s_name name from student where class_id = #{id}
  </select>
  
  <resultMap type="Classes" id="getClssesMap2">
     <id property="id" column="c_id"/>
     <result property="name" column="c_name"/>
     
     <association property="teacher" select="getTeacher" column="teacher_id"></association>
     
     <collection property="students" select="getStudent" column="c_id"></collection>
  </resultMap>

3.、查询一对多结果的集合,采用第一种嵌套结果的sql联表查询

 <select id="getClasses3" resultMap="getClassMap">
     select * from class c left join teacher t on c.teacher_id = t.t_id left join student s on c.c_id = s.class_id
  </select>

四、调用

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import zhuojing.mybaits.onetoone.Classes;
import zhuojing.mybaits.util.MybaitsUtils;
public class TestOneToMany {

	@Test
	public void test1(){
		
		SqlSessionFactory factory = MybaitsUtils.getFactory();
		SqlSession session = factory.openSession();
		
		String statement ="zhuojing.mybaits.onetomany.classesMapper.getClasses";
		
		Classes classes = session.selectOne(statement,1);
		
		System.out.println(classes);
		session.close();
	}
	
	@Test
	public void test2(){
		
		SqlSessionFactory factory = MybaitsUtils.getFactory();
		SqlSession session = factory.openSession();
		
		String statement ="zhuojing.mybaits.onetomany.classesMapper.getClasses2";
		
		Classes classes = session.selectOne(statement,2);
		
		System.out.println(classes);
		session.close();
	}
	
	@Test
	public void test3(){
		
		SqlSessionFactory factory = MybaitsUtils.getFactory();
		SqlSession session = factory.openSession();
		
		String statement ="zhuojing.mybaits.onetomany.classesMapper.getClasses3";
		
		List<Classes> list = session.selectList(statement);
		for (Classes classes : list) {
			System.out.println(classes);
		}
		
		session.close();
	}
}
import java.io.InputStream;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybaitsUtils {

	public static SqlSessionFactory getFactory(){
		
		InputStream in = MybaitsUtils.class.getClassLoader().getResourceAsStream("conf.xml");
		
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
		
		
		return factory;
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_25011427/article/details/83795907