Mybatis高級映射-SELECT-一對一

概述

本章學習Mybatis查詢的一對一關係的多種實現方式。java

本系列文章是基於Mybatis 3.4.6 版本。git

建立表

建立測試使用的數據庫表,使用用戶表和用戶身份證表進行測試,用戶表與身份證是一對一關係,建立表結構以下:github

用戶表:sql

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屬性,實體類代碼以下:mybatis

SysUser:app

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文件中添加依賴,以下:測試

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-typehandlers-jsr310</artifactId>
    <version>1.0.2</version>
</dependency>

mapper映射文件配置以下:ui

<?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.github.dalianghe.mapper.SysUserMapper">

    <select id="selectSysUserById" parameterType="java.lang.Long"
            resultType="com.github.dalianghe.model.SysUserModel">
        SELECT user_account, user_password,
        <!-- idcard爲實體中定義的屬性,表示SysUserIdcard對象,再經過"."訪問其屬性,Mybatis自動映射 -->
        user_name "idcard.user_name",
        user_birthday "idcard.user_birthday"
        FROM sys_user t1, sys_user_idcard t2
        WHERE t1.idcard_id = t2.id
        AND t1.id=#{id}
    </select>

</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配置文件以下:

<?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.github.dalianghe.mapper.SysUserMapper">
    <!-- 配置resultMap,將實體屬性與sql字段進行對應 -->
    <resultMap id="SysUserMap" type="com.github.dalianghe.model.SysUserModel">
        <id property="id" column="id"/>
        <result property="userAccount" column="user_account"/>
        <result property="userPassword" column="user_password"/>
        <!-- 
            idcard爲SysUser屬性,該屬性爲SysUserIdcard對象 
            如下兩句意思爲:將user_name和user_birthday查詢字段的值映射到idcard對象的userName和userBirthday屬性中
        -->
        <result property="idcard.userName" column="user_name"/>
        <result property="idcard.userBirthday" column="user_birthday"/>
    </resultMap>

    <!--resultMap映射-->
    <select id="selectSysUserById" parameterType="java.lang.Long" resultMap="SysUserMap">
            SELECT user_account, user_password,
                        user_name, user_birthday
            FROM sys_user t1, sys_user_idcard t2
            WHERE t1.idcard_id = t2.id
            AND t1.id=#{id}
    </select>

</mapper>

Mapper接口與測試類同上,測試結果以下:

association映射

與resultMap映射類型,使用association標籤進行映射,代碼以下:

<resultMap id="SysUserMap" type="com.github.dalianghe.model.SysUserModel">
    <id property="id" column="id"/>
    <result property="userAccount" column="user_account"/>
    <result property="userPassword" column="user_password"/>

    <association property="idcard" javaType="com.github.dalianghe.model.SysUserIdcardModel">
        <result property="userName" column="user_name"/>
        <result property="userBirthday" column="user_birthday"/>
    </association>
</resultMap>

association標籤屬性有:

  • property:對應實體類中的屬性名,必填項
  • javaType:屬性對應的java類型
  • resultMap:能夠使用resultMap,替換javaType
  • columnPrefix:查詢列名的前綴,配置後,在子標籤配置result的column時能夠省略前綴,但sql字段前綴或別名必須以此開頭

測試用例與結果與上面一致。

總結

本文介紹了Mybatis一對一映射的三種方法,但願對你們有幫助。

最後建立了qq羣方便你們交流,可掃描加入,同時也可加我qq:276420284,共同窗習、共同進步,謝謝!

相關文章
相關標籤/搜索