资讯专栏INFORMATION COLUMN

Mybatis高级映射-SELECT-一对一

CastlePeaK / 3320人阅读

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

概述

本章学习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

发表评论

0条评论

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