mybatis学习教程中级(七)一对多查询

简介: 1 引言 本章实现一对多的查询,还是继续一对一的上一章基础上加上一对多。 2、一对多实现 mapper.

1 引言

本章实现一对多的查询,还是继续一对一的上一章基础上加上一对多。

2、一对多实现

mapper.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">
<!--命名空间:分类管理sql隔离,方便管理-->
<mapper namespace="com.ycy.mybatis.dao.OrdersCustomMapper">
    <resultMap id="orderResultMap" type="orders">
        <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="user">
            <id  column="user_id" property="id"/>
            <result column="username" property="username"/>
            <result column="address" property="address"/>
        </association>
    </resultMap>
  <resultMap id="oderAndDetailMap" type="orders" extends="orderResultMap">
        <!--继承订单信息与用户信息-->
        <!--订单明细
        ofType:集合中po类型
        -->
        <collection  property="orderdetails" ofType="Orderdetail">
            <id column="orderdetail_id" property="id"/>
            <result column="items_id" property="itemsId"/>
            <result column="items_num" property="itemsNum"/>
        </collection>
    </resultMap>
    <!--resultType进行查询-->
   <select id="findOrderCustomer" resultType="OrdersCustom">
               SELECT
          o.*,
          u.username,
          u.address
        FROM
          orders o,
          USER u
        WHERE o.user_id = u.id
   </select>
    <!--使用resultmap进行查询-->
    <select id="findOrderResultMap" resultMap="orderResultMap">
                       SELECT
          o.*,
          u.username,
          u.address
        FROM
          orders o,
          USER u
        WHERE o.user_id = u.id
   </select>
  <!--根据订单联合查询用户与订单详情  一对多关联(订单与订单详情)-->
   <select id="findOrderAndDetail" resultMap="oderAndDetailMap" >
    SELECT
      o.*,
      u.username,
      u.address ,
      d.id orderdetail_id,
      d.items_id,
      d.items_num
    FROM
      orders o,
      USER u ,
      orderdetail d
    WHERE o.user_id = u.id
    AND d.orders_id=o.id
   </select>

</mapper>
</pre><pre name="code" class="html">

Orders.java实体类

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //用户信息
    private User user;
    //getset 省略 篇幅问题

    //订单明细
    private List<Orderdetail> orderdetails;
}
mapper.java
package com.ycy.mybatis.dao;

import com.ycy.mybatis.module.Orders;
import com.ycy.mybatis.module.OrdersCustom;

import java.util.List;

/**
 * Created by Administrator on 2015/9/9 0009.
 */
public interface OrdersCustomMapper {
   //一对一ResultType
   public List<OrdersCustom> findOrderCustomer() throws  Exception;
   //一对一ResultMap
   public  List<Orders> findOrderResultMap() throws  Exception;
   //一对多
   public  List<Orders> findOrderAndDetail() throws  Exception;
}
一对多测试

package com.ycy.mybatis.test;

import com.ycy.mybatis.dao.OrdersCustomMapper;
import com.ycy.mybatis.module.Orderdetail;
import com.ycy.mybatis.module.Orders;
import com.ycy.mybatis.module.OrdersCustom;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * Created by Administrator on 2015/8/31 0031.
 */
public class MybatisTest7 {
    private SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void  before() throws IOException {
        String resource="SqlMapConfig.xml";
        InputStream in = Resources.getResourceAsStream(resource);
        sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
    }
    //一对多 订单-订单详情
    @Test
    public  void findOrderAndDetail() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        OrdersCustomMapper ordersCustomMapper=     sqlSession.getMapper(OrdersCustomMapper.class);
        List<Orders>  ordersList=  ordersCustomMapper.findOrderAndDetail();
        sqlSession.close();
        for (Orders ordersCustom : ordersList) {
            System.out.println(ordersCustom.getUser().getUsername());
            List<Orderdetail>  orderdetailList=     ordersCustom.getOrderdetails();
            System.out.println(ordersCustom.getOrderdetails());
            for (Orderdetail orderdetail : orderdetailList) {
                System.err.println(orderdetail.getItemsNum());
            }

        }

    }


}

2、一对多实现(稍微复杂)

之前我们看看我们查询结果,是根据order表来的查询结果现在我们根据User表

user.java中创建映射的属性:集合 List<Orders>  orderlist

Orders中创建映射的属性:集合List<Orderdetail> orderdetails 

在Orderdetail中创建商品属性:pojo   Items items

具体的java实体类我就不写出了了,我只写一个mapper.xml 文件你看懂就ok了。。。主要是requestMmap的编写
    <!--userAndDetailMap 根据用户查询订单,订单详细,商品-->
    <resultMap id="userAndDetailMap" type="com.ycy.mybatis.module.User">
        <!--用户信息-->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <!--订单信息-->
        <collection property="orderlist" javaType="com.ycy.mybatis.module.Orders">
            <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"/>
            <!--订单明细-->
            <collection property="orderdetails" javaType="com.ycy.mybatis.module.Orderdetail">
                <id column="orderdetail_id" property="id"/>
                <result column="items_id" property="itemsId"/>
                <result column="items_num" property="itemsNum"/>
                <!--商品信息-->
                <association property="items" javaType="com.ycy.mybatis.module.Items">
                    <id column="item_id" property="id"/>
                    <result column="item_name" property="name"/>
                    <result column="item_detail" property="detail"/>
                </association>
            </collection>
        </collection>
    </resultMap>
sql语句依然可以使用这样
    <!--根据用户单联合查询用户与订单详情  一对多关联(订单与订单详情)-->
    <select id="findUserAndDetail" resultMap="userAndDetailMap" >
        SELECT
        o.*,
        u.username,
        u.address ,
        d.id orderdetail_id,
        d.items_id,
        d.items_num
        FROM
        orders o,
        USER u ,
        orderdetail d
        WHERE o.user_id = u.id
        AND d.orders_id=o.id
    </select>



2、一对多实现总结(暂时)

1、collection :当我们的java类利用有list的就用Collection,因为这个单词本身就是集合的意思

2、association :当我们的java类利用有联合其他类的就用association ,因为这个单词本身就是联合的意思

3、当我是实现子类查询的时候,javaType尽量用全称(经验),property必须与java类里面的名称一样



目录
相关文章
|
1月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
183 13
|
2月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
129 1
|
7月前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
181 18
|
7月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
789 6
|
7月前
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
146 6
|
9月前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
1539 5
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
8月前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
220 5
|
8月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
356 3
|
2月前
|
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`注解完成整合
394 1
Spring boot 使用mybatis generator 自动生成代码插件
|
5月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
387 0