MyBatis實現表的關聯查詢

一、一對一關聯

例如根據班級的Id,查詢與之關聯的班主任的所有的信息。

teacher表

t_id varchar(50)

t_name varchar(50)

t_sex varchar(50)

t_age int

t_phonenumber varchar(50)

class表

c_id varchar(50)

c_name varchar(50)

teacher_id varchar(50)

定義後臺mapper下的classDao.xml

其中select語句的寫法如下:

 <select id="**" parameterType="int" resultMap="ClassResultMap">
         select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=#{id}
 </select>
     <!-- 使用resultMap映射實體類和字段之間的一一對應關係 -->
     <resultMap type="***" id="ClassResultMap">
         <id property="id" column="c_id"/>
         <result property="name" column="c_name"/>
         <association property="teacher" javaType="***">
             <id property="id" column="t_id"/>
             <result property="name" column="t_name"/>
             <result property="sex" column="t_sex"/>
             <result property="age" column="t_age"/>
             <result property="phonenumber" column="t_phonenumber"/>
         </association>
     </resultMap>

二、一對多關聯

例如以下情形:

農場不購買成本肥料和農藥,所以需要自己以有機方式配,配肥配藥的方式爲技術員負責,技術員招募一些臨時工,使用一定數量的原料,配完後在總重量上會有5%-15%之間的損耗。所以,技術員有配肥配藥的增、刪、改、查的管理功能,配肥配藥記錄包括:“配料記錄編號”、日期、肥料或農藥的名稱(比如肥料1、農藥1等簡易的名稱,10個漢字以內)、臨時工的勞務費(以元爲單位,100-500之間不等)、總重量損耗比、使用的各種不同原料的名稱、使用的各種不同原料的數量(以kg爲單位)。一條配肥或配藥記錄可以使用不同數量的多種原料,這個在數據庫技術中稱爲“一對多”的數據管理問題。

不熟悉數據庫的同學可以只用一張數據表包含:“配料記錄編號”、日期、肥料或農藥的名稱、臨時工的勞務費、總重量損耗比、雞糞重量、馬糞重量、牛糞重量、餅肥重量、稻殼重量、蓮蓬殼重量、稻草重量、鋸末重量、水重量、樹葉重量。重量均以kg爲單位。這樣做的缺點是數據存儲比較稀疏,並且以後不方便再添加或刪除原料種類,所以,這種設計只能用來交作業,實際工作中是不會這麼設計的。

熟悉數據庫的同學可以分成兩張數據表:第一張數據表包含“配料記錄編號”、日期、肥料或農藥的名稱、臨時工的勞務費、總重量損耗比;第二張數據表包含“配料記錄編號”、一種原料名稱、一種原料的使用數量。採用兩張數據表可以節省重複記錄的數據量,方便修改維護,這樣每個“配料記錄編號”在第一張數據表中是唯一的,每個“配料記錄編號”在第二張數據表中可以重複,如果要修改臨時工的勞務費,只需要修改第一張數據表中相應的記錄,如果要修改所使用的原料,只需要修改第二張數據表中相應的記錄。

fertilizer表:

package com.example.demo.entity;

import java.util.Date;
import java.util.List;

public class Fertilizer {
    private String id;
    private Date date;
    private String fertilizer_name;
    private int salary;
    private double loss;
    private List<FertilizerInclude> fertilizerIncludeList;

    public List<FertilizerInclude> getFertilizerIncludeList() {
        return fertilizerIncludeList;
    }

    public void setFertilizerIncludeList(List<FertilizerInclude> fertilizerIncludeList) {
        this.fertilizerIncludeList = fertilizerIncludeList;
    }

    public String getId() {
        return id;
    }

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

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getFertilizer_name() {
        return fertilizer_name;
    }

    public void setFertilizer_name(String fertilizer_name) {
        this.fertilizer_name = fertilizer_name;
    }

    public int getSalary() {
        return salary;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public double getLoss() {
        return loss;
    }

    public void setLoss(double loss) {
        this.loss = loss;
    }
}

fertilizerinclude表:

package com.example.demo.entity;

public class FertilizerInclude {
    private String id;
    private String fertinclude_name;
    private int num;

    public String getId() {
        return id;
    }

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

    public String getFertinclude_name() {
        return fertinclude_name;
    }

    public void setFertinclude_name(String fertinclude_name) {
        this.fertinclude_name = fertinclude_name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

想要實現從兩個表獲取所有的完整數據。

fertilizerDao.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.example.demo.dao.FertilizerDao">
    <select id="queryAll" parameterType="com.example.demo.entity.Fertilizer"
            resultMap="lizi">
        select *
        from fertilizer , fertinclude
        where fertilizer.id = fertinclude.id
    </select>
    <resultMap id="lizi" type="com.example.demo.entity.Fertilizer">
        <id property="id" column="id"/>
        <result property="date" column="date"/>
        <result property="fertilizer_name" column="fertilizer_name"/>
        <result property="salary" column="salary"/>
        <result property="loss" column="loss"/>
        <collection property="fertilizerIncludeList" ofType="com.example.demo.entity.FertilizerInclude">
            <id property="id" column="id"/>
            <result property="fertinclude_name" column="fertinclude_name"/>
            <result property="num" column="num"/>
        </collection>
    </resultMap>
    <insert id="insertFertilizer" useGeneratedKeys="true" keyProperty="id"
            keyColumn="id" parameterType="com.example.demo.entity.Fertilizer">
        insert into
        fertilizer(id,date,fertilizer_name,salary,loss)
        values (#{id},#{date},#{fertilizer_name},#{salary},#{loss})
    </insert>
    <insert id="insertFertinclude" useGeneratedKeys="true" keyProperty="id"
            keyColumn="id" parameterType="com.example.demo.entity.Fertilizer">
        insert into
        fertinclude(id,fertinclude_name,num)
        values (#{id},#{fertinclude_name},#{num})
    </insert>
    <update id="updateFertilizer" parameterType="com.example.demo.entity.Fertilizer">
        update fertilizer
        <set>
            <if test="date!=null">date=#{date},</if>
            <if test="fertilizer_name!=null">fertilizer_name=#{fertilizer_name},</if>
            <if test="salary!=null">salary=#{salary},</if>
            <if test="loss!=null">loss=#{loss}</if>
        </set>
        where id=#{id}
    </update>
    <update id="updateFertinclude" parameterType="com.example.demo.entity.FertilizerInclude">
        update fertinclude
        <set>
            <if test="fertinclude_name!=null">fertinclude_name=#{fertinclude_name},</if>
            <if test="num!=null!=null">num=#{num}</if>
        </set>
        where id=#{id}
    </update>
    <delete id="deleteFertilizer">
        delete from
        fertilizer
        where id=#{id}
    </delete>
    <delete id="deleteFertinclude">
        delete from
        fertinclude
        where id=#{id}
    </delete>

</mapper>

 

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