【MyBatis框架点滴】——MyBatis一对一查询

简介:   前面介绍的都是对单表进行查询,但实际业务中肯定会涉及到多张表,下面开始总结在MyBatis中的一对一、一对多、多对多的高级查询。

  前面介绍的都是对单表进行查询,但实际业务中肯定会涉及到多张表,下面开始总结在MyBatis中的一对一、一对多、多对多的高级查询。

  就根据最常见的订单业务来分析这几种情况:


8.png

 如上图订单和用户的关系,一个用户可以对应多个订单,但是一个订单只能属于一个用户,所以对于订单来说,它跟用户之间的关系就是一对一,也就是根据一个订单只能查询出一个对应的用户来。下面说一下MyBatis中的一对一查询。


用resultMap返回指定类型


 代码如下:


 User.java

public class User implements Serializable {
    private int id;//用户id
    private String username;//用户名
    private int sex;//性别
    private Date birthday;//出生日期
    private String address;//地址
    //getter、setter
}

  Orders.java

public class User implements Serializable {
    private Integer id;//订单id
    private Integer userId;//所属用户id
    private String number;//订单号
    private Date createtime;//创建时间
    private String note;//订单备注
    private User user;//所属用户
    //getter、setter
}


  OrdersMapper.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="com.danny.mybatis.mapper.OrdersMapper" >
<!-- 订单关联用户的resultMap-->
    <resultMap type="com.danny.mybatis.po.Orders" id="OrdersUserResultMap">
        <!-- 配置映射的订单信息 -->
        <id column="id" property="id"/>
        <result column="user_id" property="userId"/>
        <result column="number" property="number"/>
        <result column="createtime" property="createtime"/>
        <result column="note" property="note"/>
        <!-- 配置映射的用户信息 -->
        <association property="user" javaType="com.danny.mybatis.po.User">
            <id column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
    <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap" >
        select
            orders.*,
            user.username,
            user.sex,
            user.address
        from orders,user
        where orders.user_id=user.id
    </select>
</mapper>


 resultMap的配置是这种方式查询的关键部分。resultMap的type表示查询的主体,比如这里要查询的主体是订单(顺便把关联的用户信息也查出来)。association表示用于映射单个关联对象的信息,它的property属性值表示要将关联查询的实体(用户)映射到主体(订单)中哪个属性。


 mapper接口:


public interface OrdersMapper{
    List<Orders> findOrdersUserResultMap() throws Exception;
}


  测试:


@Test
public void findOrdersUserResultMap(){
    SqlSession sqlSession=sqlSessionFactory.openSession();
    OrdersMapper ordersMapper=sqlSession.getMapper(OrdersMapper.class);
    try {
        List<Orders> list=ordersCustomMapper.findOrdersUserResultMap();
        if (list!=null) {
            System.out.println(list.size());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

用resultType返回指定类型


 用resultType返回指定类型,需要添加一个组合实体OrdersCustom.java,它要包含查询出的用户和订单的所有字段。为了减少代码重复,可以让它继承User.java或者Orders.java中字段较多的一个实体,这里让它继承Orders,如下:


public class OrdersCustom extends Orders{
    //添加User的属性
    private String username;
    private int sex;
    private String address;
    //getter、setter
}


 映射文件:

<select id="findOrdersUser" resultType="com.danny.mybatis.po.OrdersCustom" >
    select
        orders.*,
        user.username,
        user.sex,
        user.address
    from orders,user
    where orders.user_id=user.id
</select>


  mapper接口:


public interface OrdersMapperCustom {
    List<OrdersCustom> findOrdersUser() throws Exception;
}


  测试:


@Test
public void findOrdersUser(){
    SqlSession sqlSession=sqlSessionFactory.openSession();
    OrdersMapperCustom ordersCustomMapper=sqlSession.getMapper(OrdersMapperCustom.class);
    try {
        List<OrdersCustom> list=ordersCustomMapper.findOrdersUser();
        if (list!=null) {
            System.out.println(list.size());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}


总结


 上面两种方法中,个人认为使用resultType定义输出映射比较简单,只需要添加一个po即可,补充多出的属性,即可完成映射。


 相对于第二种方法,使用resultMap麻烦一些,需要定义配置resultMap来映射与之关联的实体机器属性。虽然麻烦,但它的好处就是可以实现延迟加载~当然,如果没有特殊要求,可以使用第二种方法~



相关文章
SQL XML Java
107 0
|
3月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
233 12
|
4月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
294 0
|
5月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
498 13
|
6月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
272 1
|
9月前
|
Oracle 关系型数据库 Java
|
9月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
11月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
591 29
|
6月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1116 1
Spring boot 使用mybatis generator 自动生成代码插件
|
9月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
731 0