Mybatis 級聯查詢

上一篇MyBatis極簡入門

本篇主要簡單介紹Mybatis級聯查詢的使用

  • 一對多
  • 多對多

常見的一對多模型,一個班有多個學生,一個學生只屬於一個班。

我們首先在數據庫中建立student,classes兩張表
student表,其中cid是外鍵,關聯classed的id屬性
s
classes表
在這裏插入圖片描述

現在我們有如下需求,根據一個學生id,查詢出學生的姓名班級和班級id。

我們新建兩個實體類。student和classes,代碼如下:

package com.ibuyi.mybatis.entity;

import lombok.Data;

@Data
public class Student {
    private long id;
    private String name;
    private Classes classes;

}

package com.ibuyi.mybatis.entity;

import lombok.Data;

import java.util.List;
@Data
public class Classes {
    private long id;
    private String name;
    private List<Student> students;
}

緊接着我們使用mapper代理的方式創建接口類,如下:

package com.ibuyi.mybatis.repository;

import com.ibuyi.mybatis.entity.Student;

public interface StudentDAO {
    //根據student ID查詢學生姓名班級
    Student findStudentByID(long id);
}

創建了接口以後我們需要配置student.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.ibuyi.mybatis.repository.StudentDAO">
<!--namespace指的是接口類-->
       <select id="findStudentByID" parameterType="int" resultMap="student">
       <!--resultMap也是一種返回類型,是我們自定義的-->
       <!--查詢語句,因爲mybatis是根據查找結果的列名和我們的實體類進行映射的,我們student和clsses中id,name重複,所以在查詢時用as改名。方便進行映射-->
           select s.id as id,s.`name`as name, c.id as cid,c.`name`as cname from student as s,classes as c where s.id=1 and s.cid=c.id
       </select>
    <resultMap id="student" type="com.ibuyi.mybatis.entity.Student">
    <!--需要指定對應的實體類即type-->
    
        <!--指定id屬性對應查詢語句查詢出來的結果的id列-->
          <id property="id" column="id"></id>
        
          <!--指定name屬性對應查詢語句查詢出來的結果的name列-->
        <result property="name" column="name"></result>
        
        <!--對象屬性需要用association指定javatype,property指的是student類中的屬性,javatype指明類型-->
        <association property="classes" javaType="com.ibuyi.mybatis.entity.Classes">
        
         <!--指定classes對象的id屬性對應查詢語句查詢出來的結果的cid列-->
            <id property="id" column="cid"></id>
            
               <!--指定classes對象的name屬性對應查詢語句查詢出來的結果的cname列-->
            <result property="name" column="cname"></result>
        </association>
    </resultMap>
</mapper>

執行測試代碼:

package com.ibuyi.mybatis.test;

import com.ibuyi.mybatis.entity.Student;
import com.ibuyi.mybatis.repository.StudentDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test {
    public static void main(String[] args) {
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        StudentDAO studentDAO=sqlSession.getMapper(StudentDAO.class);
        Student student=studentDAO.findStudentByID(1L);
        System.out.println(student);

    }
}

現在我們要根據Classes的id查詢班級裏面的所有學生怎麼做呢?

首先還是要先定義接口,如下:

在這裏插入代碼片package com.ibuyi.mybatis.repository;

import com.ibuyi.mybatis.entity.Classes;

import java.util.List;

public interface ClassDAO {
    //根據cid查詢班級全部學生
    List<Classes> findStudentByID(long id);
}

第二步:創建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="com.ibuyi.mybatis.repository.ClassDAO">
   <select id="findStudentByID" parameterType="long" resultMap="studentlist">
       select c.id as id,c.name as name,s.name as student,s.id as sid from student as s, classes as c where c.id=2 and s.cid=c.id   </select>
    <resultMap id="studentlist" type="com.ibuyi.mybatis.entity.Classes">
        <id property="id" column="id" ></id>
        <result property="name" column="name"></result>
        <!--這裏不能使用association,因爲是List<Student>,所以要用collection-->
        <collection property="students" ofType="com.ibuyi.mybatis.entity.Student">
            <id property="id" column="sid"></id>
            <result property="name" column="student"></result>
        </collection>
    </resultMap>
</mapper>

最後別忘了在config.xml中的配置mapper

<mappers>
        <mapper resource="com/ibuyi/mybatis/repository/student.xml"/>
        <mapper resource="com/ibuyi/mybatis/repository/class.xml"/>
</mappers>

看一下實驗結果如下:
在這裏插入圖片描述

下面我們學習一下多對多關係
常見的多對多關係如顧客購買商品,一個顧客可以購買多個商品,一個商品可以被多個顧客購買。

我們先建立三張表,一張顧客表(id,name)一張商品表(id,name)一張中間表c_goods(id,cid,gid)
其中cid,gid分別時顧客表和商品表的id對應。
隨便插入幾條數據。

1.現在我們想要某個人購買的全部商品,請看代碼:

第一步,先定義兩個實體對象,good和customer

package com.ibuyi.mybatis.entity;

import lombok.Data;

import java.util.List;

@Data
public class Customer {
    private long id;
    private String name;
    private List<Good> goods;
}

package com.ibuyi.mybatis.entity;

import lombok.Data;
import java.util.List;
@Data
public class Good {
    private long id;
    private String name;
    private List<Customer> customers;
}

緊接着,寫查詢某人購買商品的接口:

package com.ibuyi.mybatis.repository;

import com.ibuyi.mybatis.entity.Customer;
import com.ibuyi.mybatis.entity.Good;

import java.util.List;

public interface CustomerDAO {
    //根據客戶id查詢客戶購買的商品
    Customer findGoodsByID(long id);
}

再接着,寫mapper.xml文件,定義sql查詢。

<?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.ibuyi.mybatis.repository.CustomerDAO">
<select id="findGoodsByID" parameterType="long" resultMap="customer">
  select c.id as cid ,c.name as cname,g.id as gid,g.name as gname from customers c,goods g ,c_goods cg where c.id=#{id} and c.id=cg.cid and g.id=cg.gid;
</select>
    <resultMap id="customer" type="com.ibuyi.mybatis.entity.Customer">
        <id property="id" column="cid"></id>
        <result property="name" column="cname"></result>
        <collection property="goods" ofType="com.ibuyi.mybatis.entity.Good">
            <id property="id" column="gid"></id>
            <result property="name" column="gname"></result>
        </collection>
    </resultMap>
</mapper>

最後註冊到config.xml中

  <mappers>
        <mapper resource="com/ibuyi/mybatis/repository/student.xml"/>
        <mapper resource="com/ibuyi/mybatis/repository/class.xml"/>
        <mapper resource="com/ibuyi/mybatis/repository/customer.xml"/>
        <mapper resource="com/ibuyi/mybatis/repository/good.xml"/>
    </mappers>

現在,我們來看一下測試代碼:

package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Customer;
import com.ibuyi.mybatis.entity.Good;
import com.ibuyi.mybatis.repository.CustomerDAO;
import com.ibuyi.mybatis.repository.GoodDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test {
    public static void main(String[] args) {
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        CustomerDAO customerDAO=sqlSession.getMapper(CustomerDAO.class);
        Customer customer=customerDAO.findGoodsByID(3L);
        System.out.println(customer);
 
    }
}

結果如下

在這裏插入圖片描述

2.根據商品id查詢所有購買了該商品的人。

還是同樣的操作步驟,這裏把代碼貼上:

package com.ibuyi.mybatis.repository;

import com.ibuyi.mybatis.entity.Good;

public interface GoodDAO {
    Good findGoodByID(long id);
}

<?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.ibuyi.mybatis.repository.GoodDAO">
    <select id="findGoodByID" parameterType="long" resultMap="good">
        select g.id as gid ,g.name as gname,c.id as cid,c.name as cname from customers c,goods g ,c_goods cg where g.id=#{id} and g.id=cg.gid and cg.cid=c.id;
    </select>
    <resultMap id="good" type="com.ibuyi.mybatis.entity.Good">
        <id property="id" column="gid"></id>
        <result property="name" column="gname"></result>
        <collection property="customers" ofType="com.ibuyi.mybatis.entity.Customer">
            <id property="id" column="cid"></id>
            <result property="name" column="cname"></result>
        </collection>
    </resultMap>
</mapper>

package com.ibuyi.mybatis.test;
import com.ibuyi.mybatis.entity.Customer;
import com.ibuyi.mybatis.entity.Good;
import com.ibuyi.mybatis.repository.CustomerDAO;
import com.ibuyi.mybatis.repository.GoodDAO;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;

public class Test {
    public static void main(String[] args) {
        InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        GoodDAO goodDAO=sqlSession.getMapper(GoodDAO.class);
        Good good=goodDAO.findGoodByID(1);
        System.out.println(good);
        sqlsession.close();

    }
}

在這裏插入圖片描述

mybatis的級聯查詢的相關內容到此就結束了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章