mybatis学习笔记6:多表查询

这篇博客详细介绍了MyBatis中如何进行多表查询,包括一对多、多对一的关系处理,以及多对多的查询实现。通过具体的SQL语句分析、实体类和映射配置的创建,展示了如何在用户和账户、用户和角色等场景下进行数据的联合查询。
摘要由CSDN通过智能技术生成

一、表之间的几种关系

  • 一对多
  • 多对一
  • 一对一
  • 多对多

1.示例

  • 用户和订单就是一对多
  • 订单和用户就是多对一
    • 一个用户可以下多个订单
    • 多个订单属于同一个用户
  • 人和身份证号就是一对一
    • 一个人只能有一个身份证号
    • 一个身份证号只对应一个人
  • 老师和学生就是多对多
    • 一个学生可以有多个老师
    • 一个老师也可以有多个学生

2.特例

  • 如果针对于一个具体的订单,它只能属于一个具体的用户
  • 所以mybatis多对一看成了一对一

二、mybatis中的多表查询(多对一/一对一)

1.示例:用户和账户

比如,一个人可以在同一家银行拥有多张银行卡账户

  • 一个用户可以拥有多个账户
  • 一个账户只能属于一个用户(多个账户也可以属于同一个用户)

2.步骤:

1.建立两张表:用户表,账户表

  • 让用户表和账户表具有一对多的关系,账户表需要添加外键
  • 按如下sql语句建立accout表和插入一些数据

DROP TABLE IF EXISTS `account`;

CREATE TABLE `account` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `UID` int(11) default NULL COMMENT '用户编号',
  `MONEY` double default NULL COMMENT '金额',
  PRIMARY KEY  (`ID`),
  KEY `FK_Reference_8` (`UID`),
  CONSTRAINT `FK_Reference_8` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert  into `account`(`ID`,`UID`,`MONEY`) values (1,46,1000),(2,43,1000),(3,46,2000);
  • 效果:
    在这里插入图片描述

2.建立两个实体类:用户实体类和账户类实体类

让用户和账户的实体类能体现出来一对多的关系
实体类的属性名严格对应表中的字段名,提供gettersetter以及重写toString方法

  • User
    在这里插入图片描述
  • Account
    在这里插入图片描述
  • 分别定义相关的接口和方法
public interface IUserDao {
   
    
    public List<User> findAll();
    
    public User findById(Integer id);

}
public interface IAccountDao {
   
    /**
     * 查询所有
     * @return
     */
    public List<Account> findAll();
}

3.新建上述接口和实体类对应的映射配置文件

  • IUserDao.xml
    在这里插入图片描述
  • IAccountDao.xml
    在这里插入图片描述- Account方法测试类
public class AccountTest {
   
    private InputStream in;
    private SqlSession session;
    private IAccountDao accountDao;

    @Before //添加注解才能在其他测试方法执行之前执行
    public void init() throws Exception{
   
        //1.读取配置文件
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3. 创建SqlSession
        session = factory.openSession(true);
        //4.创建代理对象
        accountDao = session.getMapper(IAccountDao.class);
    }
    @After
    public void destroy() throws Exception{
   
        //1。提交事务
//        session.commit();
        //2.关闭资源
        session.close();
        in.close();
    }
    @Test
    public void testFindAll(){
   
        //5.执行查询
        List<Account> accounts = accountDao.findAll();
        //6.打印
        for (Account account : accounts) {
   
            System.out.println(account);
        }
    }
}
  • 执行查询所有的测试
    在这里插入图片描述

  • 上述的步骤只是完成了两个单表的分别查询操作,还不是我们最终的目标

4.目标查询效果的sql语句分析

我们的目标是,查询出account的同时,显示每一条account的所属的用户信息

4.1sql语句

为了实现上述的语句,我们先思考sql语句怎么写

  • 方式1

    SELECT * FROM account a, USER u WHERE a.`UID`
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值