五、多(一)对一和一对多查询

2023-11-03

1、查询所有账户,同时查询出账户所属的用户,包含用户的用户名和地址信息

实体类

public class User implements Serializable {

    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}
public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}
public class AccountUser extends Account {

    private String username;
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return super.toString()+", AccountUser{" +
                "username='" + username + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
public interface IAccountDao {
    /**
     * 查询所有账户,并且带有用户名称和地址信息
     */
    List<AccountUser> findAllAccount();
}
<?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="com.liaoxiang.dao.IAccountDao">
    <!--查询所有账户同时包含用户名和地址信息-->
    <select id="findAllAccount" resultType="accountUser">
        select a.*,u.username,u.address from account a , user u where u.id = a.uid;
    </select>
</mapper>
public class AccountTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IAccountDao accountDao;

    @Before//用于在测试方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件,生成字节输入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.获取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession对象
        sqlSession = factory.openSession(true);
        //4.获取dao的代理对象
        accountDao = sqlSession.getMapper(IAccountDao.class);
    }
    @After//用于在测试方法执行之后执行
    public void destroy()throws Exception{
        //提交事务
        // sqlSession.commit();
        //6.释放资源
        sqlSession.close();
        in.close();
    }
    /**
     * 测试查询所有account,同时包含用户名称和地址
     */
    @Test
    public void testFindAllAccountUser(){
        List<AccountUser> aus = accountDao.findAllAccount();
        for(AccountUser au : aus){
            System.out.println(au);
        }
    }
}
Account{id=1, uid=46, money=1000.0}, AccountUser{username='老王', address='北京'}
Account{id=2, uid=45, money=1000.0}, AccountUser{username='李四', address='广州'}
Account{id=3, uid=46, money=2000.0}, AccountUser{username='老王', address='北京'}

2、多对一查询更常用的方式

多对一(一对一)时实体类

public class Account implements Serializable {
    private Integer id;
    private Integer uid;
    private Double money;
    // 从表实体应该包含一个主表实体的对象引用,一个Account对应一个User
    private User user;

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}
<?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="com.liaoxiang.dao.IAccountDao">

    <!-- 定义封装account和user的resultMap -->
    <resultMap id="accountUserMap" type="account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!-- 多对一的关系映射:配置封装user的内容-->
        <association property="user" column="uid" javaType="user">
            <id property="id" column="id"></id>
            <result column="username" property="username"></result>
            <result column="address" property="address"></result>
            <result column="sex" property="sex"></result>
            <result column="birthday" property="birthday"></result>
        </association>
    </resultMap>

    <!-- 查询所有 -->
    <select id="findAll" resultMap="accountUserMap">
        select u.*,a.id as aid,a.uid,a.money from account a , user u where u.id = a.uid;
    </select>
</mapper>

测试类

@Test
public void testFindAllAccount(){
    List<Account> accounts = accountDao.findAll();
    for(Account account : accounts){
        System.out.println("--------------------");
        System.out.println("账户信息:" + account);
        System.out.println("用户信息:" + account.getUser());
    }
}
账户信息:Account{id=1, uid=46, money=1000.0}
用户信息:User{id=46, username='老王', address='北京', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018}
--------------------
账户信息:Account{id=2, uid=45, money=1000.0}
用户信息:User{id=45, username='李四', address='广州', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018}
--------------------
账户信息:Account{id=3, uid=46, money=2000.0}
用户信息:User{id=46, username='老王', address='北京', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018}

3、一对多查询

一对多时实体类,查询所有用户同时获取每个用户下的所有账户信息

public class User implements Serializable {

    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;
    //一对多关系映射:主表实体应该包含从表实体的集合引用,一个User对应多个account
    private List<Account> accounts;
   
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}
<?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="com.liaoxiang.dao.IUserDao">

    <!-- 定义User的resultMap-->
    <resultMap id="userAccountMap" type="user">
        <id property="id" column="id"></id>
        <result property="username" column="username"></result>
        <result property="address" column="address"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <!-- 配置user对象中accounts集合的映射 -->
        <collection property="accounts" ofType="account">
            <id column="aid" property="id"></id>
            <result column="uid" property="uid"></result>
            <result column="money" property="money"></result>
        </collection>
    </resultMap>
    <!-- 查询所有 -->
    <select id="findAll" resultMap="userAccountMap">
        SELECT u.*,a.id aid,a.uid,a.money FROM USER u LEFT OUTER JOIN account a ON u.id = a.uid
    </select>
</mapper>

测试类:

@Test
public void testFindAll(){
    List<User> users = userDao.findAll();
    for(User user : users){
        System.out.println("用户信息:"+user);
        System.out.println("账户信息:"+user.getAccounts());
        System.out.println("-----------------------");
    }
}
用户信息:User{id=41, username='张三', address='绵阳', sex='男', birthday=Tue Feb 27 17:47:08 CST 2018}
账户信息:[]
-----------------------
用户信息:User{id=45, username='李四', address='广州', sex='男', birthday=Sun Mar 04 12:04:06 CST 2018}
账户信息:[Account{id=2, uid=45, money=1000.0}]
-----------------------
用户信息:User{id=46, username='老王', address='北京', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018}
账户信息:[Account{id=1, uid=46, money=1000.0}, Account{id=3, uid=46, money=2000.0}]
-----------------------
用户信息:User{id=49, username='王五', address='西藏', sex='女', birthday=Mon Jun 03 16:40:00 CST 2019}
账户信息:[]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

五、多(一)对一和一对多查询 的相关文章

  • Java jdk1.5 新特性讲解

    JDK1 5 可以说是java 最经典的一个版本了 在 jdk1 5 发布时 就因他的改动大 而命令为jdl5 0 为后来 java 的壮大立下了汗马之劳 有网友在面试的时候被问到 jdk新特性 我这里索性就从 jdk1 5的特性说到1 8
  • Android产品研发(十四)-->App升级与更新

    转载请标明出处 一片枫叶的专栏 上一篇文章中我们讲解了Android app中的轮询操作 讲解的内容主要包括 我们在App中使用轮询操作的情景 作用以及实现方式等 一般而言我们使用轮询操作都是通过定时任务的形式请求服务器并更新用户界面 轮询
  • 《2020王道》

    绪论 数据结构基本概念 数据 数据是信息的载体 是描述客观事物属性的数 字符以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合 数据元素 数据元素是数据的基本单位 通常作为一个整体进行考虑和处理 一个数据元素可有若干个数据项组成
  • 项目中的外包团队如何管理

    在复杂的项目工作中 对外采购产品 服务变得越来越普遍 这种基于合同的跨组织合作方式 确实给项目的管理工作带来了更大的挑战 项目经理在管理好自己团队的同时 应该怎样做好针对外包团队的监督与控制工作呢 01 工作外包不等于甩包袱 首先需要明确的
  • QLabel中设置背景图片的4种方法

    1 图片不重复 可设置缩放比例 不可动态缩放 find package Qt QT VERSION MAJOR COMPONENTS Svg REQUIRED Qt QT VERSION MAJOR Svg include
  • 18、计算机图形学——BRDF与渲染方程

    一 BRDF Bidirectional Reflectance Distribution Function 双向反射分布函数 基于https blog csdn net Master Cui article details 1197877
  • 文件上传漏洞攻击与防范方法

    01 文件上传漏洞简介 文件上传漏洞是web安全中经常用到的一种漏洞形式 是对数据与代码分离原则的一种攻击 上传漏洞顾名思义 就是攻击者上传了一个可执行文件如木马 病毒 恶意脚本 WebShell等到服务器执行 并最终获得网站控制权限的高危
  • python接口自动化测试 ( 第一章 )

    python接口自动化测试 第一章 接口自动化测试实战 这是一个从0到1的过程 一步一步搭建的测试接口框架 本教程从开始写框架的思路 和实现过程深入解析 并且深入到了每个相关的的各个细节 不论你是刚入门的菜鸟 还是一个懂编码经验的工程师 相
  • OpenVX嵌入式图像处理(一)硬件平台及软件介绍

    图像处理这几年可谓是大红大紫了一番 尤其是OpenCV的出现让很多之前只有研究者才能使用的算法变成了小白装个库调用个函数就可以解决的问题 但是实时性一直以来都是一个非常头疼的问题 尤其是在嵌入式平台上进行图像处理的门槛一直以来都没有降低 今
  • 关于安装PotPlayer64出现PotPlayer 64 bit need right Try agin的问题

    首先官网下载 官网地址 http www potplayer org 根据自己的操作系统位数随便下载一个 进行安装 出现问题 没用admin权限 这时候你需要进行的操作是把当前窗口关闭 然后选中软件 右键选择以管理员身份运行 切记是以管理员
  • STM32学习笔记(4) 高级定时器-两路互补的PWM输出(带死区和刹车控制)

    目录 1 实验目的 2 实验效果 3 理论部分 3 1时钟源 3 2时基单元 3 3输入捕获 4 程序流程 4 1GPIO初始化结构体 4 2时基初始化结构体 4 3输出比较结构体 4 4刹车和死区结构体的初始化 5 程序源码 1 实验目的
  • roblox虚拟世界怎么做服务器,roblox虚拟世界

    游戏简介 roblox虚拟世界是一款像素风格模拟经营游戏 游戏采用简约的画面风格设定 超大的世界地图可以自由的探索 还可以收集丰富的物品资源进行创造 定制一个专属的秩序 游戏特色 1 游戏采用高清品质的画面 大家开自由的畅玩 2 随时随地一
  • 单片机蓝桥杯--数码管显示

    我们先来看一下蓝桥杯板中数码管部分的电路图 对于动态数码管的控制 是需要有段选和位选的 位选是控制数码管哪一位显示 段选是控制该位显示什么数字 由上图可知 当Y6C有效时 P0控制的是数码管的位 当Y7C有效时 可以给P0写入显示数字的断码
  • RedHat Enterprise下如何配置KVM虚拟机的网络网桥

    RedHat Enterprise下如何配置KVM虚拟机的网络网桥 一 网桥的相关创建命令 1 创建网桥设备 brctl addbr
  • 【Github】目标检测组会内容分享

    组会的内容展示为PPT PDF的形式 讲解目标检测领域比较重要的论文 比如R CNN SPP Net等经典论文 资料已经打包好上传到我的github仓库 仓库地址为 https github com biluko Object detect
  • Java后端内部面试题(前一部分)

    面试题 基础篇 1 Java 语言有哪些特点 1 简单易学 有丰富的类库 2 面向对象 Java 最重要的特性 让程序耦合度更低 内聚性更高 2 面向对象和面向过程的区别 面向过程 是分析解决问题的步骤 然后用函数把这些步骤一步一步地实现
  • python 遇到表情代码出错, 用正则表达式去掉表情代码

    gt gt gt aa U0001f60a adwkdkdkkdk 这里 U0001f60a 这是表情的代码 带这个 gt gt gt import re gt gt gt cc re compile r U0001f60a cc 就是需要
  • 小程序授权登录最新解决方案

    小程序授权登录最新解决方案 一 在WXML中设置单击事件 也可以直接放在第一个页面的ONLOAND函数中 用户进入小程序后自动弹出 二 在JS中设置Button的触发代码 三 演示 一 在WXML中设置单击事件 也可以直接放在第一个页面的O

随机推荐