mybatis的多表联查
如何确定表关系:
依靠外键
如何在实体中描述表关系:
建立对方的引用。
如果是一的一方,它关联的就是对方的集合(建立集合引用)
如果是多的一方,它关联的就是对方的对象(建立对象引用)
Mybatis中配置关联查询: 以用户和订单为例
<collection>标签
常用属性:
property:指定集合的名称
javaType:指定集合的类型
ofType:指定集合元素的类型
--查询一个用户时携带其所有订单内容
//一对多 条件查询
User findOneByMore(Integer uid);
<!--一对多 条件查询-->
<resultMap id="findOneByMoreMap" type="User">
<id column="uid" property="uid"></id>
<result column="name" property="name"></result>
<result column="password" property="password"></result>
<result column="email" property="email"></result>
<result column="birthday" property="birthday"></result>
<collection property="userAccount" javaType="java.util.List" ofType="Account">
<result column="aid" property="aid"></result>
<result column="accountName" property="accountName"></result>
<result column="balance" property="balance"></result>
<result column="uid" property="uid"></result>
</collection>
</resultMap>
<select id="findOneByMore" resultMap="findOneByMoreMap">
select * from `user` u join account a on a.uid = u.uid where u.uid = #{uid}
</select>
--查询所有用户时携带其所有订单内容
//一对多 所有用户
List<User> findAllOneByMore();
同上查询单个的写法,只需更换sql语句
select * from `user` u join account a on a.uid = u.uid
一对一配置对象时:
<association>标签
常用属性:
property:指定对象的名称
javaType:指定对象的类型
查询一个订单时想查看用户信息
//一对一
Account findByIdOne(Integer aid);
<!-- 条件查询 一对一 -->
<resultMap id="findByIdOneMap" type="Account">
<id property="aid" column="aid"></id>
<result property="accountName" column="accountName"></result>
<result property="balance" column="balance"></result>
<result property="uid" column="uid"></result>
<association property="user" javaType="User">
<id property="uid" column="uid"></id>
<result property="name" column="name"></result>
<result property="password" column="password"></result>
<result property="email" column="email"></result>
<result property="birthday" column="birthday"></result>
</association>
</resultMap>
<select id="findByIdOne" resultMap="findByIdOneMap">
SELECT * FROM `user` u JOIN account a ON a.uid = u.uid where aid = #{aid}
</select>
复合传值,懒加载用法的配置和举例
我们在查询用户时返回的的是整个订单的Account实体集合和User实体,这样会频繁的创建对象浪费内存空间,使用懒加载机制让其查询时之查询User信息,需要订单Account信息时再查询即可。
反过来思考在查询单条Account订单信息时会携带一条相关的User信息,这样并不会浪费太多内存,可以选择及时加载或懒加载。
配置全局懒加载,主配置文件中
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
同时 association 和 collection 标签上多了一个属性可选
fetchType = "lazy | eager"
lazy使用懒加载 eager则相反
属性的权重大于全局配置,但是上面所写的一条sql并无法实现懒加载,因为一条语句就查出了所有需要的数据,而我们想要的是分开查询。
这里需要注意的是查询结果呈现出肯定是映射后的实体,假设查询的Account实体,开启懒加载后其中的User属性为空,不查询。
这时调用其 equals, clone, hashCode, toString方法后默认认为要查询User属性并对其进行映射,这可以参考MyBatis中的 Settings属性 lazyLoadTriggerMethods 进行配置
举例
一对一查询
UserMapper.xml中有查询单个User实体的语句
<!--单条件查询-->
<select id="findOneById" resultType="User">
select * from `user` where uid = #{uid}
</select>
AccountMapper.xml配置
<!-- 一对一懒加载用法 -->
<resultMap id="findByIdOneOldMap" type="Account">
<id property="aid" column="aid"></id>
<result property="accountName" column="accountName"></result>
<result property="balance" column="balance"></result>
<result property="uid" column="uid"></result>
<association property="user" javaType="User" select="com.itstudy.test.dao.UserMapper.findOneById" column="uid" fetchType="lazy"/>
</resultMap>
select 属性为查询语句,
column 为复合传递的条件时传递的附表中主表的外键查询,相反如果是一对多查询传递的就是主表中放在附表中的外键字段
select必须为全限定路径,除非两个方法在同一个xml中。
一对多查询
在AccountMapper.xml中有
<!-- 根据条件查询一个订单 -->
<select id="findOneById" resultType="Account">
select * from account where uid = #{uid}
</select>
UserMapper.xml中
<!-- 一对多复合查询 -->
<resultMap id="findOneGoMap" type="User">
<id column="uid" property="uid"></id>
<result column="name" property="name"></result>
<result column="password" property="password"></result>
<result column="email" property="email"></result>
<result column="birthday" property="birthday"></result>
<collection property="userAccount" javaType="java.util.List" ofType="Account" select="com.itstudy.test.dao.AccountMapper.findOneById" fetchType="lazy" column="uid"></collection>
</resultMap>
<select id="findGoId" resultMap="findOneGoMap">
select * from `user` where uid = #{uid}
</select>
缓存简介,上面说的懒加载很好的节约了资源,提高了效率,缓存机制可以减少对数据库的访问次数,提高查询效率,但也不是所有数据都适合存储在缓存中。
修改少,查询多的数据适合存储在缓存中。
缓存就是拿空间换时间,消耗了内存节约了时间。
缓存详解 请看 https://blog.csdn.net/weixin_37139197/article/details/82908377
在这里只是解和上面案例简单介绍。
一级缓存自动开启
同一个 SqlSession 对象, 在参数和 SQL 完全一样的情况先, 只执行一次 SQL 语句,连返回结果集的实体都是同一个
可以使用属性关闭
<select id="selectByPrimaryKey" flushCache="true | false".....
二级缓存
在配置文件中配置开启全局缓存
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
二级缓存存在于 SqlSessionFactory 生命周期中,同一个 SqlSessionFactory 查询时可查到缓存数据
mybatis的多表联查的更多相关文章
- Mybatis中多表联查,查询出来的字段出现重名,造成数据异常的解决方法!
在做一对多出现的问题,引发的思考:当数据库表中,主表的主键id和明细表的中的字段名相同时怎么办?Mybatis进行自动映射赋值的时候会不会出现异常? 注意:M ...
- mybatis.net 多表联查
mybatis.net针对多表联查,其实不用讲联查出的所有的列全部做一个新的resultMap,我们完全可以通过集成关系来实现,真是上一次说的懒加载,在一定程度上可以提高其性能,但这并不是说懒加载性能 ...
- 使用Mybatis进行多表联查操作
(1)增加一个测试数据库shop_order,sql语句如下: CREATE DATABASE `shop_order`; USE `shop_order`; CREATE TABLE `t_user ...
- 使用mybatis多表联查的时候结果异常及springmvc的理解
今天使用mybatis多表联查的时候,在dos窗口查询时可以出结果集,但是使用mybatis查询的时候最后返回的结果只有最后一个结果 然后研究了半天没弄出来,后来无意中发现添加了最外层从表的ID字段后 ...
- 【mybatis】mybatis多表联查,存在一对多关系的,实体中使用List作为字段接收查询结果的写法
实体如下: IntegralGoods 积分商品 IntegralGoodsImg 积分商品图片 ShelfLog 积分商品自动上架记录 IntegralGoods :IntegralGoodsIm ...
- mybatis-plus注解版实现多表联查(sql)
mybatis注解版实现多表联查 需求: 用户有角色,角色有权限,需要一次取用户信息包含角色信息及其对应权限 实体类: package cn.zytao.taosir.common.model.use ...
- Mybatis中多表关联时,怎么利用association优雅写resultMap来映射vo
前言 有好一阵没碰mybatis了,这次的项目基于性能考虑,选了mybatis,写着写着,发现有下面的需求,比如两表联查,取其中各一部分字段,怎么更方便地用vo来接,这里犯了难: 我想的是,因为这个s ...
- mybatis动态调用表名和字段名
以后慢慢启用个人博客:http://www.yuanrengu.com/index.php/mybatis1021.html 一直在使用Mybatis这个ORM框架,都是使用mybatis里的一些常用 ...
- CDH中,执行HIVE脚本表联查权限问题。。
文章来自http://www.cnblogs.com/hark0623/p/4174641.html 转发请注明 有时候执行表联查的时候总会出现没有权限写文件的情况. 这个时候使用sudo -H hi ...
随机推荐
- event兼容性解决
event出现undefind错误 解决方法: $('#normalImgDiv').mousemove(function (e) { var e = window.event || e; var p ...
- 通用权限管理系统组件 (GPM - General Permissions Manager)
有的公司开发人员只那么几个,一个人支撑整个公司所有的IT系统实在有点累,不想自己写权限系统了,自己琢磨不也是要花时间和精力,要为此付出多少时间和汗水阿,细细的皱纹不知要多多少呢,重复建设不是白白浪费生 ...
- 数学--数论--HDU1825(积性函数性质+和函数公式+快速模幂+非互质求逆元)
As we all know, the next Olympic Games will be held in Beijing in 2008. So the year 2008 seems a lit ...
- 一只简单的网络爬虫(基于linux C/C++)————socket相关及HTTP
socket相关 建立连接 网络通信中少不了socket,该爬虫没有使用现成的一些库,而是自己封装了socket的相关操作,因为爬虫属于客户端,建立套接字和发起连接都封装在build_connect中 ...
- 《Docker从入门到跑路》之基本用法介绍
Docker是一种轻量级的虚拟化技术,它具备传统虚拟机无法比拟的优势,它更简易的安装和使用方式.更快的速度.服务集成和开源流程自动化. Docker的安装 安装Docker的基本要素:1.Docker ...
- sequel pro无法连接mysql服务器
1. 添加用户 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_passwd' WITH GRANT OPTION; FLU ...
- Envoy 基础教程:使用 Unix Domain Socket(UDS) 与上游集群通信
Envoy Proxy 在大多数情况下都是作为 Sidecar 与应用部署在同一网络环境中,每个应用只需要与 Envoy(localhost)交互,不需要知道其他服务的地址.然而这并不是 Envoy ...
- Spring官网阅读(九)Spring中Bean的生命周期(上)
文章目录 生命周期回调 1.Bean初始化回调 2.Bean销毁回调 3.配置默认的初始化及销毁方法 4.执行顺序 5.容器启动或停止回调 Lifecycle 接口 LifecycleProcesso ...
- python地图投影转换
一.投影包osr与proj4的使用 1.osr投影转换示例 from osgeo import osr,ogr#定义投影#wgs84source=osr.SpatialReference()sourc ...
- 【Spark】SparkStreaming的容错机制
文章目录 检查点机制 驱动器程序容错 工作节点容错 接收器容错 处理保证 检查点机制 Metadata checkpointing -- 将定义流计算的信息存入容错的系统如HDFS. Data che ...