Mybatis 一对多 映射

mybatis 一对多 , 就是说一个寝室可以对应很多个人住在里面

那么寝室和人之间就形成了一对多的关系

 在XML一对多配置有两种 ,

  1. 嵌套查询 , 优点在于关系明朗 , 缺点就是需要查询几次数据库

  2. 直接将数据一次性查询出来 , 利用xml进行数据匹配 ,优点在于只需要查询一次数据 , 缺点就是结构不明确

在这里就直接使用第二种了

数据库为Mysql5.5

先创建两个表

寝室(Dorm)
-- 寝室表
CREATE TABLE Dorm(
    dno INT(10) PRIMARY KEY AUTO_INCREMENT , 
    DNAME VARCHAR(20)
)

人(DormPerson)

-- 寝室内的人
CREATE TABLE DORMPERSON(
    DPNO INT(10) PRIMARY KEY AUTO_INCREMENT ,
    DPNAME VARCHAR(20)  ,
    DNO INT(10) REFERENCES DORM(DNO)
    
)

插入数据

-- 添加寝室
INSERT INTO DorM(DNAME) VALUE('101') , ('102') , ('103');
-- 添加人
INSERT INTO DORMPERSON(DPNAME , DNO) VALUE('A1' , 1) , ('A2' , 1) , ('A3' , 1) ,('B1' , 2) , ('B2' , 2) , ('B3' , 2) , ('C1' , 3) , ('C2' , 3) , ('C3' , 3);

Java 操作

首先为表建立实体类对应绑定

Dorm实体
package cn.hong.bean;

import java.util.List;


public class Dorm {
    private Integer dno;
    
    private String dname;
    
    private List<DormPerson> dplist;

    public Integer getDno() {
        return dno;
    }

    public void setDno(Integer dno) {
        this.dno = dno;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public List<DormPerson> getDplist() {
        return dplist;
    }

    public void setDplist(List<DormPerson> dplist) {
        this.dplist = dplist;
    }

    @Override
    public String toString() {
        return "Dorm [dno=" + dno + ", dname=" + dname + ",dplist=" + dplist + "]";
    }
    
}

DormPerson实体

package cn.hong.bean;

public class DormPerson {
    
    private Integer dpno;
    
    private String dpname;
    
    private Integer dno;
    
    public Integer getDpno() {
        return dpno;
    }

    public void setDpno(Integer dpno) {
        this.dpno = dpno;
    }

    public String getDpname() {
        return dpname;
    }

    public void setDpname(String dpname) {
        this.dpname = dpname;
    }

    public Integer getDno() {
        return dno;
    }

    public void setDno(Integer dno) {
        this.dno = dno;
    }

    public String toString() {
        return "DormPerson [dpno=" + dpno + ", dpname=" + dpname + ", dno=" + dno + "]";
    }
    
}

建立一个对Dorm进行操作的接口

package cn.hong.mapper;

import cn.hong.bean.Dorm;

public interface DormMapper {
    
    /**
     * @category 查找Dorm数据
     * @return
     */
    public Dorm find(Integer _parameter);
}

建立一个与DormMapper接口对应的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义dtd文件 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 接口操作与数据操作绑定 -->
<mapper namespace="cn.hong.mapper.DormMapper">
    <resultMap type="cn.hong.bean.Dorm" id="dormMap">
        <id property="dno" column="dno" javaType="Integer" />
        <result property="dname" column="dname" javaType="String" />
        <collection property="dplist" javaType="java.util.ArrayList" ofType="cn.hong.bean.DormPerson">
            <id property="dpno" column="dpno" javaType="Integer"/>
            <result property="dpname" column="dpname" javaType="String"/>
            <result property="dno" column="dno" javaType="Integer"/>
        </collection>
    </resultMap>

    <select id="find" resultMap="dormMap">
        SELECT d.dno , d.dname , dp.dpno , dp.dpname ,dp.dno FROM DORMPERSON dp
            INNER JOIN dorm d
                ON dp.DNO = d.dno
                    <where>
                        <if test="_parameter != 0">
                            and d.dno=#{_parameter};
                        </if>
                    </where>
    </select>
</mapper>

测试类

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import cn.hong.bean.Dorm;
import cn.hong.mapper.DormMapper;
public class DormTest {
    
    @Test
    public void Test() throws IOException {
        String resource = "mybatis.conn.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        SqlSessionFactory ssf =new SqlSessionFactoryBuilder().build(in);
        SqlSession ss = ssf.openSession();
        
        DormMapper dm = ss.getMapper(DormMapper.class);
        Dorm d = dm.find(3);
        
        System.out.println(d.toString());
    }
}

注意:当你接口中方法的参数为Integer类型的时候不能直接在xml文件中进行判断,如果你想要拿Integer类型参数进行判断的时候有以下两种方法可以实现

  1.将select语句中参数名改为_parameter

  2.不改变SQL语句 , 在参数前调价 @Param(value="xxx")

如果不按照以上方式处理的话就会报 There is no getter for property named 'xxx' in 'class java.lang.Integer'

猜你喜欢

转载自www.cnblogs.com/loveYahong/p/mybatisOneToN.html