java mybtis关联查询,7.MyBatis 关联查询(一对一)

本文详细介绍了如何在Mybatis中处理一对一关联查询,通过实例讲解了三种方法:扩展resultType、resultMap嵌套查询和嵌套结果。重点展示了如何在OrdersMapper中使用resultMap和domain类,以及相应的SQL语句和测试代码。
摘要由CSDN通过智能技术生成

1 关联查询映射

1.1 分析数据模型

思路 :每张表记录的数据内容

每张表重要的字段(主键,外键,非空字段)

表与表之间的关系(外键关系)

表与表之间的业务关系(建立在某个业务意义基础上去分析)

如图:c6aad13f1513730fde0d5d7d2b9dc2c5.png

1.2 一对一查询

有三种实现方法:

resultType

resultMap中的association嵌套查询

resultMap中的嵌套结果

需求:

进行订单查询,包括用户的姓名和地址信息

SQL语句:

SELECT

orders.id,orders.user_id,orders.number,orders.createtime,orders.note,user.username,user.address

FROM

orders, user

WHERE

orders.user_id = user.id;

方法一:resultType

复杂查询时,单表对应的domain类已不能满足输出结果集的映射。

所以要根据需求建立一个扩展类来作为resultType的类型。

创建domain类(OrdersExt.java):package cn.mybatis.mapper.domain;

/**

* 使用此类来映射订单和用户的查询结果,此类继承订单,所以是扩展的

* @author 刘泽栋

* @date 2015年6月21日 下午10:08:57

*/

public class OrdersExt extends Orders {

/**

* 添加用户的属性

*/

private String username;

private String sex;

private String address;

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}

编写mapper接口(OrdersMapper.java)

public interface OrdersMapper {

// 进行订单查询,包括用户的姓名和地址信息

public List findOrders();

}

编写映射文件(OrdersMapper.xml)<?xml version="1.0" encoding="UTF-8" ?>

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

orders.id,

orders.user_id,

orders.number,

orders.createtime,

orders.note

user.username,

user.address

SELECT

,

FROM orders, user

WHERE orders.user_id = user.id

加载配置文件(sqlMapConfig.xml)

编写测试代码(OrdersMapperTest.java)package cn.mybatis.mapper.mapper;

import java.io.InputStream;

import java.util.List;

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.Before;

import org.junit.Test;

import cn.mybatis.mapper.domain.OrdersExt;

/**

* 测试mybatis的关联映射

* @author 刘泽栋

* @date 2015年6月21日 下午10:57:23

*/

public class OrdersMapperTest {

private SqlSessionFactory sqlSessionFactory;

@Before

public void setUp() throws Exception {

String resource = "sqlMapConfig.xml";

InputStream inputStream = Resources.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

}

/**

* 测试,进行订单查询,包括用户的姓名和地址信息

*/

@Test

public void testFindOrders() {

SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);

// 测试

List list = ordersMapper.findOrders();

System.out.println(list);

sqlSession.close();

}

}

方法二:resultMap的association嵌套查询

修改SQL:

SELECT orders.id,orders.user_id,orders.number,orders.createtime,orders.note FROM orders;

修改domain类(OrdersExt.java):package cn.mybatis.mapper.domain;

/**

* 使用此类来映射订单和用户的查询结果,此类继承订单,所以是扩展的

* @author 刘泽栋

* @date 2015年6月21日 下午10:08:57

*/

public class OrdersExt extends Orders {

/**

* 添加用户的属性

*/

private String username;

private String sex;

private String address;

// 用户信息

private User user;

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

@Override

public String toString() {

return "OrdersExt [username=" + username + ", sex=" + sex

+ ", address=" + address + "]";

}

}

编写mapper接口(OrdersMapper.java):// 进行订单查询,包括用户的姓名和地址信息(resultMap的嵌套查询)

public List findOrdersResultMapOfSelect();

编写映射文件(OrdersMapper.xml)

SELECT

FROM orders

加载配置文件(sqlMapConfig.xml)

编写测试代码(OrdersMapperTest.java)

/**

* 进行订单查询,包括用户的姓名和地址信息(resultMap的嵌套查询)

*/

@Test

public void testFindOrdersResultMapOfSelect() {

SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);

// 测试

List list = ordersMapper.findOrdersResultMapOfSelect();

System.out.println(list);

sqlSession.close();

}

方法三:resultMap的association嵌套结果

SQL语句:

SELECT

orders.id,orders.user_id,orders.number,orders.createtime,orders.note,user.username,user.address

FROM

orders, user

WHERE

orders.user_id = user.id;

编写mapper接口(OrdersMapper.java):// 进行订单信息查询,包括用户的名称和地址信息(resultMap之嵌套结果)

public List findOrdersResultMap();

编写映射文件(OrdersMapper.xml)

SELECT

,

FROM orders, user

WHERE orders.user_id = user.id

加载配置文件(sqlMapConfig.xml)

编写测试代码(OrdersMapperTest.java)

/**

* 进行订单信息查询,包括用户的名称和地址信息(resultMap之嵌套结果)

*/

@Test

public void testFindOrdersResultMap() {

SqlSession sqlSession = sqlSessionFactory.openSession();

OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);

// 测试

List list = ordersMapper.findOrdersResultMap();

System.out.println(list);

sqlSession.close();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值