iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >mybatis多表查询的实现(xml方式)
  • 673
分享到

mybatis多表查询的实现(xml方式)

2024-04-02 19:04:59 673人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言数据库表及关系一对多查询多对一及一对一查询总结前言 表之间的关系有几种:一对多、多对一、 一对一、多对多在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和

前言

表之间的关系有几种:一对多、多对一、 一对一、多对多
在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和用户是多对一关系,但每个账户只对应一个用户。所以在mybatis中,多对一的关系可以看成一对一的关系。
这里我把一对多和多对一的xml配置方式总结了一下,同时还有加载方式。
一对多,多对多:通常情况下我们都是采用延迟加载。
多对一,一对一:通常情况下我们都是采用立即加载。
至于注解方式和多对多查询的xml和注解方式我会另外写博客。

数据库表及关系

我们以用户和账户为例,用户可以有多个账户,账户只能对应一个用户。所以用户对账户是一对多关系,账户对用户是多对一关系。表如下图所示,用户表user,账户表account,账户表UID对应用户表id。

用户表user

账户表account

一对多查询

首先我们要在User实体类中添加List accounts的集合成员变量,表示一对多映射关系,主表实体含有从表实体的集合引用。

public class User implements Serializable{
    private Integer id;
    private String username;
    private String address;
    private String sex;
    private Date birthday;

    //一对多映射关系,主表实体含有从表实体的集合引用
    private List<Account> accounts;

    public List<Account> getAccounts() {
        return accounts;
    }

    public void setAccounts(List<Account> accounts) {
        this.accounts = accounts;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address='" + address + '\'' +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    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;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

同时在User Dao接口中提供查询所有方法findAll,在Account Dao接口中提供根据id查询user的方法findById,以便延时加载时调用。
这里说明因为用户可能对应许多账户,当我们查询用户时可能并不需要账户信息,而且如果我们每次查询用户时都立即查询用户的账户信息,并且账户信息有很多,势必对内存有很大的开销。所以当我们需要账户信息时再调用findById方法去查询用户对应的账户信息。

public interface IUserDao {
    
    List<User> findAll();

    
    User findById(Integer uid);


}
public interface IAccountDao {
    
    List<Account> findAll();

    
    List<Account> findByUid(Integer uid);

}

然后配置userDao.xml,说明会在代码中给出。

<mapper namespace="com.cc.dao.IUserDao">
    <!--定义resultMap-->
    <!--因为在主配置文件中配置了domain包下的所有实体类别名,所以这里封装类型只需要写实体类名即可,不分大小写-->
    <resultMap id="userWithAccount" type="user">
        <!--封装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队形中account集合的映射-->
        <!--定义一对多的关系映射,实现对account的封装,用collection标签
        ofType属性指定内容:要封装的实体对象类型
        select属性指定内容:查询用户的唯一标识
        column属性指定内容:用户根据id查询是所需要的参数
        -->
        <collection property="accounts" ofType="account" column="id" select="com.cc.dao.IAccountDao.findByUid"></collection>
    </resultMap>
    <!--查询所有-->
    <select id="findAll" resultMap="userWithAccount">
        select * from user
    </select>
    <!--根据id查询一个用户-->
    <select id="findById" parameterType="java.lang.Integer" resultType="user">
        select * from user where id=#{uid};
    </select>
</mapper>

当然我们还要在主配置文件中开启延时加载,默认情况下是立即加载。
lazyLoadingEnabled:是否启用延迟加载,mybatis默认为false,不启用延迟加载。lazyLoadingEnabled属性控制全局是否使用延迟加载,特殊关联关系也可以通过嵌套查询中fetchType属性单独配置(fetchType属性值lazy或者eager)。
也就是说我们可以不用在主配置文件中配置而在userDao.xml中配置,这里我们采用全局配置。

<!--配置参数-->
    <settings>
        <!--开启Mybatis支持延时加载-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"></setting>
    </settings>
    <!--配置domain包下所有实体类别名-->
    <typeAliases>
        <!--<typeAlias type="com.cc.domain.User" alias="user"></typeAlias>-->
        <package name="com.cc.domain"></package>
    </typeAliases>

然后我们就可以测试

public class UserTest {
    private InputStream in;
    private sqlSessionFactory factory;
    private SqlSession sqlSession;
    private IUserDao userDao;
    @Before//在测试方法执行之前执行
    public void init() throws IOException {
        //1.读取配置文件,生成字节输入流
         in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.生成SqlSessionFactory
         factory = new SqlSessionFactoryBuilder().build(in);
        //3.获取SqlSession
         sqlSession = factory.openSession();
        //4.获取dao的代理对象
         userDao = sqlSession.getMapper(IUserDao.class);
    }
    @After//在测试方法执行之后执行
    public void destory() throws IOException {
        //提交事务
        sqlSession.commit();
        //关闭资源
        sqlSession.close();
        in.close();
    }

    
    @Test
    public void TestFindAll() {
        //5.执行查询所有方法
        List<User> userList = userDao.findAll();
       for (User user : userList) {
           System.out.println(user);
            System.out.println(user.getAccounts());
        }

    }

}

先把遍历输出部分代码注释掉,测试可以看出我们只查询了用户信息。

在这里插入图片描述

然后去掉注释,发现当我们需要输出用户账户时,他就会去查询用户的账户信息。

在这里插入图片描述

多对一及一对一查询

步骤其实和一对多差不多。
首先我们在account实体类中加入user成员变量表示一对一映射。

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

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUid() {
        return uid;
    }

    public void setUid(Integer uid) {
        this.uid = uid;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", uid=" + uid +
                ", money=" + money +
                '}';
    }
}

Dao接口中需要的的方法在上面总结一对多查询时的图中已经给出。
然后配置accountDao.xml,这里是立即查询,在我们已经配置全局延时加载的情况下,我们需要配置fetchType=“eager”。

<mapper namespace="com.cc.dao.IAccountDao">
    <!--开启account支持二级缓存-->
    <cache/>
    <!--定义封装account和user的resultMap-->
    <resultMap id="accountAndUser" type="account">
        <id property="id" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
        <!--定义一对一的关系映射,实现对user的封装
        select属性指定内容:查询用户的唯一标识
        column属性指定内容:用户根据id查询是所需要的参数
        fetchType属性指定内容:lazy延时加载,eager立即加载。
        -->
        <association property="user" column="uid" javaType="user" select="com.cc.dao.IUserDao.findById" fetchType="eager"></association>
    </resultMap>
    <!--查询所有-->
    <select id="findAll" resultMap="accountAndUser">
        SELECT * from account
    </select>
    <!--根据用户id查询-->
    <select id="findByUid" parameterType="java.lang.Integer" resultType="account" useCache="true">
        select * from account where uid = #{uid}
    </select>
</mapper>

然后我们就可以测试。可以看出当查询账户时就立即查询了对应的用户信息。

在这里插入图片描述

总结

第一尝试博客,肯定有很多欠缺的地方,希望大家看到能评论指出。我自己学mybatis时间也不是很长,这里只给出了简单的案例。如果什么理解不到位的地方也请大家谅解并指出。以后我会更多的写博客,希望能够给一起处在学习阶段的人一些启发。

到此这篇关于mybatis多表查询的实现(xml方式)的文章就介绍到这了,更多相关mybatis多表查询内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: mybatis多表查询的实现(xml方式)

本文链接: https://www.lsjlt.com/news/141214.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mybatis多表查询的实现(xml方式)
    目录前言数据库表及关系一对多查询多对一及一对一查询总结前言 表之间的关系有几种:一对多、多对一、 一对一、多对多在多对一关系中,把多的部分拆成一个一个对象其实就是一对一关系,如账户和...
    99+
    2022-11-13
  • springboot-mybatis/JPA流式查询的多种实现方式
    目录第一种方式: springboot + mybatis 流式查询(网上说的有三种,我觉得下面这种最简单,对业务代码侵入性最小)第二种方式:springboot+JPA 流式查询第...
    99+
    2022-12-19
    springboot-mybatis JPA流式查询 springboot-mybatis流式查询
  • MyBatis-Plus多表联查的实现方法(动态查询和静态查询)
    目录建库建表依赖配置代码测试1.静态查询2.动态查询 1.不传条件2.传条件建库建表 DROP DATABASE IF EXISTS mp; CREATE DATA...
    99+
    2022-11-13
  • MyBatis和jeesite多表查询的方法
    这篇文章主要介绍了MyBatis和jeesite多表查询的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MyBatis和jeesite多表查询的方法文章都会有所收获,下面我们一起来看看吧。有时候经常碰到多级...
    99+
    2023-06-30
  • Mybatis多对一查询的实现方法
    目录架构环境搭建数据库实体类接口Mapper配置文件子查询方法按结果集查询架构 这里从学生的角度来说就是多对一的场景 那么在Java中是怎么样的呢? 环境搭建 数据库 CREATE...
    99+
    2022-11-13
  • 在MyBatis中实现一对多查询和多对一查询的方式详解(各两种方式)
    目录1、多对一1、1环境搭建1、2编写实体类、1、3编写接口方法1、4编写Mapper1、5实现1、6运行结果2、一对多2、1环境搭建和一对多一样2、2编写实体类2、3编写接口的方法...
    99+
    2022-11-13
  • mybatis-plus多表关联查询功能的实现
    学习目标: mybatis-plus多表关联查询 学习内容: mybatis-plus多表关联查询 实体类部分代码 @Data @AllArgsConstructor @NoAr...
    99+
    2022-11-12
  • MyBatis-Plus实现连表查询的方法实例
    目录使用方法安装使用核心类MPJLambdaWrapper和MPJQueryWrapperMPJLambdaWrapper用法MPJQueryWrapper总结mybatis-plu...
    99+
    2022-11-13
  • MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)
    目录MyBatis一对多的xml配置嵌套查询嵌套结果一对多关联查询xml配置写法  情景概述创建表对应 java Pojo查询 客户表client 获取客户名下的附件信息查...
    99+
    2022-11-13
  • mybatis collection 多条件查询的实现方法
    mybatis collection 多条件查询的实现方法 前言: 业务需要通过mybatis 查询返回嵌套集合,嫌多次查询太麻烦,用自带的高级查询解决问题,下边是代码,已测试通过。 说下自己的理解,就是一...
    99+
    2022-10-18
  • MyBatis动态sql查询及多参数查询方式
    目录MyBatis动态sql动态sql处理简单的多参数查询动态sql处理更新功能动态sql扩展动态sql处理集合参数foreach标签处理数组类型参数  &nbs...
    99+
    2022-11-13
    MyBatis sql查询 动态sql查询 多参数查询
  • MyBatis如何实现多表查询(多对一、一对多)
    MyBatis实现多表查询  一、多对一查询 数据库的准备 创建两张表,一张老师表,一张学生表 将老师主键id关联学生外键tid 创建sql的语句 create ta...
    99+
    2022-11-12
  • mybatis-plus实现自定义SQL、多表查询与多表分页查询语句实例
    目录前言1、自定义SQL2、多表查询3、多表分页查询4、多表分页条件查询总结前言 本文介绍了在mybatis-plus中如何实现:自定义SQL语句,多表查询语句,多表分页查询语句 在...
    99+
    2022-11-13
  • MyBatis实现多表联合查询resultType的返回值
    目录多表联合查询resultType的返回值一般数据按参数类型返回根据某字段查询查询结果为多条记录,存放在list中返回多表联合查询解决方案多表联查,返回结果嵌套list多表联合查询...
    99+
    2022-11-13
  • MyBatis流式查询的三种实现方法
    导读:流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果。流式查询的好处是能够降低内存使用 如果没有流式查询,我们想要从数据库取 1000 万...
    99+
    2022-11-12
  • MyBatis模糊查询的几种实现方式
    大家好呀,我是柚子,今天这篇文章总结MyBatis模糊查询的几种实现方式~ 文章目录 前言一、模糊查询的几种实现方式1.concat函数和#{}拼接的方式2.%和${}拼接的方式3.concat函数和${}拼接的方式4.||和...
    99+
    2023-08-18
    mybatis java spring boot
  • springboot整合mybatis实现多表查询的实战记录
    目录什么是mybatis1、一对一查询(例一个用户一个账户)1.1、实体类1.2、数据库表1.3、持久层接口2、一对多查询(例一个用户对应多个账户)2.1、实体类2.2、数据库表2....
    99+
    2022-11-12
  • mysql的多表查询实现方法
    本篇文章给大家分享的是有关mysql的多表查询实现方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。多表查询有3种方式,分别是:1、传统方式,...
    99+
    2022-10-18
  • Java之Mybatis多层嵌套查询方式
    目录Mybatis多层嵌套查询表的存储sql文件实体类XMLMybatis多层嵌套查询(多对多)依赖实体类Setmeal实体类CheckGroup实体类CheckItemmapper...
    99+
    2022-11-13
  • MyBatis 多表联合查询及优化方法
    目录背景正文关于优化这篇文章我打算来简单的谈谈 mybatis 的多表联合查询。起初是觉得挺简单的,没必要拿出来写,毕竟 mybatis 这东西现在是个开发的都会用,而且网上的文章也...
    99+
    2022-11-13
    MyBatis 多表联合查询 MyBatis 多表查询
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作