Mybatis处理复杂查询环境

复杂查询环境

多对一和一对多

多个工作者对应一个协调人

对于工作者(worker)而言,多个工作者关联一个协调人(coordinator)(多对一,关联)
对于协调人而言,一个协调人有很多工作者(一对多,集合)
在程序开发中,也会遇到类似的情况,这时就会涉及到Mybatis中结果映射的associationcollection

实例

创建数据表

coordinator表

CREATE TABLE `coordinator`(`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO coordinator(`id`, `name`) VALUES(1, "Alex");

worker表

CREATE TABLE `worker`(`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`cid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),FOREIGN KEY (`cid`) REFERENCES `coordinator` (`id`) 
)ENGINE = INNODB DEFAULT CHARSET=utf8mb4;INSERT INTO `worker` (`id`, `name`, `cid`) VALUES (1, '小明', '1');
INSERT INTO `worker` (`id`, `name`, `cid`) VALUES (2, '小红', '1');
INSERT INTO `worker` (`id`, `name`, `cid`) VALUES (3, '小方', '1');
INSERT INTO `worker` (`id`, `name`, `cid`) VALUES (4, '小芳', '1');
INSERT INTO `worker` (`id`, `name`, `cid`) VALUES (5, '小王', '1');

环境搭建

创建核心配置文件(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties"/><settings><setting name="logImpl" value="LOG4J"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments>
</configuration>

创建配置文件(db.properties)

username = root
password = root
url = jdbc:mysql://localhost:3306/mybatis
driver = com.mysql.cj.jdbc.Driver

创建工具类(MybatisUtil)

public class MybatisUtil {private  static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}

文件准备

①导入相关依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.16</version>
</dependency>
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

②新建实体类

Coordinator类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Coordinator {private int id;private String name;
}

Worker类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Worker {private int id;private String name;//工作者需要关联协调人private Coordinator coordinator;
}

③创建Mapper接口

CoordinatorMapper

public interface CoordinatorMapper {@Select("select * from coordinator where id = #{cid}")Coordinator select(@Param("cid") int id);
}

WorkerMapper

public interface WokerMapper {
}

④创建Mapper.xml

CoordinatorMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.louis.dao.CoordinatorMapper"></mapper>

WorkerMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.louis.dao.WokerMapper"></mapper>

⑤在核心配置文件中绑定注册Mapper接口或文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties"/><settings><setting name="logImpl" value="LOG4J"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper class="com.louis.dao.CoordinatorMapper"/><mapper class="com.louis.dao.WokerMapper"/></mappers>
</configuration>

⑥测试是否成功

public class MyTest {static Logger logger = Logger.getLogger(MyTest.class);@Testpublic void test(){SqlSession sqlSession = MybatisUtil.getSqlSession();CoordinatorMapper mapper = sqlSession.getMapper(CoordinatorMapper.class);Coordinator select = mapper.select(1);logger.info(select);sqlSession.close();}
}
//注意导入Logger为:import org.apache.log4j.Logger;

在这里插入图片描述

特别提醒:以上只是为了测试配置文件是否正确。

多对一处理

WorkerMapper接口

public interface WorkerMapper {//查询所有的工作人员和它们对应的协调人的信息List<Worker> getWorker2();List<Worker> getWorker();
}

方式一(按照查询嵌套处理)

WorkerMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.louis.dao.WorkerMapper"><!--<select id="getWorker" resultType="com.louis.pojo.Worker">--><!--思路:1、查询所有的工作人员信息2、根据查询出来的工作人员的cid,寻找对应的协调人--><!--select w.id, w.name, c.name from worker as w, coordinator as c where w.tid = c.id;--><!--select * from worker;--><!--</select>--><select id="getWorker" resultMap="WorkerCoordinator">select * from worker;</select><resultMap id="WorkerCoordinator" type="com.louis.pojo.Worker"><!--column 数据库中的字段, property实体类中的属性--><result property="id" column="id"/><result property="name" column="name"/><!--复杂的属性我们需要单独做处理 对象使用association 集合使用collection--><association property="coordinator" column="cid" javaType="com.louis.pojo.Coordinator" select="getCoordinator"/></resultMap><select id="getCoordinator" resultType="com.louis.pojo.Coordinator">select * from coordinator where id = #{id};</select>
</mapper>

测试

@Test
public void getWorker(){SqlSession sqlSession = MybatisUtil.getSqlSession();WorkerMapper mapper = sqlSession.getMapper(WorkerMapper.class);List<Worker> worker = mapper.getWorker();System.out.println("worker = " + worker);sqlSession.close();
}
//结果
worker = [Worker(id=1, name=小明, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=2, name=小红, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=3, name=小方, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=4, name=小芳, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=5, name=小王, coordinator=Coordinator(id=1, name=Alex))]

方式二(按照结果嵌套处理)

WorkerMapper.xml

<!--
方式二:按照结果嵌套处理
思路:1、查询所有的工作人员信息2、根据查询出来的工作人员的cid,寻找对应的协调人
-->
<select id="getWorker2" resultMap="WorkerCoordinator02"><!--使用我们常用的查询语句,并且相应的给一些别名-->select w.id as wid, w.name as wname, c.name as cnamefrom worker as w, coordinator as cwhere w.cid = c.id;
</select>
<resultMap id="WorkerCoordinator02" type="com.louis.pojo.Worker"><result property="id" column="wid"/><result property="name" column="wname"/><association property="coordinator" javaType="com.louis.pojo.Coordinator"><result property="name" column="cname"/></association>
</resultMap>

测试

@Test
public void getWorker2(){SqlSession sqlSession = MybatisUtil.getSqlSession();WorkerMapper mapper = sqlSession.getMapper(WorkerMapper.class);List<Worker> worker = mapper.getWorker2();System.out.println("worker = " + worker);sqlSession.close();
}
//结果 
worker = [Worker(id=1, name=小明, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=2, name=小红, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=3, name=小方, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=4, name=小芳, coordinator=Coordinator(id=1, name=Alex)), 
Worker(id=5, name=小王, coordinator=Coordinator(id=1, name=Alex))]

一对多处理

比如一个协调人对应多个工作人员,对于协调人而言,就是一对多的关系,除了实体类外和多对一的环境相同。

实体类

Worker

public class Worker {private int id;private String name;private int cid;
}

Coordinator

public class Coordinator {private int id;private String name;//一个协调人协调多个工作人员private List<Worker> worker;
}

CoordinatorMapper接口

public interface CoordinatorMapper {//获取指定协调人下的所有工作人员和协调人的信息Coordinator getCoordinatorTarget(@Param("cid") int cid);Coordinator getCoordinatorTarget01(@Param("id") int id);
}

方式一(按照查询嵌套处理)

CoordinatorMapper.xml

<!--按查询嵌套处理-->
<select id="getCoordinatorTarget01" resultMap="CoordinatorWorker01">select * from mybatis.coordinator where id = #{id}
</select>
<resultMap id="CoordinatorWorker01" type="com.louis.entity.Coordinator"><result property="id" column="id"/><result property="name" column="name"/><collection property="worker" javaType="ArrayList" ofType="com.louis.entity.Worker" select="getWorkerById" column="id"/>
</resultMap>
<select id="getWorkerById" resultType="com.louis.entity.Worker">select * from worker where cid = #{id}
</select>

测试

@Test
public void myTest01(){SqlSession sqlSession = MybatisUtil.getSqlSession();CoordinatorMapper mapper = sqlSession.getMapper(CoordinatorMapper.class);Coordinator coordinatorTarget = mapper.getCoordinatorTarget(1);System.out.println("coordinatorTarget = " + coordinatorTarget);sqlSession.close();
coordinatorTarget = Coordinator(id=1, name=Alex, worker=[Worker(id=1, name=小明, cid=0),Worker(id=2, name=小红, cid=0),Worker(id=3, name=小方, cid=0),Worker(id=4, name=小芳, cid=0),Worker(id=5, name=小王, cid=0)])

方式二(按照结果嵌套处理)

CoordinatorMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.louis.dao.CoordinatorMapper">
<!--按结果嵌套查询--><select id="getCoordinatorTarget" resultMap="CoordinatorWorker">select c.id, c.`name`, w.id as wid, w.`name`as wnamefrom coordinator as c, worker as wwhere c.id = w.cid and c.id = #{cid}</select><resultMap id="CoordinatorWorker" type="com.louis.entity.Coordinator"><result property="id" column="id"/><result property="name" column="name"/><!--复杂的属性我们需要单独做处理 对象使用association 集合使用collectionjavaType=""指定属性的类型,集合中泛型信息我们需要使用的是ofType--><collection property="worker" ofType="com.louis.entity.Worker"><result property="id" column="wid"/><result property="name" column="wname"/></collection></resultMap>
</mapper>

测试

@Test
public void myTest02(){SqlSession sqlSession = MybatisUtil.getSqlSession();CoordinatorMapper mapper = sqlSession.getMapper(CoordinatorMapper.class);Coordinator coordinator = mapper.getCoordinatorTarget01(1);System.out.println("coordinator = " + coordinator);sqlSession.close();
//结果
coordinatorTarget = Coordinator(id=1, name=Alex, worker=[Worker(id=1, name=小明, cid=0),Worker(id=2, name=小红, cid=0),Worker(id=3, name=小方, cid=0),Worker(id=4, name=小芳, cid=0),Worker(id=5, name=小王, cid=0)])

注意:使用association用于(多对一) 和collection用于(一对多),此外

javaType用来指定实体类中属性的类型

ofType用来指定映射到List或集合中的pojo类型,泛型中的约束类型。如:List<worker>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7612.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node版本管理工具nvm手册

文章目录 下载使用命令node.js其他版本下载下载exe版解压改名放入到指定位置 下载 github下载 使用命令 查看当前版本 nvm -v 查看被管理的node nvm list 切换node版本 nvm use 14.21.3 node.js其他版本下载 下载链接 下载exe版 解压改名放入到指定位置

【Squid二】使用squid和nginx服务搭建反向缓存代理服务

使用squid和nginx服务搭建反向缓存代理服务 1.反向代理1.1 反向代理概述1.2 反向代理工作机制 2.搭建squid反向代理服务2.1 Nginx服务器端配置2.2 squid反向代理服务器配置 3.搭建nginx反向缓存代理服务3.1 nginx反向缓存代理服务配置3.2 nginx服务端配置3.3 客户端验证访问 参…

老照片修复:模糊褪色有划痕的老旧照片如何修复?

在我们的生活中&#xff0c;照片是记录我们生活的重要方式之一。无论是在手机相册里还是在家中的相册里&#xff0c;我们都有很多珍贵的照片&#xff0c;但是随着时间的推移&#xff0c;照片也会老化&#xff0c;甚至出现褪色、划痕、折痕、破损、发霉等情况&#xff0c;这些情…

2核4G服务器_4M带宽_CPU性能测评_60G系统盘

阿里云2核4G服务器297元一年、4M公网带宽、60G系统盘&#xff0c;阿里云轻量应用服务器2核4G4M带宽配置一年297.98元&#xff0c;2核2G3M带宽轻量服务器一年108元12个月&#xff0c;如下图&#xff1a; 目录 阿里云2核4G4M轻量应用服务器 2核4G服务器限制条件 轻量服务器介…

第 7 章 集合-----Scala集合继承图

7.1.1 不可变集合继承图 7.1.2 可变集合继承图 7.2.3 不可变数组与可变数组的转换 7.7.6 复杂 WordCount 案例 1&#xff09;方式一 object TestWordCount {def main(args: Array[String]): Unit {// 第一种方式&#xff08;不通用&#xff09;val tupleList List(("H…

自定义MVC

目录 一、MVC概念描述 1、什么是MVC&#xff1f; 2、什么是自定义MVC&#xff1f; 3、自定义MVC有什么用&#xff08;主要用途&#xff09;&#xff1f; 二、MVC三层架构 第一种版本 JSP页面 servlet 结果 第二种版本 JSP代码 servlet 结果 第三种版本 jsp页面 s…

HIve中的查询语句

文章目录 Hive中的查询语句1. 基础语法2. 基本查询&#xff08;Select…From&#xff09;2.1 数据准备&#xff08;0&#xff09;原始数据&#xff08;1&#xff09;创建部门表&#xff08;2&#xff09;创建员工表&#xff08;3&#xff09;导入数据 2.2 全表和特定列查询1&am…

Flutter 实现任意控件拖动

文章目录 前言一、如何实现&#xff1f;1、使用GestureDetector响应拖动事件2、使用Transform变换控件位置3、计算拖动区域 二、完整代码三、使用示例1、基本用法 总结 前言 使用flutter开发是需要控件能拖动&#xff0c;比如画板中的元素&#xff0c;或者工具条&#xff0c;搜…

arcgis api for JavaScript4.2x 在vue中白膜图层的加载、(分类、分段)渲染

这篇文章是对有webgis前端开发经验的人 1、假设之前的三维视图均已成功加载&#xff0c;获取到了三维视图&#xff0c;这里的三维视图变量定义的名字是mapView。&#xff08;PS&#xff1a;三维视图mapview在项目初始化已经设置了&#xff0c;本示例中会直接使用调用结果&…

Unity 热力图效果实现 笔记

Unity 热力图效果实现 笔记 参考文献连接&#xff1a; 1、人体热力图shader graph实现&#xff08;URP&#xff09; 超链接&#xff1a; https://www.youtube.com/watch?vKlMON4Dzq_0&t51s shader forge 翻译通用管线下 连接点实现方案&#xff1a; 2、碰撞热力图实现…

【python爬虫应用03】csdn个人所有文章质量分查询

&#x1f6e0;️ 环境准备 在开始编写代码之前&#xff0c;我们需要进行一些环境准备。以下是所需的环境和库&#xff1a; 操作系统&#xff1a;Windows编程语言&#xff1a;Python 3编辑器&#xff1a;VSCode&#xff08;可选&#xff09; 安装所需的库&#xff1a; reque…

php宝塔搭建EMLOG站长工具箱网站自适应PC手机端php源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。本期给大家带来一套站长工具箱网站自适应PC手机端php源码。感兴趣的朋友可以自行下载学习。 技术架构 PHP5.6 nginx mysql5.6 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xff0c;宝塔添…