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>

原文地址:https://www.cnblogs.com/ywqtro/p/12249467.html

时间: 2024-10-26 06:51:03

mybatis(6)--自定义结果集(一对一)的相关文章

mybatis(7)--自定义结果集(一对多/多对一)

1.数据表 ## 一对多数据表 ## 创建班级表 create table t_clazz( `id` int primary key auto_increment, `name` varchar(50) ); ## 插入班级信息 insert into t_clazz(`name`) values('javaEE20170228'); insert into t_clazz(`name`) values('javaEE20170325'); insert into t_clazz(`name`

Struts2之—自定义结果集实现ajax

项目中我们经常遇到这样的需求--页面部分刷新,例如:添加用户,转到添加用户页面时,页面自动加载了所有部门. 完整流程:选择所属部门,填写用户名和密码,点击"注册" 填写用户名后,需要立即检查数据库是否存在此用户名,如何在不刷新页面的情况下实现此效果? 但看上面提出的问题并不难,情况很常见,都知道使用ajax实现,但是如何在struts中自定义结果集来实现ajax--这是这篇博客的重点. (注:servlet要么转发要么重定向,struts2可以自定义结果集) 转发.重定向.action

COM inerop 创建自定义互操作集 问题

1.如果com是由.net实现 则在用自定义互操作集时,会发生类型转换错误.如下: [ComImport]    [Guid("06521B83-FDE4-4882-9E29-3812D6A59AA8")]     class NetComponentWraper    {    }    [ComImport]    [CoClass(typeof(NetComponentWraper))]    [Guid("038AFEB5-A5B9-4944-8B3F-BA031A1

GradSearchCv 自定义验证集

首先解释一下什么叫使用自定义验证集进行模型调参.GridSearchCV默认使用的模型验证方法是KFold交叉验证,但很多时候我们自己已经预先分配好了验证集,我们就要在这个验证集上评价模型好坏(有些任性),所以我们并不需要GridSearchCV为我们自动产生验证集,这就是所谓的使用自定义验证集进行模型调参.好了,我们首先简单认识一下GridSearchCV的使用. 1. 问题背景现在假设我有一个训练集,特征为数组train_features,标签为数组train_labels.我还有一个测试集

MyBatis Generator 自定义生成注释

注释生成器 为了生成db里面的注释,必须自定义注释生成器 EmptyCommentGenerator: import org.mybatis.generator.api.CommentGenerator; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.

MyBatis使用自定义TypeHandler转换类型的实现方法

From: http://www.manongjc.com/article/15577.html 这篇文章主要介绍了MyBatis使用自定义TypeHandler转换类型的实现方法,本文介绍使用TypeHandler 实现日期类型的转换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异. 笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题.还好MyBa

Mybatis多表查询之一对一查询的多种实现-XML配置

Mybatis 中对于多表查询提供了非常强大的实现方式,主要是通过resultMap的结果映射对于多表查询后的返回值进行封装,让我们来看一下官网上对于resultMap的解释:resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作.实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码.R

MyBatis入门(二)---一对一,一对多

一.创建数据库表 1.1.创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybatis ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @[emai

Mybatis(四) 高级映射,一对一,一对多,多对多映射

天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种关系来讲,比如有员工和部门,一个部门中有多个员工,从部门方看,是一对多关系,而多名员工属于一个部门,是多对一关系,那么如果我们的业务需求只需要通过部门查找到所有的员工,那么我们就只需要进行单向一对多的映射,如果我们需要通过员工来查询出对应的部门,那么我们就需要进行单向多对一的映射,而如果我们这两个业