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
屬性 | 說明 |
---|---|
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學習筆記(四)分別使用IMGUI和UGUI實現血條的預製設計
分別使用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屬性,注意在查詢出的結果集中每一列都必須不一樣