zoukankan      html  css  js  c++  java
  • 【转】MyBatis中的collection两种使用方法

    原文: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>

    注意: 主子表要查询出来的字段名重复,要起别名


  • 相关阅读:
    webservice系统学习笔记9-使用契约优先的方式的一个服务端demo(隐式传Header信息)
    webservice系统学习笔记8-简单的权限校验
    JS获取浏览器高宽度,屏幕分辨率和一些定位空隙等
    基于jquery ui修改的不依赖第三方的背景透明的弹出div
    1个比较简单的使用java反射机制获取前台数据进行数据封装的例子
    J2EE项目集成SAP的BO报表
    php-------unset销毁变量并释放内存
    微信小程序------MD5加密(支持中文和不支持中文)和网络请求(get和post)
    谈谈http与https
    php--------合并2个数字键数组的值
  • 原文地址:https://www.cnblogs.com/Guhongying/p/15216298.html
Copyright © 2011-2022 走看看