一、表结构
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;
}
}