资讯专栏INFORMATION COLUMN

Mybatis高级映射-SELECT-一对一

CastlePeaK / 3151人阅读

摘要:概述本章学习查询的一对一关系的多种实现方式。本系列文章是基于版本。总结本文介绍了一对一映射的三种方法,希望对大家有帮助。最后创建了群方便大家交流,可扫描加入,同时也可加我,共同学习共同进步,谢谢

概述

本章学习Mybatis查询的一对一关系的多种实现方式。

本系列文章是基于Mybatis 3.4.6 版本。

创建表

创建测试使用的数据库表,使用用户表和用户身份证表进行测试,用户表与身份证是一对一关系,创建表结构如下:

用户表:

CREATE TABLE `sys_user` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT "主键",
  `user_account` varchar(50) COLLATE utf8_bin NOT NULL COMMENT "用户账户",
  `user_password` char(32) COLLATE utf8_bin NOT NULL COMMENT "MD5加密的用户密码",
  `user_email` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT "用户邮箱",
  `user_phone` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT "手机号",
  `idcard_id` bigint(11) unsigned DEFAULT NULL COMMENT "身份证信息表ID",
  `created_date` datetime NOT NULL COMMENT "创建时间",
  `modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "修改时间",
  `yn` tinyint(1) unsigned NOT NULL DEFAULT "1" COMMENT "是否有效(0无效,1有效)",
  `modified_user` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT "修改人",
  `remark` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT "备注",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT="用户表";

用户身份证信息表:

CREATE TABLE `sys_user_idcard` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT "主键",
  `user_name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT "姓名",
  `user_sex` tinyint(1) unsigned NOT NULL COMMENT "性别1:男  2:女",
  `user_birthday` date NOT NULL COMMENT "出生日期",
  `user_address` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT "住址",
  `idcard_no` varchar(18) COLLATE utf8_bin NOT NULL COMMENT "身份证号码",
  `issuing_authority` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT "签发机关",
  `indate_start` date DEFAULT NULL COMMENT "有效期开始日期",
  `indate_end` date DEFAULT NULL COMMENT "有效期结束日期",
  `created_date` datetime NOT NULL COMMENT "创建时间",
  `modified_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "修改时间",
  `yn` tinyint(1) unsigned NOT NULL DEFAULT "1" COMMENT "是否有效(0无效,1有效)",
  `modified_user` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT "修改人",
  `remark` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT "备注",
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT="身份证信息表";
自动映射

通过数据库表关系,我们在sys_user表中添加了外键列,关联sys_user_idcard表主键,所有在创建实体时,在SysUser类中增加SysUserIdcard属性,实体类代码如下:

SysUser:

package com.github.dalianghe.model;

import com.github.dalianghe.mapper.SysUserIdcardModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Setter
@Getter
@ToString
public class SysUserModel{

    /** 用户账户 */
    private String userAccount;
    /** 用户密码 */
    private String userPassword;
    /** 用户身份证信息 */
    private SysUserIdcardModel idcard;

}

SysUserIdcard:

package com.github.dalianghe.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDate;

@Setter
@Getter
@ToString
public class SysUserIdcardModel{
    /** 用户姓名 */
    private String userName;
    /** 出生日期 */
    private LocalDate userBirthday;
    /** ... 省略其他属性 ...*/

}

注意:本例子我们使用了JSR310规范(如:LocalDate),故需在pom文件中添加依赖,如下:


    org.mybatis
    mybatis-typehandlers-jsr310
    1.0.2

mapper映射文件配置如下:







    


Mapper接口代码如下:

package com.github.dalianghe.mapper;

import com.github.dalianghe.model.SysUserModel;

public interface SysUserMapper {

    SysUserModel selectSysUserById(Long id) throws Exception;

}

测试方法代码如下:

@Test
public void testSelectSysUserById(){
    SqlSession sqlSession = getSqlSession();
    try{
        SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
        SysUserModel user =  sysUserMapper.selectSysUserById(20L);
        System.out.println("按用户ID查询用户信息:" + user.toString());
        //sqlSession.commit();
    }catch (Exception e){
        e.printStackTrace();
        //sqlSession.rollback();
    }finally {
        sqlSession.close();
    }
}

结果如下:

通过结果日志可知,Mybatis自动将关联的身份证信息通过属性映射到用户对象中。

resultMap映射

对于查询可通过resultMap进行属性和列进行映射,此一对一mapper配置文件如下:






    
    
        
        
        
        
        
        
    

    
    


Mapper接口与测试类同上,测试结果如下:

association映射

与resultMap映射类型,使用association标签进行映射,代码如下:


    
    
    

    
        
        
    

association标签属性有:

property:对应实体类中的属性名,必填项

javaType:属性对应的java类型

resultMap:可以使用resultMap,替换javaType

columnPrefix:查询列名的前缀,配置后,在子标签配置result的column时可以省略前缀,但sql字段前缀或别名必须以此开头

测试用例与结果与上面一致。

总结

本文介绍了Mybatis一对一映射的三种方法,希望对大家有帮助。

最后创建了qq群方便大家交流,可扫描加入,同时也可加我qq:276420284,共同学习、共同进步,谢谢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71368.html

相关文章

  • 通过项目逐步深入了解Mybatis<三>

    摘要:场合常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用将每一条记录映射到中,在前端页面遍历中是即可。作用将关联查询信息映射到一个对象中。 相关阅读: 1、通过项目逐步深入了解Mybatis 2、 通过项目逐步深入了解Mybatis 本项目所有代码及文档都托管在 Github地址:https://github.com/zhisheng17/myb...

    khlbat 评论0 收藏0
  • MyBatis理解与掌握(关联查询)

    摘要:订单信息与订单明细为一对多关系。例如先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快。作用将关联查询信息映射到一个对象中。 MyBatis理解与掌握(关联查询) @(MyBatis)[Java, 框架, MyBatis] 一对一查询 案例:查询所有订单信息,关联查询下单用户信息 showImg(https://segmentfault...

    MiracleWong 评论0 收藏0
  • Mybatis【配置文件】就是这么简单

    摘要:场合常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用将每一条记录映射到中,在前端页面遍历中是即可。如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。 配置文件和映射文件还有挺多的属性我还没有讲的,现在就把它们一一补全 映射文件 在mapper.xml文件中配置很多的sql语句,执行每个sql语句时,封装...

    freewolf 评论0 收藏0
  • 通过项目逐步深入了解Mybatis(四)

    摘要:相关阅读通过项目逐步深入了解一通过项目逐步深入了解二通过项目逐步深入了解三本项目所有代码及文档都托管在地址延迟加载什么是延迟加载可以实现高级映射使用实现一对一及一对多映射,具备延迟加载功能。一级缓存是级别的缓存。 相关阅读: 1、通过项目逐步深入了解Mybatis 2、通过项目逐步深入了解Mybatis 3、通过项目逐步深入了解Mybatis 本项目所有代码及文档都托管在 Github...

    kuangcaibao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<