Mybatis实现多表查询(一对一、一对多、多对多)
文章目录
- 一、一对一查询
- 1.1 模型
- 1.2 SQL语句
- 1.3 创建Order和User实体类
- 1.4 创建OrderMapper接口
- 1.5 配置OrderMapper.xml
- 1.6 测试
- 二、一对多查询
- 2.1 模型
- 2.2 SQL语句
- 2.3 修改User和Order实体类
- 2.4 创建UserMapper接口
- 2.5 创建UserMapper.xml
- 2.6 测试
- 三、多对多查询
- 3.2 SQL语句
- 3.3 修改User类,创建Role类
- 3.4 UserMapper接口添加方法
- 3.5 配置UserMapper.xml
- 3.6 测试
- 四、小结
一、一对一查询
1.1 模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对一查询的需求:查询一个订单,与此同时查询出该订单所属的用户
1.2 SQL语句
对应的sql语句:select * from orders o,user u where o.uid=u.id
查询结果如下:
1.3 创建Order和User实体类
Order.java
public class Order { private int id; private Date ordertime; private double total; //代表当前订单从属于哪一个客户 private User user;// 省略get set方法
}
User.java
public class User {private int id; private String username; private String password; private Date birthday;// 省略get set方法
}
1.4 创建OrderMapper接口
public interface OrderMapper { List<Order> findAll();
}
1.5 配置OrderMapper.xml
通过sql
查询并封装数据,此处返回类型使用的resultMap
,在这里完成数据的封装。
<mapper namespace="com.happy.mapper.OrderMapper"><resultMap id="orderMap" type="order"><!--手动指定字段与实体属性的映射关系column: 数据表的字段名称property:实体的属性名称--><id column="oid" property="id"></id><result column="ordertime" property="ordertime"></result><result column="total" property="total"></result><result column="uid" property="user.id"></result><result column="username" property="user.username"></result><result column="password" property="user.password"></result><result column="birthday" property="user.birthday"></result></resultMap> <select id="findAll" resultMap="orderMap"> select * from orders o,user u where o.uid=u.id </select>
</mapper>
当然,除了改方式外,还可通过association
完成对象封装,如下:
<resultMap id="orderMap" type="order"><!--手动指定字段与实体属性的映射关系column: 数据表的字段名称property:实体的属性名称--><id column="oid" property="id"></id><result column="ordertime" property="ordertime"></result><result column="total" property="total"></result><result column="uid" property="user.id"></result><!--property: 当前实体(order)中的属性名称(private User user)javaType: 当前实体(order)中的属性的类型(User)--><association property="user" javaType="user"><id column="uid" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result></association>
</resultMap>
1.6 测试
执行测试代码,如下:
@Test
public void test1() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);List<Order> orderList = mapper.findAll();for (Order order : orderList) {System.out.println(order);}sqlSession.close();
}
输出结果为:
二、一对多查询
2.1 模型
用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户
一对多查询的需求:查询一个用户,与此同时查询出该用户具有的订单
2.2 SQL语句
对应的sql语句:select *,o.id oid from user u left join orders o on u.id=o.uid;
查询的结果如下:
2.3 修改User和Order实体类
Order.java
public class Order { private int id; private Date ordertime; private double total; //代表当前订单从属于哪一个客户 private User user;// 省略get set方法
}
User.java
public class User { private int id; private String username; private String password; private Date birthday;//代表当前用户具备哪些订单 private List<Order> orderList;// 省略get set方法
}
2.4 创建UserMapper接口
public interface UserMapper { List<User> findAll();
}
2.5 创建UserMapper.xml
<resultMap id="userMap" type="user"><id column="uid" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><!--配置集合信息property:集合名称ofType:当前集合中的数据类型--><collection property="orderList" ofType="order"><!--封装order的数据--><id column="oid" property="id"></id><result column="ordertime" property="ordertime"></result><result column="total" property="total"></result></collection>
</resultMap><select id="findAll" resultMap="userMap">SELECT *,o.id oid FROM USER u,orders o WHERE u.id=o.uid
</select>
2.6 测试
执行如下测试代码:
@Test
public void test2() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> all = mapper.findAll();for(User user : all){ System.out.println(user.getUsername()); List<Order> orderList = user.getOrderList(); for(Order order : orderList){ System.out.println(order); } System.out.println("----------------------------------");}sqlSession.close();
}
输出结果为:
三、多对多查询
用户表和角色表的关系为,一个用户有多个角色,一个角色被多个用户使用
多对多查询的需求:查询用户同时查询出该用户的所有角色
3.2 SQL语句
对应的sql语句:select u.*,r.*,r.id rid from user u left join user_role ur on u.id=ur.user_id inner join role r on ur.role_id=r.id;
查询的结果如下:
3.3 修改User类,创建Role类
public class Role { private int id; private String rolename;// 省略get set方法
}
public class User { private int id; private String username; private String password; private Date birthday;//代表当前用户具备哪些订单 private List<Order> orderList;//代表当前用户具备哪些角色 private List<Role> roleList;// 省略get set方法
}
3.4 UserMapper接口添加方法
添加查询方法,如下:
List<User> findAllUserAndRole();
3.5 配置UserMapper.xml
<resultMap id="userRoleMap" type="user"><!--user的信息--><id column="userId" property="id"></id><result column="username" property="username"></result><result column="password" property="password"></result><result column="birthday" property="birthday"></result><!--user内部的roleList信息--><collection property="roleList" ofType="role"><id column="roleId" property="id"></id><result column="roleName" property="roleName"></result><result column="roleDesc" property="roleDesc"></result></collection></resultMap><select id="findUserAndRoleAll" resultMap="userRoleMap">SELECT * FROM USER u,sys_user_role ur,sys_role r WHERE u.id=ur.userId AND ur.roleId=r.id</select>
3.6 测试
执行如下测试代码:
@Test
public void test3() throws IOException {InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);List<User> all = mapper.findAllUserAndRole();for(User user : all){ System.out.println(user.getUsername()); List<Role> roleList = user.getRoleList(); for(Role role : roleList){ System.out.println(role); } System.out.println("----------------------------------");}sqlSession.close();
}
输出结果为:
四、小结
Mybatis
多表配置方式:
- 一对一,使用
<resultMap>
做配置 - 一对多,使用
<resultMap>
和<collection>
做配置 - 多对多,使用
<resultMap>
和<collection>
做配置
Mybatis实现多表查询(一对一、一对多、多对多)相关推荐
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...
- Mybatis中的关系映射(一对一,一对多,多对多)
在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...
- mybatis 多表查询 一对一 一对多查询
本文举例: 1.订单信息表 2.订单详情表 3.发票表 三表关系: 订单信息表 订单信息详情表 1:n 订单信息表 发票表 1:1 需求: 查询订单表订单详情表和发票表所有信息: <!-- 订单 ...
- 【Mybatis】多表查询(一对多、多对一)
先说明一下本文的例子:学生-老师. 一对多:查询某位老师的所有学生. 多对一:查询所有学生以及他们的老师. 1. resultMap resultMap 元素是 MyBatis 中最重要最强大的元素. ...
- 【MyBatis】多表查询
MyBatis的多表查询 表之间的关系:一对多,多对一,一对一,多对多. 一对多:一个班级对应多个学生 多对一:多个学生对应一个班级 一对一:一个人对应一个身份证号码 多对多:一个订单可以有多个商品, ...
- Mybatis连3表查询数据resultMap结果映射
Mybatis连结3表查询数据resultMap结果映射 一.前言 Mybatis实现了sql与java代码的分离,达到了解耦合的目的,配置sql语句时有个resultType="" ...
- mybatis的一对一 一对多 多对多
mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...
- Mybatis实现关联表查询
Mybatis实现关联表查询 6.1. 一对一关联 1). 提出需求 根据班级 id 查询班级信息(带老师的信息) 2). 创建表和数据 [](javascript:void(0)
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
最新文章
- linux 以太网转wifi,LINUX-网络 - (以太网和WIFI无线)
- python cookbook 中文第四版_Python Cookbook (4)
- Unity——用UnityEditor拷贝FBX中的AnimationClip
- 华为服务器型号命名,服务器的命名规则
- RS-232、RS-422与RS-485标准
- 敏捷测试与普通测试的区别
- 遥感数据集_最新高光谱遥感数据集
- 这周学点变速不变调、变调不变速
- 6、Spring事务配置上篇
- 无法连接虚拟设备 ide1:0,因为主机上没有相应的设备。 您要在每次开启此虚拟机时都尝试连接此虚拟设备吗?
- 定义方法,实现两个整数的加法
- 元宇宙研讨会-空间设计与交互技术构造的叙事世界
- 静态路由Route不生效的解决方法
- ThinkPad E40 XP 安装SATA/AHCI驱动
- 判断三极管是否是NPN与PNP,并判断EBC
- python爬虫模块排名_Python爬虫使用lxml模块爬取豆瓣读书排行榜并分析
- Java自学,Java面试,Java培训
- MongoDb企业应用实战(一) 写在MongoDB应用介绍之前(ii)
- EMC-浪涌防护及退耦设计
- 我爱大自然教案计算机,我爱大自然大班教案
热门文章
- 用Java写微信支付Jsp进行下单操作
- 距A轮融资不到七个月,Incode再获2.2亿美元B轮融资,跃升为独角兽企业
- C# Winform 中如何获取本机安装输入法,并设置为默认输出语言,如何打开搜狗输入法和手写板...
- 使用 GROW 模型
- 苹果自带跳语音服务器,iOS自带文本转语音技术(TTS)的实现即语音播报的实践
- iec104协议 java_GitHub - delikely/IEC104_microgrid: iec104协议主站客户端程序,属于微电网管理系统一部分...
- Windows NT 6 终极瘦身
- OA系统工作台集成云星空轻分析功能
- 关于Python装饰器的一些理解
- 开源智能相机- Xilinx Zynq-7000高清图像处理模块