Mybatis多表关联查询(一对多关联查询)
1、Mybatis一级缓存与二级缓存
目的:提高查询效率,降低数据库查询压力,提升系统整体性能。
一级缓存:默认开启,Session级别,同一个会话内生效。
命中缓存的情况:statementid、SQL语句、结果集的范围、传递的参数相同。
同一个查询之前执行DML操作,清空缓存,session.clearCache()也会清空缓存。
二级缓存:需要配置,SQLSessionFactory级别,不同会话之间可以共享。
使用步骤:1、全局配置mybatis_config.xml文件中
<settting name="cacheEnabled" value="true" />
2、mapper.xml配置要使用二级缓存的查询
<cache />
3、使用查询返回的对象的类必须实现序列化接口。
MemCached、OSCache、EHCache。
2、Mybatis一对一关联查询
<association>标签是处理单一的关联对象(处理单一属性的关联关系)。
property :指定关联对象的属性
javaType :关联对象的类型(可以省略)
select :执行一个新的查询
column:在新的查询中用哪个列的值作为查询条件
2.1 RolesMapper.java
提供一个根据用户主键userid去查询用户角色的方法,如下:
public interface RolesMapper {/*** 根据用户id查询此用户对应的角色信息* @param id* @return*/Roles findRolesByUserId(int id);
}
2.2 RolesMapper.xml配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dyh.dao.RolesMapper"><!--<resultMap id="rolesMap" type="com.dyh.pojo.Roles"><id property="roleid" column="roleid" /><result property="roleName" column="rolename" /></resultMap>--><!--<select id="findRolesByUserId" resultMap="rolesMap" parameterType="int">--><select id="findRolesByUserId" resultType="roles" parameterType="int">select roleid,rolename from roles where user_id=#{userid}</select>
</mapper>
2.3 JUnit单元测试RolesMapperTest
package com.dyh.test;import com.dyh.dao.RolesMapper;
import com.dyh.pojo.Roles;
import com.dyh.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import static org.junit.Assert.*;public class RolesMapperTest {SqlSession session;RolesMapper mapper;@Beforepublic void setUp() throws Exception {session = MybatisUtil.getConnection();mapper = session.getMapper(RolesMapper.class);}@Testpublic void testFindRolesByUserId(){Roles roles = mapper.findRolesByUserId(1);System.out.println(roles);}@Afterpublic void tearDown() throws Exception {MybatisUtil.closeConnection();}
}
2.4 UserMapper.java
增加如下方法:
public interface UsersMapper {List<Users> queryUsersAndRoles();// 增加如下方法List<Users> queryUsersAndRolesBySelect();
}
2.5 UserMapper.xml
增加如下内容:
<resultMap id="usersAndRolesMap2" type="users"><id property="userid" column="userid" /><result property="username" column="username" /><result property="usersex" column="usersex" /><!-- 配置一对一的关联关系 --><!-- column="userid" 是users表中的主键,使用这个值取查询roles表 --><association property="roles" javaType="roles"select="com.dyh.dao.RolesMapper.findRolesByUserId" column="userid"><id property="roleid" column="roleid" /><result property="roleName" column="rolename" /></association></resultMap><sql id="deptColumns">deptno,dname,loc as city</sql><select id="queryUsersAndRolesBySelect" resultMap="usersAndRolesMap2">SELECT u.userid,u.username,u.usersexFROM users u</select>
2.6 JUnit单元测试UsersMapperTest.java
@Testpublic void testQueryUsersAndRoles2(){List<Users> list = mapper.queryUsersAndRolesBySelect();list.forEach(System.out::println);}
2.7 延迟加载与立即加载
在association一对一关联标签和collection一对多关联标签中有个属性fetchType="lazy",属性值有lazy懒加载(延迟加载)、eager立即加载。如果不配置fetchType属性值,fetchType默认值是eager立即加载。
2.7.1 懒加载(延迟加载)lazy
测试类UsersMapperTest.java中修改代码如下:注意,不能直接打印users对象,因为其toString方法中获取了roles的属性值。
@Testpublic void testQueryUsersAndRoles2(){List<Users> list = mapper.queryUsersAndRolesBySelect();//list.forEach(System.out::println);for (Users users:list) {System.out.println(users.getUsername());// 懒加载没有获取角色信息的时候,不会去查询角色表//System.out.println(users.getRoles());}}
UserMapper.xml配置修改如下:
一、一对多关联查询
应用场景:完成用户与订单查询。 要求一个用户可以对应多个订单。
1、collection标签
<collection>标签是处理所关联对象是多个的(处理关联属性是集合时的关联关系)。
property :指定关联对象的属性
javaType :关联对象的类型(可省略。默认List 类型,如果集合是 Set 类型时需要配置并给定 Set 的全名 )
ofType:指定集合里存放的对象类型
select :执行一个新的查询
column:在新的查询中用哪个列的值作为查询条件
2、建表orders
-- users表使用上次课建立好的表和数据
CREATE TABLE `orders`(
`orderid` INT(11) NOT NULL AUTO_INCREMENT,
`orderprice` DOUBLE DEFAULT NULL,
`user_id` INT(11) DEFAULT NULL,
PRIMARY KEY(`orderid`),
KEY `orders_fk`(`user_id`),
CONSTRAINT `orders_fk` FOREIGN KEY(`user_id`) REFERENCES `users`(`userid`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO orders VALUES(DEFAULT, 80, 1),
(DEFAULT, 90, 1),
(DEFAULT, 100, 1),
(DEFAULT, 92, 2),
(DEFAULT, 102, 2);
SELECT * FROM orders;-- 一对多查询,查询用户及其对应的订单信息
SELECT u.userid,u.username,u.usersex,o.orderid,o.orderprice
FROM users u,orders o
WHERE u.userid=o.user_id
3、Orders实体类
public class Orders {private Integer orderid;private Double orderprice;// get、set、toString、constructor方法自行补充
}
4、修改Users实体类
一对多,说明一个users对象可以有多个订单,所以要在Users类中添加如下属性:
private List<Orders> ordersList;public List<Orders> getOrdersList() {return ordersList;}public void setOrdersList(List<Orders> ordersList) {this.ordersList = ordersList;}@Overridepublic String toString() {return "Users{" +"userid=" + userid +", username='" + username + '\'' +", usersex='" + usersex + '\'' +", roles=" + roles +",orderList=" + ordersList +'}';}
5、修改UsersMapper.java
/*** 查询用户和其所下的订单* @return*/List<Users> queryUsersAndOrders();
6、修改UsersMapper.xml
<resultMap id="usersAndOrdersMap" type="com.dyh.pojo.Users"><id property="userid" column="userid" /><result property="username" column="username" /><result property="usersex" column="usersex" /><!-- 配置一对多的关联关系 --><collection property="ordersList" ofType="com.dyh.pojo.Orders" ><id property="orderid" column="orderid" /><result property="orderprice" column="orderprice" /></collection></resultMap><sql id="deptColumns">deptno,dname,loc as city</sql><select id="queryUsersAndOrders" resultMap="usersAndOrdersMap">SELECT u.userid,u.username,u.usersex,o.orderid,o.orderpriceFROM users u,orders oWHERE u.userid=o.user_id</select>
7、测试UsersMapperTest.java
增加如下方法:
@Testpublic void testQueryUsersAndOrders(){List<Users> list = mapper.queryUsersAndOrders();list.forEach(System.out::println);}
二、一对多查询实现方式二
1、UsersMapper.java
中增加如下方法:
/*** 查询用户和其所下的订单* @return*/List<Users> queryUsersAndOrders2();
2、UserMapper.xml
中增加如下代码:
<resultMap id="usersAndOrdersMap2" type="com.dyh.pojo.Users"><id property="userid" column="userid" /><result property="username" column="username" /><result property="usersex" column="usersex" /><!-- 配置一对多的关联关系 --><collection property="ordersList" ofType="com.dyh.pojo.Orders"select="com.dyh.dao.OrdersMapper.findOrderListByUsersId" column="userid"><id property="orderid" column="orderid" /><result property="orderprice" column="orderprice" /></collection></resultMap><sql id="deptColumns">deptno,dname,loc as city</sql><select id="queryUsersAndOrders2" resultMap="usersAndOrdersMap2">SELECT u.userid,u.username,u.usersexFROM users u</select>
需要增加com.dyh.OrdersMapper.findOrderListByUsersId的接口及实现。
3、OrdersMapper.java
public interface OrdersMapper {/*** 根据用户id去查询用户的所有订单* @param userid 用户id* @return 订单集合*/List<Orders> findOrderListByUsersId(int userid);
}
4、OrdersMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dyh.dao.OrdersMapper"><select id="findOrderListByUsersId"resultType="com.dyh.pojo.Orders" parameterType="int">select orderid,orderprice from orders where user_id=#{userid}</select>
</mapper>
5、JUnit单元测试UsersMapperTest.java
增加如下代码:
@Testpublic void testQueryUsersAndOrders2(){List<Users> list = mapper.queryUsersAndOrders2();list.forEach(System.out::println);}
测试结果
一对一的实现方式二:<association select="" />
延迟加载与立即加载:<association fetchType="lazy|eager" />
一对多关联查询:<collection ofType="集合中的对象类型" />
Mybatis多表关联查询(一对多关联查询)相关推荐
- MyBatis框架学习 DAY_03:如何解决无法封装问题 / 一对一关联查询 / 一对多关联查询
1. 通过查询时自定义别名的方式解决名称不一致而导致的无法封装数据的问题 假设,向用户组数据表(t_group)表中插入一些测试数据: INSERT INTO t_group (name) VALUE ...
- Laravel-admin 表单保存一对多关联数据(源码探究到功能实现)
我的个人博客:逐步前行STEP 由于Laravel-admin只支持表单保存一对一关联数据,要想保存一对多关联数据,还得从了解它的源码入手,看有没有空子可钻. 首先,进入源码中的Form.php的st ...
- 后盾网lavarel视频项目---模型一对多关联简单实例
后盾网lavarel视频项目---模型一对多关联简单实例 一.总结 一句话总结: 在模型中定义一个方法来设置一对多关联:return $this->hasMany(Video::class); ...
- MyBatis学习总结(5)——实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)
MyBitis(iBitis)系列随笔之一:MyBitis入门实例 MyBitis(iBitis)系列随笔之二:类型别名(typeAliases)与表-对象映射(ORM) MyBitis(iBitis ...
- mybatis 多表关联查询_Java修行第041天--MyBatis框架(下)--多表查询
1 解决列名和属性名不一致问题 如果查询时使用 resultType 属性, 表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配. 因此, 当数据库 ...
- mybatis一对多关联查询两种方式
mybatis一对多关联查询两种方式 前提: 方式一: 方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` (`id` int ...
- Mybatis一对多关联查询,返回值Map,字段自动映射
功能描述 由于查询字段和表名都要支持动态配置,故查询返回值需要为List<Map<String,Object>>,不定义值对象. 查询结果列需要支持自动映射,不配置类属性和数据 ...
- mybatis一对多关联查询_Mybatis 一对一、一对多的关联查询 ?
<mapper namespace="com.lcb.mapping.userMapper"> <!--association 一对一关联查询 --> &l ...
最新文章
- SqlService 数据操作
- IT项目管理总结:第一章 项目管理概述
- NoSQL(2)之 Redis配置与优化
- 非标准化的阀门企业也在用钉钉宜搭实现数字化转型
- php中的session机制
- 《剑指offer》链表中环的入口节点
- 主人的C++桌上也没有这么好看的花朵了
- C++ 引用和指针有什么区别?
- android不是内部或外部命令,也不是可执行的程序或批处理文件
- CRM【第三篇】: crm业务
- 25个深度学习开源数据集
- TX2开发板Ubuntu16.04安装中文输入法
- 追赶法求解线性方程组matlab,追赶法求解三对角线性方程组Matlab编程
- 伪原创工具及伪原创工具的使用技巧
- 需求分析师如何分析功能性需求
- 小程序 怎样判断数据的类型
- JAVA查询银行卡信息
- 超级账本HyperLedger的Fabric-CA的使用(两个组织一个Orderer三个Peer),带视频演示
- 计算机网络汇聚层,【大白电气】接入层、汇聚层、核心层——中大型计算机网络系统结构介绍及交换机选型建议...
- 一万多字的windows历史
热门文章
- RabbitMQ普通集群、镜像集群、集群负载均衡、压力测试、选举策略及测试、集群故障恢复【集群超大全详解】
- 阿里妈妈牟娜:定向广告新一代点击率预估主模型——深度兴趣演化网络
- 微信小程序抓包——小白自用版
- UnityEditor蒙皮动画SkinnedMeshRenderer 使用骨骼RootBones的Gizmos可视化工具和原理解析
- 法国Nao机器人如何实现舞蹈同步
- [Webkit]最简单易用的webkit学习环境-ISee
- docker pull很慢解决办法
- Nature:环境因素塑造了荷兰人的肠道微生物组
- python好用的软件_mac系统中都有什么python开发工具好用?
- 三面美团Java岗,javaweb开发实例大全基础篇代码