MyBatis一对多关联查询(级联查询)
下面以用户和订单之间的关系为例讲解一对多级联查询(实现 根据 uid 查询用户及其关联的订单信息 的功能)的处理过程,读者只需参考该实例即可学会一对多级联查询的 MyBatis 实现。
1)创建数据表本实例需要两张数据表,一张是用户表 user,一张是订单表 orders,这两张表具有一对多的级联关系。user 表在前面已创建,orders 表的创建代码如下:
CREATE TABLE `orders` ( `id` tinyint(2) NOT NULL AUTO_INCREMENT, `ordersn` varchar(10) DEFAULT NULL, `user_id` tinyint(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;2)创建持久化类
在 myBatisDemo02 应用的 com.po 包中创建数据表 orders 对应的持久化类 Orders,user 表对应的持久化类 MyUser 在前面已创建,但需要为 MyUser 添加如下属性:
// 一对多级联查询,用户关联的订单
private List Orders ordersList;
同时,需要为该属性添加 setter 和 getter 方法。
Orders 类的代码如下:
package com.po; public class Orders { private Integer id; private String ordersn; public Integer getId() { return id; public void setId(Integer id) { this.id = id; public String getOrdersn() { return ordersn; public void setOrdersn(String ordersn) { this.ordersn = ordersn; @Override public String toString() { return Orders[id= + id + ,ordersn= + ordersn + ] }3)创建映射文件
在 myBatisDemo02 应用的 com.mybatis 中创建两张表对应的映射文件 UserMapper.xml 和 OrdersMapper.xml。映射文件 UserMapper.xml 在前面已创建,但需要添加以下配置才能实现一对多级联查询(根据 uid 查询用户及其关联的订单信息):
?xml version= 1.0 encoding= UTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespace= com.mybatis.mapper.UserMapper !-- 一对多 根据uid查询用户及其关联的订单信息:级联查询的第一种方法(嵌套查询) -- resultMap type= com.po.MyUser id= userAndOrders1 id property= uid column= uid / result property= uname column= uname / result property= usex column= usex / !-- 一对多级联查询,ofType表示集合中的元素类型,将uid传递给selectOrdersByld -- collection property= ordersList ofType= com.po.Orders column= uid select= com.dao.OrdersDao.selectOrdersByld / /resultMap select id= selectUserOrdersById1 parameterType= Integer resultMap= userAndOrders1 select * from user where uid = #{id} /select !--对多根据uid查询用户及其关联的订单信息:级联查询的第二种方法(嵌套结果) -- resultMap type= com.po.MyUser id= userAndOrders2 id property= uid column= uid / result property= uname column= uname / result property= usex column= usex / !-- 对多级联查询,ofType表示集合中的元素类型 -- collection property= ordersList ofType= com.po.Orders id property= id column= id / result property= ordersn column= ordersn / /collection /resultMap select id= selectUserOrdersById2 parameterType= Integer resultMap= userAndOrders2 select u.*,o.id, o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=#{id} /select !-- 一对多 根据uid查询用户及其关联的订单信息:连接查询(使用POJO存储结果) -- select id= selectUserOrdersById3 parameterType= Integer resultType= com.pojo.SelectUserOrdersById select u.*, o.id, o.ordersn from user u, orders o where u.uid = o.user_id and u.uid=#{id} /select /mapper
OrdersMapper.xml 的配置代码如下:
?xml version= 1.0 encoding= UTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespace= com.dao.OrdersDao !-- 根据用户uid查询订单信息 -- select id= selectOrdersById resultType= com.po.Orders parameterType= Integer select * from orders where user_id=#{id} /select /mapper4)创建 POJO 类
在 myBatisDemo02 应用的 com.pojo 包中创建在第 3 步中使用的 POJO 类 com.pojo. SelectUserOrdersById。
SelectUserOrdersById 的代码如下:
package com.po; public class SelectUserOrdersById { private Integer uid; private String uname; private String usex; private Integer id; private String ordersn; // 省略setter和getter方法 @Override public String toString() { // 为了方便查看结果,重写了toString方法 return User[uid= + uid + ,uname= + uname + ,usex= + usex + ,oid= + id + ,ordersn= + ordersn + ] }5)创建数据操作接口
在 myBatisDemo02 应用的 com.dao 包中创建第 3 步中映射文件对应的数据操作接口 OrdersDao 和 UserDao。
OrdersDao 的代码如下:
package com.dao; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import com.po.Orders; @Repository( ordersDao ) @Mapper public interface OrdersDao { public List Orders selectOrdersById(Integer uid); }
UserDao 接口在前面已创建,这里只需添加如下接口方法:
package com.dao; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import com.po.MyUser; import com.po.SelectUserOrdersById; @Repository( userDao ) @Mapper public interface UserDao { public MyUser selectOrdersById1(Integer uid); public MyUser selectOrdersById2(Integer uid); public List SelectUserOrdersById selectOrdersById3(Integer uid); }6)调用接口方法及测试
在 myBatisDemo02 应用的 com.controller 包中创建 OneToMoreController 类,在该类中调用第 5 步的接口方法,同时创建测试类 TestOneToMore。
OneToMoreController 的代码如下:
@Controller( oneToMoreController ) public class oneToMoreController { @Autowired private UserDao userDao; public void test(){ //查询一个用户及订单信息 MyUser auser1 = userDao.selectUserOrderById1(1); System.out.println(auser1); System.out.println( ============================= MyUser auser2 = userDao.selectUserOrderById2(1); System.out.println(auser2); System.out.println( ============================= List SelectUserOrdersById auser3 = userDao.selectUserOrdersById3(1); System.out.println(auser3); System.out.println( ============================= }
TestOneToMore 的代码如下:
public class TestOneToMore { public static void main(String[] args) { ApplicationContext appcon = new ClassPathXmlApplicationContext( applicationContext.xml OneToMoreController otm = (OneToMoreController)appcon.getBean( oneToMoreController otm.test(); }
测试类的运行结果如图 1 所示。
![一对多级联查询结果](http://ytso-blog-oss-img.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2021/07/20/20210720_60f63ee2195e2.png)
图 1 一对多级联查询结果
22547.html
htmljavaMybatisspring相关文章
- Data Access 之 MyBatis Plus(一)- BaseMapper CRUD(Part A)
- MyBatis-Plus 之分页查询
- Springboot Mybatis使用pageHelper实现分页查询[通俗易懂]
- MyBatis-延迟加载
- Mybatis | Mybatis学习笔记(上)
- mybatis返回值_存储过程获取查询结果
- MyBatis-Plus联表查询(Mybatis-Plus-Join)
- 理论:第五章:Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的
- MyBatis源码面试题
- 基于Springboot和mybatis的外卖项目瑞吉外卖Day5
- SQL开发知识:mybatis collection 多条件查询的实现方法
- SQL开发知识:Oracle使用MyBatis中RowBounds实现分页查询功能
- Mybatis学习总结(九):查询缓存详解编程语言
- mybatis之模糊查询SQL详解编程语言
- MyBatis多对多关联查询(级联查询)
- MyBatis多对多关联查询
- MyBatis一对一关联查询
- MyBatis配置文件(mybatis-config.xml)