Mybatis-第六篇多表关联查询及Java bean中组合了其他bean

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

猜你喜欢

转载自www.cnblogs.com/ZeroMZ/p/11349311.html