MyBatis笔记(二)——一对一,一对多映射

                                          /* 今天学习的是关联关系的部分内容 */


(一)一对一关系

这里我以住房和户主为例,在通常情况下(土豪和炒房团奏凯!),它们是一对一的关系。

我们先写两个持久类:House 与 Host

Host持久类:

package ouc;

public class Host {
    private int mid;
    private String name;
    private House house;
    
    public Host(){}
    
    public Host(int mid,String name,House house){
        super();
        this.mid = mid;
        this.name = name;
        this.house = house;
    }

    public int getMid() {
        return mid;
    }

    public String getName() {
        return name;
    }

    public House getHouse() {
        return house;
    }

    public void setHouse(House house) {
        this.house = house;
    }

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

    public void setMid(int mid) {
        this.mid = mid;
    }

    @Override
    public String toString() {
        return "Host{" +
                "mid=" + mid +
                ", name='" + name + '\'' +
                ", house=" + house +
                '}';
    }
}
House持久类:
package ouc;

public class House {
    private int hid;
    private String housename;
    private Host host;

    public House(){
    }
    public House(int hid,String housename,Host host) {
        super();
        this.hid = hid;
        this.housename = housename;
        this.host = host;
    }

    public int getHid() {
        return hid;
    }

    public Host getHost() {
        return host;
    }

    public void setHost(Host host) {
        this.host = host;
    }

    public String getHousename() {
        return housename;
    }

    public void setHousename(String housename) {
        this.housename = housename;
    }

    public void setHid(int hid) {
        this.hid = hid;
    }

    @Override
    public String toString() {
        return "House{" +
                "hid=" + hid +
                ", housename='" + housename + '\'' +
                ", host=" + host +
                '}';
    }
}

然后写出对应的Mapper接口:

HouseMapper:

package maper;

import ouc.Host;
import ouc.House;

import java.util.List;

public interface HouseMapper {

    /**
     * 插入
     * @param house
     */
    public void insertHouse(House house) throws Exception;

    /**
     * 找到所有房子
     * @return
     *
     */
    public List<House> findAll() throws Exception;


    /**
     * 查找房
     * @param hid
     * @return
     */
    public House findHouseByHid(int hid) throws Exception;

}

HostMapper:

package maper;

import ouc.Host;

public interface HostMapper {

    /**
     * 插入
     */
    public void insert(Host host) throws Exception;

    /**
     * 查找
     * @param mid
     */
    public void findByMid(int mid) throws Exception;

    /**
     * 删除
     * @param mid
     */
    public void delete(int mid) throws Exception;

    public Host findHostByHid(int hid) throws Exception;

}

接下去是映射配置文件:

HouseMapper.xml

扫描二维码关注公众号,回复: 1931037 查看本文章
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="maper.HouseMapper">
    <!--  方式一:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型-->
    <resultMap id="house" type="ouc.House">
        <id property="hid" column="hid" javaType="int"/>
        <result property="housename" column="housename" javaType="String"/>
        <association property="host" column="mid" select="maper.HostMapper.findHostByMid"/>
    </resultMap>

    <select id="findHouseByHid" resultType="ouc.House">
        select * from t_house where hid=#{hid}
    </select>
    <!--  方式二:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
                 封装联表查询的数据(去除重复的数据)-->
    <resultMap id="house1" type="ouc.House">
        <id property="hid" column="hid" javaType="int"/>
        <result property="housename" column="housename" javaType="String"/>
        <association property="host" javaType="ouc.Host">
            <id property="mid" column="mid" />
            <result property="name" column="name" />
        </association>
    </resultMap>

    <select id ="findHouseByHid1" resultMap="house1">
        SELECT * from t_house he,t_host ht where he.hid = ht.hid and he.hid=#{hid}
    </select>
  
</mapper>

HostMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="maper.HostMapper">
    <resultMap id="hostMap" type="ouc.Host">
        <id property="mid" column="mid" javaType="int"/>
        <result property="name" column="name" javaType="String"/>
        <association property="house" column="hid" select="maper.HouseMapper.findHouseByHid"/>
    </resultMap>

    <select id="findHostByMid" resultType="ouc.Host">
        select * from t_host where mid=#{mid}
    </select>

    <insert id="insert">
        insert INTO t_host values(#{mid},#{name},#{house.hid})
    </insert>
</mapper>

因为在mybatis.cfg.xml下已经设置了自动扫描方式,所以就不去一一设置了。

工具类也不再具体说明,与上篇文章一样。

最后是测试类:

package Test;

import Tools.DBtools;
import maper.*;
import org.apache.ibatis.session.SqlSession;
import ouc.*;
import ouc.Class;

public class test {

    public static void main(String agrs[]){
          SqlSession sqlSession = DBtools.getSession();
          HouseMapper hMaper = sqlSession.getMapper(HouseMapper.class);
          HostMapper hostMapper = sqlSession.getMapper(HostMapper.class);

        try {
            House house = hMaper.findHouseByHid1(5);
            System.out.print(house);
            sqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
        }
    }
}

结果测试成功。

(二) 一对多关系

以班级和学生为例,这里一个班级对应多个学生。

持久类:

学生:

package ouc;

public class Student {
    private int sid;
    private String sname;
    private Class clazz;

    public String getSname() {
        return sname;
    }

    public Student(){

    }

    public Class getClazz() {
        return clazz;
    }

    public void setClazz(Class clazz) {
        this.clazz = clazz;
    }

    public Student(int sid, String sname, Class clazz) {
        super();
        this.sid = sid;
        this.sname =sname;
        this.clazz = clazz;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }
    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", clazz=" + clazz +
                '}';
    }
}

班级:

package ouc;

import java.util.List;

public class Class {
    private int cid;
    private String cname;
    private List<Student> students;

    public String getCname() {
        return cname;
    }

    public List<Student> getStudents() {
        return students;
    }

    public Class(){

    }

    public Class(int cid,String cname,List<Student> students) {
        super();
        this.cid = cid;
        this.cname = cname;
        this.students = students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public int getCid() {
        return cid;
    }

    public void setCid(int cid) {
        this.cid = cid;
    }

    @Override
    public String toString() {
        return "Class{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                ", students=" + students +
                '}';
    }
}

同样,写出Mapper接口

package maper;

import ouc.Student;

import java.util.List;

public interface StudentMaper {

    public void insertStudent(Student student) throws Exception;

    public Student findStudent(int sid) throws Exception;

    public List<Student> findStudentsByCid(int cid) throws Exception;
}
package maper;

import ouc.Class;

public interface ClassMaper {

    public void insertClass(Class clazz) throws Exception;

    public Class findClass(int id) throws Exception;
}
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 不要忘记namespace!!!! -->
<mapper namespace="maper.ClassMaper">
    <resultMap id="classAndStudentMap" type="Class">
        <id property="cid" column="cid" javaType="int"/>
        <result property="cname" column="cname" javaType="String"/>
        <!--  ????  -->
        <!-- column项 为CID!!! -->
        <collection property="students" column="cid" select="maper.StudentMaper.findStudentsByCid"/>
    </resultMap>
    <insert id="insertClass" useGeneratedKeys="true" keyProperty="cid">
        insert into class values(#{cid},#{cname})
    </insert>
    <select id="findClass" parameterType="int" resultMap="classAndStudentMap">
        select * from class where cid=#{cid}
    </select>
</mapper>


猜你喜欢

转载自blog.csdn.net/lpckr94/article/details/79698109