MyBatis(4)实现表一对一查询

目录

1、方法一(使用SQL语句连接查询)

1、数据库中的表(两表的链接关系:dept_id=id)

2、创建实体类

3、接口中定义方法

4、在xml中实现SQL查询

5、建立测试查询

6、查询结果

2、方法二(在xml中建立映射查询)

1、数据库中的表

2、建立实体类

1、建立表dept对应的实体类

2、建立表empt对应的实体类

3、在接口中定义方法

4、在emp这个接口对应的xml,(即在3中定义方法的那个接口)写出相应SQL(最好先看第5不,在返回来看4好点)

5、在接口dept对应的xml中编写SQL查询,此SQL查询不需要在接口中有实现方法

6、写测试方法

7、结果(截取部分)


特别注意:一定要把xml和接口相匹配,即一个xml的SQL方法只能对应其命名空间指定的接口,切不可弄混(血与泪的教训)

1、方法一(使用SQL语句连接查询)

ps:这种方式理解起来超级简单(简单),下面直接写例子:

1、数据库中的表(两表的链接关系:dept_id=id)

1、empt表

2、dept表

2、创建实体类

ps:这个实体类要包含两个表中的所有字段信息,这样才能存储查询出来的信息(id为重复字段,写一个即可)

(@Getter @Setter @ToString 分别是用注解实现get、set、tostring方法,需要插件lombok)

package com.test.domain;


import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class HaveDeptAndEmp {
    private int id;
    private int jobid;
    private int deptid;
    private String ename;
    private int gender;
    private double salary;
    private double bonus;
    private String joindate;
    private int mgr;
    private String deptname;
    private String loc;
}

3、接口中定义方法

(接口用的是sqlSession代理,自动实现方法,前边以讲过,略)

4、在xml中实现SQL查询

<resultMap id="UseFirst" type="com.test.domain.HaveDeptAndEmp">
        <id column="id" property="id"/>
        <result column="job_id" property="jobid"/>
        <result column="dept_id" property="deptid"/>
        <result column="ename" property="ename"/>
        <result column="gender" property="gender"/>
        <result column="salary" property="salary"/>
        <result column="bonus" property="bonus"/>
        <result column="join_date" property="joindate"/>
        <result column="mgr" property="mgr"/>
        <result column="name" property="deptname"/>
    </resultMap>
    <select id="FirstMethord" resultMap="UseFirst">
        SELECT
	*
FROM
	`emp` e
	LEFT JOIN dept d ON e.dept_id = d.id
    </select>

注:resultMap是建立的是数据库列名和实体类中的属性名的对应,其实只需要建立两个名字不一样的即可(resultMap不介绍)

下面是SQL语句查询

5、建立测试查询

//使用SQL语句实现一对一查询
    @Test
    public void ccc(){
        List<HaveDeptAndEmp> list=mapper.FirstMethord();
        for (HaveDeptAndEmp o:list
             ) {
            System.out.println(o);
        }
    }

6、查询结果

此处截取部分

2、方法二(在xml中建立映射查询)

1、数据库中的表

表仍然为上述两个表

2、建立实体类

1、建立表dept对应的实体类

package com.test.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class dept {
    private int id;
    private String name;
    private String loc;
}

2、建立表empt对应的实体类

注:此处加入了类dept的复合,(下述代码可看出),用以存储查询出来的dept信息

package com.test.domain;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class TestEmpt {
    private int id;
    private int jobid;
    private int deptid;
    private String ename;
    private int gender;
    private double salary;
    private double bonus;
    private String joindate;
    private int mgr;

    private dept dept;

    @Override
    public String toString() {
        return "TestEmpt{" +
                "id=" + id +
                ", jobid=" + jobid +
                ", deptid=" + deptid +
                ", ename='" + ename + '\'' +
                ", gender=" + gender +
                ", salary=" + salary +
                ", bonus=" + bonus +
                ", joindate='" + joindate + '\'' +
                ", mgr=" + mgr +
                ", dept=" + dept +
                '}';
    }
}

3、在接口中定义方法

4、在emp这个接口对应的xml,(即在3中定义方法的那个接口)写出相应SQL(最好先看第5不,在返回来看4好点)

<resultMap id="EmpUseresultmap" type="com.test.domain.TestEmpt">
        <id column="id" property="id"/>
        <result column="job_id" property="jobid"/>
        <result column="dept_id" property="deptid"/>
        <result column="ename" property="ename"/>
        <result column="gender" property="gender"/>
        <result column="salary" property="salary"/>
        <result column="bonus" property="bonus"/>
        <result column="join_date" property="joindate"/>
        <result column="mgr" property="mgr"/>

        <association property="dept" select="com.test.dao.dept.findgetbyid"
                     column="dept_id" javaType="com.test.domain.dept">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="loc" property="loc"/>
        </association>

    </resultMap>

    <select id="selcetempAndDept" resultMap="EmpUseresultmap" >

  select * from emp

    </select>

注:resultMap中的字段不解释,其中的association这个字段中,property这个是TestEmpt中的一个属性,就是那个复合,存dept值的那个

 

select中存的是五中的查询方法:方式是(命名空间.id),字段解析com.test.dao.dept是五中的xml的命名空间,findgetbyid是五中select的自己命名的id名

column是要传入的字段,如果传入多个字段应该是这种形式column="{dept_id=id,ename=name}"

javaType是dept的类型,此处为一个类的对象

后面是一些字段的映射

最下面是SQL语句的执行

5、在接口dept对应的xml中编写SQL查询,此SQL查询不需要在接口中有实现方法

<select id="findgetbyid" resultType="com.test.domain.dept">
        select * from dept
        where id=#{id}
    </select>

注:id=“findgetbyid”是一个自己起的名字,唯一标识,resultType为返回值类型,是一个对象。SQL语句中#{id}是四中所传递

6、写测试方法

 //查询关联信息
    @Test
    public void selcetEmpAndDept() {
        List<TestEmpt> list = mapper.selcetempAndDept();
        for (TestEmpt o : list) {
            System.out.println(o);
        }
    }

7、结果(截取部分)

注:控制台打印的是  属性名=值   的方式,可以看到最后一个复合类对象存的是dept的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值