1、A bean中组合了B bean,且A bean与B bean是一对一的关系。
假设一个老师只带一个班级,作为该班的班主任,演示这种关系。创建如下表
create table teacher ( t_id NUMBER(4) PRIMARY KEY, t_name VARCHAR2(20) )tablespace USERS; insert into teacher(t_id,t_name) values(1,'zhao'); insert into teacher(t_id,t_name) values(2,'qian'); create table classes ( c_id NUMBER(4) PRIMARY KEY, c_name VARCHAR2(20), teacher_id number(4) )tablespace USERS; alter table classes add constraint FK_TEACHER_ID foreign key (TEACHER_ID) references teacher (t_id); insert into classes(c_id,c_name,teacher_id)values(1,'101class',1); insert into classes(c_id,c_name,teacher_id)values(2,'102class',2);
项目结构:
创建Teacher.java实体类
package com.lfy.bean; public class Teacher { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Teacher[id="+id+",name="+name+"]"; } }
创建Classes.java实体类
package com.lfy.bean; public class Classes { private Integer id; private String name; private Teacher teacher; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @Override public String toString() { return "Classes[id="+id+",name="+name+",teacher="+teacher+"]"; } }
创建classesMapper.xml映射文件,映射classes表与Classes bean之间的相关操作关系
<?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.lfy.mapper.classesMapper"> <resultMap type="com.lfy.bean.Classes" id="ClassesResultMap1"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.lfy.bean.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> </resultMap> <resultMap type="com.lfy.bean.Classes" id="ClassesResultMap2"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" column="teacher_id" select="getTeacher"/> </resultMap> <!-- 方式一:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集 封装联表查询的数据(去除重复的数据) select * from classes c, teacher t where c.teacher_id=t.t_id and c.id=1 --> <select id="getClass1" parameterType="int" resultMap="ClassesResultMap1"> select * from classes c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <!-- 方式二:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型 SELECT * FROM classes WHERE c_id=1; SELECT * FROM teacher WHERE t_id=1 //1 是上一个查询得到的teacher_id的值 --> <select id="getClass2" parameterType="int" resultMap="ClassesResultMap2"> select * from classes where c_id=#{id} </select> <select id="getTeacher" parameterType="int" resultType="Teacher"> SELECT t_id id, t_name name FROM teacher WHERE t_id=#{id} </select> </mapper>
创建teacherMapper.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.lfy.mapper.teacherMapper"> <select id="getTeacher" parameterType="int" resultType="Teacher"> select t_id id,t_name name from teacher where t_id=#{id} </select> </mapper>
将classesMapper.xml、teacherMapper.xml注册到conf.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引用db.properties配置文件 --> <properties resource="db.properties"/> <typeAliases> <typeAlias type="com.lfy.bean.Teacher" alias="Teacher"/> <typeAlias type="com.lfy.bean.Classes" alias="Classes"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <!-- 配置数据库连接信息 --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="com/lfy/mapper/teacherMapper.xml"/> <mapper resource="com/lfy/mapper/classesMapper.xml"/> </mappers> </configuration>
MybatisTest.java程序入口
扫描二维码关注公众号,回复:
7015867 查看本文章
package com.lfy.main; import org.apache.ibatis.session.SqlSession; import com.lfy.Util.MyBatisUtil; import com.lfy.bean.Classes; import com.lfy.bean.Teacher; /** * 关联表查询之:一对一 * @author lfy * */ public class MybatisTest { public static void main(String[] args) { SqlSession sqlSession = MyBatisUtil.getSqlSession(); String statement = "com.lfy.mapper.classesMapper.getClass1"; //执行查询操作,将查询结果自动封装成Classes对象返回 Classes clazz = sqlSession.selectOne(statement,1); System.out.println(clazz); statement = "com.lfy.mapper.classesMapper.getClass2"; clazz = sqlSession.selectOne(statement,1); System.out.println(clazz); statement = "com.lfy.mapper.teacherMapper.getTeacher"; Teacher teacher = sqlSession.selectOne(statement,2); System.out.println(teacher); sqlSession.close(); } }
运行结果:
总结:MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下。
property:对象属性的名称
javaType:对象属性的类型
column:所对应的外键字段名称
select:使用另一个查询封装的结果
2、现在需要查询出班级以及老师、学生的信息。
增加学生表student
create table student ( s_id NUMBER(4) PRIMARY KEY, s_name VARCHAR2(20), class_id NUMBER(4) )tablespace USERS; alter table student add constraint FK_CLASSES_ID foreign key (CLASS_ID) references classes (c_id); insert into student(s_id,s_name,class_id) values(1,'stu_1',1); insert into student(s_id,s_name,class_id) values(2,'stu_2',1); insert into student(s_id,s_name,class_id) values(3,'stu_3',1); insert into student(s_id,s_name,class_id) values(4,'stu_4',1);
Student.java
package com.lfy.bean; public class Student { private Integer id; private String name; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student[id="+id+",name="+name+"]"; } }
修改Classes类,添加一个List<Student> students属性,使用一个List<Student>集合属性表示班级拥有很多学生
package com.lfy.bean; import java.util.List; public class Classes { private Integer id; private String name; private Teacher teacher; private List<Student> students; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public List<Student> getStudents() { return students; } public void setStudents(List<Student> students) { this.students = students; } @Override public String toString() { return "Classes[id="+id+",name="+name+",teacher="+teacher+",students="+students+"]"; } }
修改classesMapper.xml