MyBatis总结(2)--级联查询

本文介绍了一对一和一对多关联查询在MyBatis中的实现方法,包括数据库设计、domain对象定义、mapper.xml文件配置及JUnit测试等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、一对一
1、数据库设计
建立两张表,class表和teacher表,一个老师只能带一个班(建表语句略)
2、domain对象

package com.person.test.mybatis.domain;

import java.util.List;

/**
 * Copyright: Copyright (c) 2017/10/24
 * Description: 描述班级的domain对象
 * CLASS_NAME: Classes
 * PACKAGE_NAME: com.person.test.mybatis.domain
 * version: v1.0.0
 * author: Jin Biao
 * date: 2017/10/24 8:56
 */
public class Classes {
    private int id;
    private String name;
    private Teacher teacher;


    public Classes() {
    }

    public Classes(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }

    public int getId() {
        return id;
    }

    public void setId(int 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 +        
                '}';
    }
}
package com.person.test.mybatis.domain;

/**
 * Copyright: Copyright (c) 2017/10/24
 * <p>
 * Description:
 * CLASS_NAME: Teacher
 * PACKAGE_NAME: com.person.test.mybatis.domain
 * version: v1.0.0
 * author: Jin Biao
 * date: 2017/10/24 8:57
 */
public class Teacher {
    private int id;
    private String tName;

    public Teacher() {
    }

    public Teacher(int id, String tName) {
        this.id = id;
        this.tName = tName;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String gettName() {
        return tName;
    }

    public void settName(String tName) {
        this.tName = tName;
    }

    public String toString(){
        return "Teacher [ id = " + id + " t_name = " + tName + "]";
    }
}

3、mapper.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="mybatis.mapping.classMapper">
<!--使用resultMap属性实现一对一的对应关系-->
    <select id="getById" parameterType="int" resultMap="ClassResultMap1">
        SELECT c.*,t.id t_id,t.name t_name FROM class c,teacher t  WHERE  c.t_id = t.id AND c.id = #{id}
    </select>
    <!--column对应的是表中的字段名-->
     <resultMap id="ClassResultMap1" type="Classes">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <!--这里使用<association>标签实现两张表的查询关联 column 指的是classes的外键,这里有两种实现方法:1.一种是关联查询:       SELECT c.*,t.id t_id,t.name t_name FROM class c,teacher t  WHERE  c.t_id = t.id AND c.id = #{id}  2.另一种是嵌套查询,先得到t_id,在通过id去teacher表查询teacher的信息-->
        <association property="teacher" javaType="Teacher" column="t_id" >
        <!--这里需要特别关注的是如果两个表的字段名一样,要在查询结果将其中一个的字段名重命名,如果没有,不会报错,但是查询得到的teacher的结果会是classes的数据-->
            <id property="id" column="t_id"/>
            <result property="tName" column="t_name"/>
        </association>
<!--嵌套查询的实现  select 指的是获取哪个查询语句这里使用的是teacherMpper.xml文件中的getById语句-->
        <association property="teacher" column="t_id" select="mybatis.mapping.teacherMapper.getById"/>

    </resultMap>
</mapper>

4.junit测试

  • MybatisUtil类
package com.person.test.mybatis.utils;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * Copyright: Copyright (c) 2017/10/23
 * <p>
 * Description:
 * CLASS_NAME: MybatisUtil
 * PACKAGE_NAME: com.person.test.mybatis.utils
 * version: v1.0.0
 * author: Jin Biao
 * date: 2017/10/23 8:57
 */
public class MybatisUtil {

    /** method_name:getSessionFactory
    * param:  void
    * description: 获取sessionFactory
    * create_user: Jin Biao 
    * create_date: 2017/10/23 
    * create_time: 9:07 
    **/
    public static SqlSessionFactory getSessionFactory() throws Exception{
        String resource = "src/com/person/test/mybatis/conf.xml";

        //读取配置文件
        InputStream inputStream = new FileInputStream(resource);
        //建立factory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        return factory;
    }

    public static SqlSession getSqlSession() throws Exception {
        return getSessionFactory().openSession();
    }

    /** method_name: getSqlSession
    * param:  boolean isAutoCommit
    * description: 是否自动提交事务  true:自动提交  false:需要手动提交
    * create_user: Jin Biao 
    * create_date: 2017/10/23 
    * create_time: 9:13 
    **/
    public static SqlSession getSqlSession(boolean isAutoCommit) throws Exception {
        return getSessionFactory().openSession(isAutoCommit);
    }
}
  • 测试内容
   @Test
    public void testGetById() throws Exception {
//这里使用MybatisUtil将mybatis实现的功能进行封装
        SqlSession sqlSession = MybatisUtil.getSqlSession(true);

        String statement = "mybatis.mapping.classMapper.getById";

        Classes classes = sqlSession.selectOne(statement,2);

        sqlSession.close();

        System.out.println(classes);
    }

二、一对多查询
1、数据库设计
再新增一张表student表,一个班级内有多个学生,一个学生只能在一个班级,建表语句也不多说。
2.domain对象
Student对象

package com.person.test.mybatis.domain;

/**
 * Copyright: Copyright (c) 2017/10/25
 * Description:
 * CLASS_NAME: Student
 * PACKAGE_NAME: com.person.test.mybatis.domain
 * version: v1.0.0
 * author: Jin Biao
 * date: 2017/10/25 17:35
 */
public class Student {
    private int id;
    private String name;

    public Student(){

    }
    public int getId() {
        return id;
    }

    public void setId(int 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 + '\'' +
                '}';
    }
}
Class对象,这里要多一个属性List<Student>
package com.person.test.mybatis.domain;

import java.util.List;

/**
 * Copyright: Copyright (c) 2017/10/24
 * Description: 描述班级的domain对象
 * CLASS_NAME: Classes
 * PACKAGE_NAME: com.person.test.mybatis.domain
 * version: v1.0.0
 * author: Jin Biao
 * date: 2017/10/24 8:56
 */
public class Classes {
    private int id;
    private String name;
    private List<Student> students;

    public Classes() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    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 + '\'' +               
                ", students=" + students +               
                '}';
    }
}

3、classes.xml文件
一对多的实现和一对一相差不大,将association标签换成collection

<?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="mybatis.mapping.classMapper">
  <select id="getClasses" parameterType="int" resultMap="ClassResultMap2">
    SELECT * FROM class c , student s where c.id = s.c_id AND c.id = #{id}
</select>
 <!--一对多联合查询-->
 <resultMap id="ClassResultMap2" type="Classes">
  <id property="id" column="id"/>
  <result property="name" column="name"/>

  <collection property="students" ofType="Student">
      <id property="id" column="s_id"/>
      <result property="name" column="s_name"/>
  </collection>
</resultMap>
</mapper>

4、junit测试

   @Test
    public void getClasses() throws Exception {
        SqlSession sqlSession = MybatisUtil.getSqlSession(true);

        String statement = "mybatis.mapping.classMapper.getClasses";

        Classes classes = sqlSession.selectOne(statement,1);

        sqlSession.close();

        System.out.println(classes);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值