一、一对一关联
例如根据班级的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>