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: 流已被关闭 ; ...
随机推荐
- 自定义UICollectionViewLayout之CATransform3D
1.自定义UICollectionViewLayout旋转效果 之前有自定义UICollectionViewLayout(适用于多个section),本文是一个对cell进行CATransform3D ...
- FreeMarker 自定义 TemplateDirectiveModel(一)
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP.它不 ...
- shell 的基本理解
shell 事先通过一个变量设定好了多个路径,当用户输入命令时,shell会自动到这些路径(由左向右)以此查找 与命令名称相同的可执行文件 hash 用来保存以前曾经执行过的命令,以哈希表的方式保存, ...
- PAT甲级——A1098 Insertion or Heap Sort
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...
- java多线程编程建议
多线程编程建议 1,将应用设计成支持多线程并发,可提高性能 2,编写多线程程序,首先保证它是正确的,其次再考虑性能 3,同步处理的开销大于非同步处理,如果可能,尽量使用非同步处理 4,避免多个共享变量 ...
- js去除空格或所有空格
function trim(str) { return str.replace(/(^\s*)|(\s*$)/g, ""); } /***is_global 设置"g&q ...
- elasticsearch 中文API 索引(三)
索引API 索引API允许开发者索引类型化的JSON文档到一个特定的索引,使其可以被搜索. 生成JSON文档 有几种不同的方式生成JSON文档 利用byte[]或者作为一个String手动生成 利用一 ...
- linux服务器之间传输文件
转载:https://www.jb51.net/article/82608.htm 1. scp(最近就使用了scp) [优点]简单方便,安全可靠:支持限速参数 [缺点]不支持排除目录[用法]scp就 ...
- C/C++操作SQLite
最近几天在学习sqlite3,颇有点收获,下面介绍一下简单用法:1.先下载sqlite3.h和sqlite3.c(如果不知道怎么下载的话就去www.sqlite.org)如果要编译成lib.则需要用到 ...
- DataSourceUtils(加入线程管理事务)
第一二见之前的文章: DataSourceUtils(使用C3P0连接池的工具类) 替换第三步: import java.sql.Connection; import java.sql.ResultS ...