1. 程式人生 > >MyBatis 筆記(四)——實體類屬性和表字段的對映

MyBatis 筆記(四)——實體類屬性和表字段的對映

之前的章節將的實體類屬性名和表字段名都是相同的,MyBatis 會自動去對映。那麼問題來了,如果實體類屬性名和表字段名不相同時,MyBatis 能智慧地去對映到嗎?答案是:不能。這裡用兩種解決方案:
1. 在使用 SQL 語句的時候,為每個欄位定義別名;
2. 使用 MyBatis 對映檔案的 resultMap 標籤。

使用別名

使用別名這個很容易理解,因為日常在寫 SQL 語句時,通常會用到別名。如:

SELECT Count(*) AS total
FROM order

而這裡說的別名和 SQL 語句的別名是一回事,只不過每個欄位的別名必須是其對應的實體類屬性名。

<select
id="selectWithAlias" parameterType="int" resultType="Order"> select order_id id, order_no orderNo, order_price price from orders where order_id = #{id} </select>

可能會有人問,如果我不使用別名會怎麼樣?如果不使用別名,那麼 MyBatis 找不到對映的屬性,導致最終的結果返回 null

使用 resultMap

另一種 MyBatis 的方式是在對映檔案中使用 resultMap 標籤。這種方式是使用MyBatis提供的解決方式來解決欄位名和屬性名的對映關係的。在 resultMap

中 id 和 result 有幾個屬性需要了解下:

屬性 說明
column 資料庫表的列名
property 需要對映到JavaBean 的屬性名稱
javaType 一個完整的類名,或者是一個型別名。如果你匹配的是一個JavaBean,那 MyBatis 通常會自行檢測到。如果你是要對映到一個 HashMap,那你需要指定 javaType 要達到的目的。
jdbcType 資料庫表支援的型別。這個屬性只在 insert,update 或delete 的時候針對允許空的列有用。JDBC 需要這項,但 MyBatis 不需要。如果你是直接針對 JDBC 編碼,且有允許空的列,而你要指定這項。
typeHandler 使用這個屬性可以覆寫型別處理器。這項值可以是一個完整的類名,也可以是一個類型別名。
<select id="selectWithMapping" parameterType="int" resultMap="OrderMapping">
    select order_id, order_no, order_price
    from orders
    where order_id = #{id}
</select>
<!-- 通過<resultMap>對映實體類屬性名和表的欄位名對應關係 -->
<resultMap id="OrderMapping" type="Order">
    <!-- id屬性來對映主鍵欄位 -->
    <id column="order_id" property="id" javaType="int"/>
    <!-- result屬性對映非主鍵欄位 -->
    <result column="order_no" property="orderNo" javaType="String"/>
    <result column="order_price" property="price"/>
</resultMap>

完整的對映檔案:

<?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="edu.wzm.mybatis.mapping.orderMapper">

    <insert id="insert" parameterType="Order">
        insert into orders(order_no, order_price)
        values(#{orderNo}, #{price})
    </insert>

    <!--
        如果表中的欄位名和實體類屬性名不相同,那麼查詢出來的結果為 null。
    -->
    <select id="selectWithNothing" parameterType="int" resultType="Order">
        select order_id, order_no, order_price
        from orders
        where order_id = #{id}
    </select>

    <!--
        解決方案一:使用別名, 如果不使用別名,則將返回 null
        根據id查詢得到一個order物件,使用這個查詢是可以正常查詢到我們想要的結果的,
        這是因為將查詢的欄位名都起一個和實體類屬性名相同的別名,這樣實體類的屬性名和查詢結果中的欄位名就可以一一對應上。
    -->
    <select id="selectWithAlias" parameterType="int" resultType="Order">
        select order_id id, order_no orderNo, order_price price
        from orders
        where order_id = #{id}
    </select>

    <!--
        解決方案二:
        根據id查詢得到一個order物件,使用這個查詢是可以正常查詢到我們想要的結果的,
        這是因為通過 <resultMap> 對映實體類屬性名和表的欄位名一一對應關係
    -->
    <select id="selectWithMapping" parameterType="int" resultMap="OrderMapping">
        select order_id, order_no, order_price
        from orders
        where order_id = #{id}
    </select>
    <!-- 通過<resultMap>對映實體類屬性名和表的欄位名對應關係 -->
    <resultMap id="OrderMapping" type="Order">
        <!-- id屬性來對映主鍵欄位 -->
        <id column="order_id" property="id" javaType="int"/>
        <!-- result屬性對映非主鍵欄位 -->
        <result column="order_no" property="orderNo" javaType="String"/>
        <result column="order_price" property="price"/>
    </resultMap>
</mapper>

相關推薦

MyBatis 筆記——實體屬性表字對映

之前的章節將的實體類屬性名和表字段名都是相同的,MyBatis 會自動去對映。那麼問題來了,如果實體類屬性名和表字段名不相同時,MyBatis 能智慧地去對映到嗎?答案是:不能。這裡用兩種解決方案: 1. 在使用 SQL 語句的時候,為每個欄位定義別名; 2

mybatis返回插入的id以及屬性表字不一致問題

資料庫(mySQL)中user表有兩個欄位user_id(主鍵,自增),user_name,實體類為User,對應屬性為userId,userName,則對應的mapper如下: <insert

Typescript學習筆記class

typescript的類,與c#,java等語言的類類似。也是包含了一大部分的es6的實現。我會用最通俗的語言講一下對coding有用的地方。 class Greeter { greeting: string; constructor(message: string) {

python學習筆記數值型轉換

學習 系統 oat cal 關於 trac hide sed lin Python中的數值類型有:   整型,如2,520   浮點型,如3.14159,1.5e10   布爾類型 True和False e記法:   e記法即對應數學中的科學記數法 1 >>

solidity學習筆記3——Solidity-合約屬性訪問許可權的繼承

!!!重要!!!子合約只能繼承父合約中的所有的public型別的函式,不能繼承internal/private的函式 pragma solidity ^0.4.4; contract Animal { string _birthDay; // 生日 int

JQuery學習筆記——建立、插入刪除節點

一個小練習: 需求1: 點選 submit 按鈕時, 檢查是否選擇 type, 若沒有選擇給出提示: "請選擇型別";  檢查文字框中是否有輸入(可以去除前後空格), 若沒有輸入,則給出提示: "請輸入內容"; 若檢查都通過, 則在相應的 ul 節點中新增對應的 li 節點

flask學習筆記:渲染模板引數

1、渲染模板 需要先匯入render_templatem模組,然後先在檔案所在目錄建立一資料夾,命名為templates,然後在資料夾中新建一個html網頁檔案。(渲染時框架會自動尋找網頁檔案,不必新增"templates"這個路徑,這是由flask框架決定的) &l

【IOS學習】CoreText學習筆記設定文字屬性插入圖片

設定文字和圖片的方法: 繪製文字的步驟是:設定NSAttributedString 或NSMutableAttributedString——> 通過attributedString 生成frameSetter ——> 生成CTFrame——>畫出來設定文字

Unity3D學習筆記分別使用IMGUIUGUI實現血條的預製設計

分別使用IMGUI和UGUI實現血條的預製設計 血條(Health Bar)的預製設計。具體要求如下: 分別使用 IMGUI 和 UGUI 實現 使用 UGUI,血條是遊戲物件的一個子元素,任何時候需要面對主攝像機 分析兩種實現的優缺點 給出預製的使用

MyBatis學習筆記表字名與實體屬性名不相同解決

解決辦法一: 通過在查詢的sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致,這樣就可以表的欄位名和實體類的屬性名一一對應上了 解決辦法二: 通過MyBatis提供的resultMap標籤來對映欄位名和實體類屬性名的一一對應關係。

MyBatis學習--解決實體屬性資料庫欄位不一致的問題

寫在前面 孤傲蒼狼的部落格:https://www.cnblogs.com/xdp-gacl/category/655890.html 程式碼中會有很多重要的註釋,請不要忽略。 前面在建立實體時,強調過一定要和資料庫列名一致。如果不一致結果是對映不到實體中的,但是資料庫和j

myBatis學習筆記3——實體屬性名與表字名不匹配問題

問題 <select id="getUser" parameterType="String" resultType="User"> select

Hibernate學習筆記 --- 映射基本數據型的List集合

varchar prim drop n) 進行 lis auth pos 方案 集合按其內元素的數據類型分為兩種:基本數據類型集合及復雜對象類型集合,Hibernate對於兩類集合提供不同的映射方式。(在類上以@Embeddable註解的復雜對象數據類型處理方式同基本數據類

python學習筆記-數據

rand 兩個 urn 浪費 line 平年 randint .com .cn 0. 在 Python 中的數據類型詳解 http://www.cnblogs.com/scios/p/8026576.html 1. 為什麽布爾類型(bool)的 True 和 False 分

JavaEE--Mybatis學習筆記--單表的CURD 補充

動態代理 doctype bubuko 使用 rop 單表 one lse name 1.屬性名和字段名不一致 使用別名 <select id="selectAllStudents" resultType="Student"><!-- 需要

Cocos2d-x學習筆記淺析動作CCAction(3)

【1】動作管理類CCActionManager: 動作管理類CCActionManager是一個管理所有動作的單例,可以對動作進行一系列的操作,如:新增動作、刪除動作、暫停動作、重啟動作,這個單例可以通過CCDirector::sharedDirector()->getActionMa

Vue:學習筆記-計算屬性偵聽器

提醒 原帖完整收藏於IT老兵驛站,並會不斷更新。 前言 參考官網的這裡和中文版,總體學習一下計算屬性,感覺這一章節總體是比較簡單的,做一下筆記來進行總結。思路是,原文寫的很清楚的,只做簡單的概括;對原文存在疑問的地方,摘抄原文,列舉問題,總結概括。 正文 計算屬性

學習springboot筆記資料訪問之mybatis

整合mybatis首先在pom.xml檔案中引入mybatis依賴 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>myb

Mybatis從入門到精通》讀書筆記

第九章. Spring整合Mybaits MyBatis-Spring可以幫助我們將Mybaits程式碼無縫整合到Spring中。使用這個類庫中的類,Spring將會載入必要的Mybaits工廠類和

Mybatis 學習筆記——關聯對映關係一對一,一對多

一、背景知識    在介紹對映關係之前需要我們對 resultMap 要足夠了解。在 resultMap 中有如下節點可配置: id :唯一標識列,column 為資料庫ID列,property為 POJO 的id屬性,注意在查詢出的結果集中每一列都必須不一樣