在实际的开发中我们经常用到的是一对一查询和一对多查询。而多对多的实现是通过中间来实现,这里就没有给出来了

比如:

订单和用户是一对一的关系(一个订单只能对应一个用户)

订单和订单明细是一对多的关系(一个订单可以对应多个订单明细)

程序结构图:

所采用的mybatis版本3.2.3

对应的jar包如下图所示

对应库表的信息

用户表:

订单表:

订单明细表:

对应的实体类的信息

用户实体类;

用户扩展实体类:

订单实体类:

订单明细实体类:

==============================【一对一(resultType方式) begin】==============================

OrderContent.xml

<!-- 一对一: 通过查询商品,查询出对应的用户的信息 -->
<!-- 方式1:resultType -->
<select id="findOrderAndRelateUserByResultType" resultType="com.ithema.mybatis.po.OrderVo">
SELECT
orders.id,
orders.order_number,
orders.user_id,
user.username,
user.address
FROM orders,
USER
WHERE orders.user_id = user.id
</select>

OrderContent.java

/**
* resultType的方式实现通过订单查询用户(一对一)
* @return
*/
List<OrderVo> findOrderAndRelateUserByResultType();

查询结果:

数据库结果:

==============================【一对一(resultType方式) end】==============================

==============================【一对一(resultMap方式) begin】==============================

OrderContent.xml

<!-- 方式2:resultMap -->
<!-- 定义一个resultMap,用于映射订单信息和用户信息 id:在同一个命名空间下唯一 
type:要映射到的java类型,在Orders实体中定义一个User属性,用于映射User的信息 -->
<resultMap type="com.ithema.mybatis.po.Orders" id="orderAndRelateUserMap">
<id column="id" property="id" />
<result column="order_number" property="order_number" />
<result column="user_id" property="user_id" />

<!-- association标签用于实现一对一映射 property:将关联的信息映射到Orders对象中的哪个属性中 javaType:映射属性的java类型 -->
<association property="user" javaType="com.ithema.mybatis.po.User">
<!-- id:关联的用户信息的唯一约束 property:id指定的映射关联的对象的那个属性 -->
<id column="user_id" property="id" />
<result column="username" property="username" />
<result column="address" property="address" />
</association>
</resultMap>

<select id="findOrderAndRelateUserByResultMap" resultMap="orderAndRelateUserMap">
SELECT
orders.id,
orders.order_number,
orders.user_id,
user.username,
user.address
FROM orders,
USER
WHERE orders.user_id = user.id
</select>

OrderContent.java

/**
* resultMap的方式实现通过订单查询用户(一对一)
* @return
*/
List<Orders> findOrderAndRelateUserByResultMap();

测试结果:

==============================【一对一(resultMap方式) end】==============================

==============================【一对多(resultMap方式) begin】==============================

OrderContent.xml

<!-- 一对多: 通过查询订单查询对应的订单明细信息 
一对多的查询只能通过resultMap的方式实现
在Orders对象中加入一个list集合表示订单明细的信息
-->
<!-- 定义一个订单和订单明细的一对多的映射Map -->
<resultMap type="com.ithema.mybatis.po.Orders" id="orderAndOrderDetailMap">
<!-- 订单对象的唯一标识 -->
<id column="id" property="id"/>
<result column="order_number" property="order_number"/>

<!-- 一对多的映射要使用collection标签 
property:将明细信息映射到哪个集合对象中
ofType:所要映射的集合对象的类型
-->
<collection property="orderDetails" ofType="com.ithema.mybatis.po.OrderDetail">
<id column="orderdetail_id" property="id"/>
<result column="item_num" property="item_num"/>
<result column="item_price" property="item_price"/>
</collection>
</resultMap>

<select id="findOrderAndOrderDetail" resultMap="orderAndOrderDetailMap">
SELECT
orders.id,
orders.order_number,
orderdetail.id orderdetail_id,
orderdetail.item_num,
orderdetail.item_price
FROM orders,
orderdetail
WHERE orders.id = orderdetail.orders_id
</select>

OrderContent.java

/**
* resultMap的方式实现通过订单查询对应的订单明细(一对多)
* @return
*/
List<Orders> findOrderAndOrderDetail();

测试结果:

数据库结果:

==============================【一对多(resultMap方式) end】=============================

mybatis中实现一对一,一对多查询的更多相关文章

  1. Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!

    在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常?                      注意:M ...

  2. Mybatis中动态SQL多条件查询

    Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...

  3. MyBatis的关联关系 一对一 一对多 多对多

    一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...

  4. Mybatis中的关联映射和查询

    一.商品订单数据模型 1.数据表 这里定义了四个表,分别表示用户,商品,订单,和订单详情. 用户表user CREATE TABLE `user` ( `id` int(11) NOT NULL AU ...

  5. springboot整合mybatis-plus基于纯注解实现一对一(一对多)查询

    因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来 ...

  6. Mybatis笔记四:Mybatis中的resultType和resultMap查询操作实例详解

    resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比 ...

  7. Mybatis 中的转义字符及常用查询

    转译符 1.特殊字符转译 < < 小于 > > 大于 & & 与 ' ’ 单引号 " " 双引号 需要注意的是分号是必不可少的. 比如 a ...

  8. MyBatis中collection (一对一,一对多)

    MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...

  9. 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题

    今天把notice表中的content字段改为long字段后,含有该字段的使用CTE的查询语句报错了.提示一下错误 ### Cause: java.sql.SQLException: 流已被关闭 ; ...

随机推荐

  1. Python(四)基础篇之「文件对象&错误处理」

    [笔记]Python(四)基础篇之「文件对象&错误处理」 2016-12-08 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  2. day 36 MySQL的库、表的详细操作

    MySQL的库.表的详细操作   MySQL数据库 本节目录 一 库操作 二 表操作 三 行操作 一 库操作 1.创建数据库 1.1 语法 CREATE DATABASE 数据库名 charset u ...

  3. js格式化数字为金额

    /** * * @param num * @param precision * @param separator * @returns {*} *=========================== ...

  4. 原子操作atomic

    一.原子操作:即不可再细分的操作,最小的执行单位,在操作完之前都不会被任何事件中断. 整型原子操作:对int类型的操作变成原子操作.                 int i = 0;       ...

  5. [转]模块化——Common规范及Node模块实现(二)

    模块的循环加载 如果发生模块的循环加载,即A加载B,B又加载A,则B将加载A的不完整版本. // a.js exports.x = 'a1'; console.log('a.js ', require ...

  6. ERROR:ORA-30076: 对析出来源无效的析出字段

    DEBUG:key: sql: select count(*) as col_0_0_ from jc_user cmsuser0_ where 1=1 and cmsuser0_.register_ ...

  7. day65——day69

    目录 DAY65 课堂笔记 1.vue实例 2.插值表达式 3.文本指令 4.面向对象js 5.js函数补充 6.事件指令 7.属性指令 DAY66 课堂笔记 1.表单指令 2.条件指令 3.循环指令 ...

  8. NGINX模块开发 之 验证URL參数

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/RoyalApex/article/details/26404379 作者:邹祁峰 邮箱:Qifeng ...

  9. 2019-7-9-Roslyn-如何在-Target-引用-xaml-防止文件没有编译

    title author date CreateTime categories Roslyn 如何在 Target 引用 xaml 防止文件没有编译 lindexi 2019-07-09 17:16: ...

  10. 洛谷 3959 宝藏——枚举+状压dp

    题目:https://www.luogu.org/problemnew/show/P3959 原来写了个不枚举起点的状压dp. #include<iostream> #include< ...