【转】MyBatis中的collection两种使用方法
2023-09-11 14:22:19 时间
原文:MyBatis中的collection两种使用方法
转载是为记录一波,防止失联(2021年9月1日20:18:03)
表关系: 问题表
1==>n 问题选项表
,
需求: 查询问题
时候,联查出来问题选项
//问题 实体类 public class Question { private String id; //ID private String content; //问题 private String type; //问题类型 1:单选,2:多选,3:问答 private Integer sort; //排序 private List<QuestionOption> options; //问题选项 *** 问题表里不需要有这个属性对应的字段 //... }
//问题选项 实体类 public class QuestionOption{ private String id; //ID private String qid; //问题ID *** 问题选项表里需要有这个属性对应的字段 private String content; //选项 private Integer sort; //排序 //... }
方式一: 代码复用性高, 主表分页查询正确
QuestionMapper.xml
<mapper namespace="com.xxx.modules.xxx.mapper.QuestionMapper"> <resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" > <id column="id" property="id" jdbcType="VARCHAR" /> <result column="content" property="content" jdbcType="VARCHAR" /> <result column="type" property="type" jdbcType="VARCHAR" /> <result column="sort" property="sort" jdbcType="INTEGER" /> <collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.xxx.entity.QuestionOption" select="com.xxx.modules.xxx.mapper.QuestionOptionMapper.selectList" column="{qid=id,sort=sort}" /> <!-- qid/sort是定义的变量名, id/sort是主表的字段id/sort, 先查出主表的结果, 然后主表记录数是几 就执行几次 collection 的select, javaType和ofType 写不写都行, select的值: 对应xml的namespace + 对应xml中的代码片段的id, column作为select语句的参数传入,如果只传一个参数id可以简写: column="id" --> </resultMap> <!-- 查询列表 --> <select id="selectList" resultMap="BaseResultMap"> SELECT pq.id, pq.content, pq.type, pq.sort FROM question AS pq <where> </where> </select>
QuestionOptionMapper.xml
<mapper namespace="com.xxx.modules.xxx.mapper.QuestionOptionMapper"> <!-- 查询列表 --> <select id="selectList" resultType="QuestionOption"> SELECT pqo.id, pqo.content, pqo.sort FROM question_option AS pqo <where> pqo.qid = #{qid} <!-- 变量名 qid 对应上文的 qid --> <!-- 如果上文中 collection只传一个参数column="id",只要类型匹配,在这里随便写个变量名就可以取到值 #{xyz} --> </where> </select>
方式二: 只需要执行一次sql查询, 主表分页查询不正确
QuestionMapper.xml
<mapper namespace="com.xxx.modules.xxx.mapper.QuestionMapper"> <resultMap id="BaseResultMap" type="com.xxx.modules.xxx.entity.Question" > <id column="id" property="id" jdbcType="VARCHAR" /> <result column="content" property="content" jdbcType="VARCHAR" /> <result column="type" property="type" jdbcType="VARCHAR" /> <result column="sort" property="sort" jdbcType="INTEGER" /> <collection property="options" javaType="java.util.ArrayList" ofType="com.xxx.modules.data.entity.QuestionOption"> <id column="o_id" property="id" jdbcType="VARCHAR" /> <result column="o_content" property="content" jdbcType="VARCHAR" /> <result column="o_sort" property="sort" jdbcType="INTEGER" /> </collection> <!-- 列的别名 o_id,o_content,o_sort , 起别名是因为主子表都有这几个字段 这里要写 ofType, javaType还是可以不写 --> </resultMap> <!-- 查询列表 --> <select id="selectList" resultMap="BaseResultMap"> SELECT pq.id, pq.content, pq.type, pq.sort ,pqo.id AS oid ,pqo.content AS ocontent ,pqo.sort AS osort <!-- 联查子表字段,起别名 --> FROM question AS pq LEFT JOIN question_option pqo ON pq.id = pqo.qid <!-- 联查子表 --> <where> </where> </select>
注意: 主子表要查询出来的字段名重复,要起别名
相关文章
- JavaWeb_(Mybatis框架)MyBatis Generator简单入门
- Mybatis中配置Mapper的方法
- windows主机和ubuntu互传文件的4种方法
- laravel5.1框架基础之Blade模板继承简单使用方法分析
- MyBatis中通用Mapper接口以及Example的方法解析
- Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
- 5 why 分析法,一种用于归纳抽象出解决方案的好方法
- Python中elasticsearch插入和更新数据的实现方法
- 两种方法获取MyBatis刚刚插入的id
- 深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)
- mybatis配置文件不在resources目录下时需进行的额外配置方法
- Atitit mybatis topic file list Total 300ge (9+条消息)MyBatis框架核心之(五)注解使用resultMap及多表查询 - 弱弱的猿 - CSD
- Atitit mybatis使用简明教程 目录 1.1. Mybatis.xml 配置文件1 1.2. Datamp.xml mapper文件主要作用是分模块放sql语句2 1.3. 查询
- Atitit mybatisutil 模块测试功能列表 1.1. mybatis读取mapper配置的sql语句 使用xml类库1 1.2. Mybatis替换参数工具类型3 Itfs pn
- Android修行手册 - TabLayout全解析(上)-常用方法
- Android native 层的同步方法
- Python编程语言学习:利用open函数将文本内容追加写入到txt文件中(两种方法实现)
- Py之eli5:eli5库的简介、安装、使用方法之详细攻略
- MyBatis快速入门——第五章、maven整合Mybatis&Servlet_tomcat
- MyBatis快速入门——第四章、mybatis动态sql_foreach
- Hbase实用技巧:全量+增量数据的迁移方法
- 全网多种方法解决数据库有数据,但mybatis查询出来的值为Null、为空或不存在的问题
- 全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作
- Win11不识别蓝牙适配器的解决方法
- C# 扩展方法
- CentOS下安装PHP的AMQP扩展方法和步骤
- MyBatis源码第9章之继承HashMap并重写方法
- MyBatis之工作原理,简单实体的增加、修改、删除、查询_Mybatis-原理总结
- pytorch 15 模型性能分析,从loss出发到具体数据(以语义分割为例,实现深度学习中的手工TomeLinks方法)