MyBatis学习(五)——多表查询之一对一关系

简介: MyBatis学习(五)——多表查询之一对一关系

MyBatis的多表查询


一对一关系的实现


用例:人和它所住的地址是一对一关系,即一个人只能有一个地址。


第一步:在数据库新建两个表,第一个是address表


CREATE TABLE address (
  id BIGINT(32) NOT NULL,
  NAME VARCHAR(35) DEFAULT NULL,
  PRIMARY KEY (id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

表中数据为:


20191021002335692.png


第二个是Person表

CREATE TABLE Person (
  id BIGINT(32) NOT NULL AUTO_INCREMENT, -- 人的id
  NAME VARCHAR(25) DEFAULT NULL, -- 人的姓名
  sex VARCHAR(4) DEFAULT NULL, -- 人的性别
  address_id BIGINT(32) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY FK_address_id (address_id),
  CONSTRAINT FK_address_id FOREIGN KEY (address_id)
  REFERENCES address (id)
)ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 

表中数据为:

20191021002249982.png

由于两个表是一对一的关系,外键在Person表中添加

第二步:建立实体类:

Address.java

package cn.zhongger.domain;
import java.io.Serializable;
/**
 * 用户地址实体
 */
public class Address implements Serializable {
    private Integer id;
    private String name;
    public Address(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    public Address() {
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

Person.java

package cn.zhongger.domain;
import java.io.Serializable;
/**
 * 用户实体
 */
public class Person implements Serializable {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private Address address;//人和地址一一对应,即每个人只有一个地址
    public Person() {
    }
    public Person(Integer id, String name, String sex, Integer age, Address address) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

**第三步:**创建对应的DAO接口

IAddressDao.java

package cn.zhongger.dao;
import cn.zhongger.domain.Address;
public interface IAddressDao {
    /**
     * 根据id查找用户地址
     * @param id
     * @return
     */
    Address findByid(Integer id);
}

IPersonDao.java

package cn.zhongger.dao;
import cn.zhongger.domain.Person;
public interface IPersonDao {
    /**
     * 根据id查找用户
     * @param id
     * @return
     */
    Person findById(Integer id);
}


第四步:编写映射文件

AddressMap.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="cn.zhongger.dao.IAddressDao">
    <select id="findByid" parameterType="java.lang.Integer" resultType="cn.zhongger.domain.Address">
        select * from address where id=#{id}
    </select>
</mapper>

PersonMap.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="cn.zhongger.dao.IPersonDao">
    <resultMap id="PersonMap" type="cn.zhongger.domain.Person">
        <id property="id" column="id"></id>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <association property="address" column="address_id" select="cn.zhongger.dao.IAddressDao.findByid"
                     javaType="cn.zhongger.domain.Address"></association>
    </resultMap>
    <select id="findById" parameterType="java.lang.Integer" resultMap="PersonMap">
        select * from Person where id=#{id}
    </select>
</mapper>

第五步:编写测试代码:

import cn.zhongger.dao.IAddressDao;
import cn.zhongger.dao.IPersonDao;
import cn.zhongger.domain.Address;
import cn.zhongger.domain.Person;
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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
public class testMyBatis {
    private InputStream inputStream;
    private SqlSessionFactoryBuilder sqlSessionFactoryBuilder;
    private SqlSessionFactory sessionFactory;
    private SqlSession sqlSession;
    private IPersonDao mapper1;
    private IAddressDao mapper2;
    @Before
    public void init() throws IOException {
        inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        sessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        sqlSession = sessionFactory.openSession();
        mapper1 = sqlSession.getMapper(IPersonDao.class);
        mapper2 = sqlSession.getMapper(IAddressDao.class);
    }
    @After
    public void destroy() throws IOException {
        sqlSession.commit();
        sqlSession.close();
        inputStream.close();
    }
    @Test
    public void testfindById1(){
        Person person1 = mapper1.findById(1);
        Person person2 = mapper1.findById(2);
        Person person3 = mapper1.findById(3);
        Person person4 = mapper1.findById(4);
        System.out.println(person1);
        System.out.println(person2);
        System.out.println(person3);
        System.out.println(person4);
    }
    @Test
    public void testfindById2(){
        Address address1 = mapper2.findByid(1);
        Address address2 = mapper2.findByid(2);
        Address address3= mapper2.findByid(3);
        Address address4= mapper2.findByid(4);
        System.out.println(address1);
        System.out.println(address2);
        System.out.println(address3);
        System.out.println(address4);
    }
}

输出结果如下:


2019102100244487.png


20191021002518849.png


总结:


要在MyBatis中实现一对一的多表查询,最重要的是SQL语句外键的设置和对应的DAO接口的映射文件的配置中的< association >属性

相关文章
|
6月前
|
Java 数据库连接 数据库
MyBatis之多表查询
MyBatis之多表查询
|
1月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
64 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
46 5
|
3月前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
3月前
|
Java 数据库连接 mybatis
后端框架的学习----mybatis框架(9、多对一处理和一对多处理)
这篇文章介绍了在MyBatis框架中如何处理多对一和一对多的关联查询,通过定义`<resultMap>`和使用`<association>`与`<collection>`元素来实现对象间的关联映射。
|
3月前
|
Java 数据库连接 测试技术
后端框架的学习----mybatis框架(8、lombok)
这篇文章介绍了如何在MyBatis框架中使用lombok库来简化Java实体类的编写,包括在IDEA中安装Lombok插件、在项目中导入lombok依赖以及在实体类上使用Lombok提供的注解。
|
3月前
|
Java 数据库连接 数据库
后端框架的学习----mybatis框架(6、日志)
这篇文章介绍了如何在MyBatis框架中使用日志功能,包括配置MyBatis的日志实现、使用log4j作为日志工具,以及如何通过配置文件控制日志级别和输出格式。
|
3月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
3月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
6月前
|
XML Java 数据库连接
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
【MyBatis】1、MyBatis 核心配置文件、多表查询、实体映射文件 ......
137 0