• mybatis(6)自定义结果集(一对一)


    1.自定义结果集介绍

    自定义结果集,可以给复杂的对象使用。也就是对象内又嵌套一个对象。或者一个集合。在这种情况下。前面学过的知识点,已经无法直接获取出对象内对象的信息。这个时候就需要使用resultMap自定义结果集来返回需要的数据。

    2.创建数据表的sql

    ## 一对一数据表
    ## 创建锁表
    create table t_lock(
        `id` int primary key auto_increment,
        `name` varchar(50)
    );
    
    
    ## 创建钥匙表
    create table t_key(
        `id` int primary key auto_increment,
        `name` varchar(50),
        `lock_id` int ,
        foreign key(`lock_id`) references t_lock(`id`)
    );
    
    
    ## 插入初始化数据
    insert into t_lock(`name`) values('阿里巴巴');
    insert into t_lock(`name`) values('华为');
    insert into t_lock(`name`) values('联想');
    
    insert into t_key(`name`,`lock_id`) values('马云',1);
    insert into t_key(`name`,`lock_id`) values('任正非',2);
    insert into t_key(`name`,`lock_id`) values('柳传志',3);

    3.JavaBean对象(省略一些方法)

    public class Key {
        private int id;
        private String name;
    //Lock对象
    private Lock lock; } public class Lock { private int id; private String name; }

    4.一对一的使用示例

    (涉及分步查询)

    package com.mapper;
    
    import com.pojo.Key;
    
    public interface KeyMapper {
        public Key queryKeyByIdForSample(Integer id);
    
        public Key queryKeyByIdForTwoStep(int i);  
    
    }
    package com.mapper;
    
    import com.pojo.Key;
    import com.pojo.Lock;
    
    public interface LockMapper {
        
        public Lock queryLockById(Integer id);
    }

    级联属性的映射配置

    <!-- 
            resultMap标签专门用来定义自定义的结果集数据。
                type属性设置返回的数据类型
                id属性定义一个唯一标识
         -->
        <resultMap type="com.pojo.Key" id="queryKeyForSimple_resultMap">
            <!-- id定义主键列 -->
            <id column="id" property="id"/>
            <!-- result 定义一个列和属性的映射 -->
            <result column="name" property="name"/>
            <!-- lock.id 和  lock.name 叫级联属性映射 -->
            <result column="lock_id" property="lock.id"/>
            <result column="lock_name" property="lock.name"/>
        </resultMap>
        <!-- 
            select 标签用于定义一个select语句
                id属性设置一个statement标识
                parameterType设置参数的类型
                resultMap 设置返回的结果类型
         -->
        <select id="queryKeyForSimple" parameterType="int" resultMap="queryKeyForSimple_resultMap">
            select t_key.*,t_lock.name lock_name 
                from 
            t_key left join t_lock
                on
            t_key.lock_id = t_lock.id
                where 
            t_key.id = #{id}
        </select>

    <association /> 嵌套结果集映射配置

    <!-- 
            resultMap标签专门用来定义自定义的结果集数据。
                type属性设置返回的数据类型
                id属性定义一个唯一标识
         -->    
        <resultMap type="com.atguigu.bean.Key" id="queryKeyForSimple_resultMap_association">
            <!-- id定义主键列 -->
            <id column="id" property="id"/>
            <!-- result 定义一个列和属性的映射 -->
            <result column="name" property="name"/>
            <!-- 
                association 标签可以给一个子对象定义列的映射。
                    property 属性设置 子对象的属性名 lock
                    javaType 属性设置子对象的全类名
             -->
            <association property="lock" javaType="com.pojo.Lock">
                <!-- id 属性定义主键 -->
                <id column="lock_id" property="id"/>
                <!-- result 标签定义列和对象属性的映射 -->
                <result column="lock_name" property="name"/>
            </association>
        </resultMap>

    定义分步查询

    LockMapper.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.mapper.LockMapper">
    
        <select id="queryLockById" resultType="com.pojo.Lock">
            select id,name from t_lock where id = #{id}
        </select>
    </mapper>

    KeyMapper.xml中的实现

    <!-- public Key queryKeyByIdForTwoStep(int i); -->
        <resultMap type="com.pojo.Key" id="queryKeyByIdForTwoStep_resultMap">
            <id column="id" property="id" />
            <result column="name" property="name" />
        <!-- 
                association标签定义一个子对象的集合集
                    property 属性映射子对象的名称
                    select 属性定义执行的查询语句
                    也就是说。property指定的lock子对象,是通过执行。select标识的查询语句返回
                    column 属性定义需要传递给select语句的参数
             -->
            <association property="lock" column="lock_id"
                select="com.mapper.LockMapper.queryLockById" />
        </resultMap>
    
        <select id="queryKeyByIdForTwoStep" resultMap="queryKeyByIdForTwoStep_resultMap">
            select
            id,name,lock_id from t_key where id = #{id}
        </select>
  • 相关阅读:
    牛客网暑期ACM多校训练营(第一场)
    ACM-ICPC-Swiss-Subregional 2017 训练日志
    2016 全国多校第二场 训练日志
    2018湖南多校第八场 训练日志
    2017 全国多校第九场 训练日志
    2017 全国多校第十场 训练日志
    2014 Kuala Lumpur 训练日志
    2018湖南多校第五场-20180506 训练日志
    2017icpc 花莲训练日志
    面试总结
  • 原文地址:https://www.cnblogs.com/ywqtro/p/12249467.html
Copyright © 2020-2023  润新知