mybatis中实现一对一,一对多查询
在实际的开发中我们经常用到的是一对一查询和一对多查询。而多对多的实现是通过中间来实现,这里就没有给出来了
比如:
订单和用户是一对一的关系(一个订单只能对应一个用户)
订单和订单明细是一对多的关系(一个订单可以对应多个订单明细)
程序结构图:
所采用的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中实现一对一,一对多查询的更多相关文章
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- Mybatis中动态SQL多条件查询
Mybatis中动态SQL多条件查询 mybatis中用于实现动态SQL的元素有: if:用if实现条件的选择,用于定义where的字句的条件. choose(when otherwise)相当于Ja ...
- MyBatis的关联关系 一对一 一对多 多对多
一对一示例 一个妻子对应一个丈夫 数据库表设计时 在妻子表中添加一个丈夫主键的作为外键 1 对应的JavaBean代码虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系. Husband实体 ...
- Mybatis中的关联映射和查询
一.商品订单数据模型 1.数据表 这里定义了四个表,分别表示用户,商品,订单,和订单详情. 用户表user CREATE TABLE `user` ( `id` int(11) NOT NULL AU ...
- springboot整合mybatis-plus基于纯注解实现一对一(一对多)查询
因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能还在开发中,相信mybatis-plus开发团队在不久的将来 ...
- Mybatis笔记四:Mybatis中的resultType和resultMap查询操作实例详解
resultType和resultMap只能有一个成立,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题.比 ...
- Mybatis 中的转义字符及常用查询
转译符 1.特殊字符转译 < < 小于 > > 大于 & & 与 ' ’ 单引号 " " 双引号 需要注意的是分号是必不可少的. 比如 a ...
- MyBatis中collection (一对一,一对多)
MyBatis学习:http://www.mybatis.org/mybatis-3/zh/index.html 大对象InsuranceDetailsVO: com.quicksure.mobile ...
- 解决在mybatis中使用CTE进行oracle查询数据类型为long的字段出现流关闭问题
今天把notice表中的content字段改为long字段后,含有该字段的使用CTE的查询语句报错了.提示一下错误 ### Cause: java.sql.SQLException: 流已被关闭 ; ...
随机推荐
- SpringBoot使用注解方式整合Redis
1.首先导入使用Maven导入jar包 <dependency> <groupId>org.springframework.boot</groupId> <a ...
- 23-css补充
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- AlexNet结构图详解
- Windows API 第四篇 文件操作
创建或打开文件(也可用于打开管道,油槽,硬件设备等): HANDLE CreateFile( LPCTSTR lpFileName, // file name DWORD dwDesiredAcces ...
- mac上安装软件后,桌面上软件的图标如何去掉?
桌面上的图标是软件的镜像包,默认安装以镜像形式,你选中它,按command+e 就可以推掉它
- 廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法
1.SHA-1算法 SHA-1算法也是一种哈希算法. 输出160 bits/20bytes 由美国国家安全局开发 SHA-0/SHA-1/SHA-256/SHA-512 * SHA-0有问题,已经作废 ...
- BZOJ3907 网格 卡特兰数
题目描述 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m. 现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左 ...
- svn里update以后还是有红色的感叹号怎么办
不用那么麻烦,直接还原就行了,客户端是TortoiseSVN的话,在该文件或文件夹上点右键,选择TortoiseSVN——revert有时还原之后系统反应没那么快,还是显示红色感叹号,刷新几下就正常了 ...
- jeecms 前台拦截器的研究与改造
jeecms 前台拦截器的研究与改造 2013年12月24日 15:23:35 xinfei0803 阅读数 3511 jeecms出发点是面向大众的,具有前台开发性,也就是说,即时是未登录(游客 ...
- Entity Framework底层操作封装V2版本号(5)
这个框架到如今最大的变化立即就要出现了,哪就是对缓存的使用.由于系统常常要去读取数据库数据.可是大家知道.数据库的处理能力是有限的,所以对于一些数据量不大,可是又 须要常常去读取的功能来说.更好的方法 ...