本章學習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進行屬性和列進行映射,此一對一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接口與測試類同上,測試結果以下:
與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標籤屬性有:
測試用例與結果與上面一致。
本文介紹了Mybatis一對一映射的三種方法,但願對你們有幫助。
最後建立了qq羣方便你們交流,可掃描加入,同時也可加我qq:276420284,共同窗習、共同進步,謝謝!