您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“怎么解決mybatis映射和實(shí)際類型不一致的問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么解決mybatis映射和實(shí)際類型不一致的問題”吧!
項(xiàng)目今天出現(xiàn)個問題,在dao中定義了一個查詢,方法的返回值是map并定義了泛型都是String類型,可是方法返回值中還是存在其他的類型。
//DAO接口查詢 返回類型Map<String,String> Map<String,String> dealerInfo(String userId,String brandId);
實(shí)際返回類型還是存在不是String類型的數(shù)據(jù)
1、泛型作用于編譯階段,僅為了防止類型混亂而出現(xiàn),類型轉(zhuǎn)換異常
2、mybatis結(jié)果集封裝bean時采用反射,是在運(yùn)行時進(jìn)行的。
泛型是在編譯階段將我們的返回值類型匹配到一具體類型,而DAO層的接口卻沒有具體的返回值信息,所以在編譯階段它是可以通過的,這也就是說我們在DAO層定義的接口返回值泛型是不起作用的,具體的類型還是得依靠mapper.xml文件中定義的返回值類型為準(zhǔn)。
在查詢sql中就將數(shù)據(jù)轉(zhuǎn)換成對應(yīng)類型即可
SELECT CONVERT(23,CHAR); 會將23轉(zhuǎn)成字符串
resultMap 元素是 MyBatis 中最重要最強(qiáng)大的元素。它可以讓你從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來,并在一些情形下允許你進(jìn)行一些 JDBC 不支持的操作。實(shí)際上,在為一些比如連接的復(fù)雜語句編寫映射代碼的時候,一份 resultMap 能夠代替實(shí)現(xiàn)同等功能的長達(dá)數(shù)千行的代碼。ResultMap 的設(shè)計思想是,對于簡單的語句根本不需要配置顯式的結(jié)果映射,而對于復(fù)雜一點(diǎn)的語句只需要描述它們的關(guān)系就行了。
resultType屬性可以指定結(jié)果集的類型,它?持 基本類型和 實(shí)體類類型(JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 對象))
需要注意的是,它和parameterType?樣,如果注冊過類型別名的,可以直接使?別名。沒有注冊過的必須使?全限定類名。例如:我們的實(shí)體類此時必須是全限定類名
同時,當(dāng)是實(shí)體類名稱是,還有?個要求,實(shí)體類中的屬性名稱必須和查詢語句中的列名 保持? 致,否則?法實(shí)現(xiàn)封裝。
這?考慮實(shí)體類屬性和數(shù)據(jù)庫表的列名已經(jīng)不?致的情況
JavaBean:
public class User { private int id; private String username; private String hashedPassword; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getHashedPassword() { return hashedPassword; } public void setHashedPassword(String hashedPassword) { this.hashedPassword = hashedPassword; } }
基于JavaBean的規(guī)范,上面這個類有 3 個屬性:id,username 和 hashedPassword。這些屬性會對應(yīng)到 select 語句中的列名。
xml映射
類型別名是你的好幫手。使用它們,你就可以不用輸入類的完全限定名稱了。比如:
<!-- mybatis-config.xml 中 --> <typeAlias type="com.someapp.model.User" alias="User"/> <!-- SQL 映射 XML 中 --> <select id="selectUsers" resultType="User"> select id, username, hashedPassword from some_table where id = #{id} </select>
這些情況下,MyBatis 會在幕后自動創(chuàng)建一個 ResultMap,再基于屬性名來映射列到 JavaBean 的屬性上。
如果列名和屬性名沒有精確匹配,可以在 SELECT 語句中對列使用別名(這是一個基本的 SQL 特性)來匹配標(biāo)簽。比如:
<select id="selectUsers" resultType="User"> select user_id as "id", user_name as "userName", hashed_password as "hashedPassword" from some_table where id = #{id} </select>
這樣,可以解決 實(shí)體類屬性和數(shù)據(jù)庫表的列名已經(jīng)不?致的情況
思考:如果我們的查詢很多,都使?別名的話寫起來豈不是很麻煩,有沒有別的解決辦法呢?
resultMap標(biāo)簽可以建?查詢的列名和實(shí)體類的屬性名稱不?致時建?對應(yīng)關(guān)系。從?實(shí)現(xiàn)封裝。 在select標(biāo)簽中使?resultMap屬性指定引?即可。同時resultMap可以實(shí)現(xiàn)將查詢結(jié)果映射為復(fù) 雜類型的pojo,?如在查詢結(jié)果映射對象中包括pojo和list實(shí)現(xiàn)?對?查詢和?對多查詢。
<!-- 建?User實(shí)體和數(shù)據(jù)庫表的對應(yīng)關(guān)系 type屬性:指定實(shí)體類的全限定類名 id屬性:給定?個唯?標(biāo)識,是給查詢select標(biāo)簽引??的。 --> <resultMap id="userResultMap" type="User"> <!-- id標(biāo)簽:?于指定主鍵字段 result標(biāo)簽:?于指定?主鍵字段 column屬性:?于指定數(shù)據(jù)庫列名 property屬性:?于指定實(shí)體類屬性名稱 --> <!--主鍵映射--> <id property="id" column="user_id" /> <!--普通屬性映射--> <result property="username" column="user_name"/> <result property="password" column="hashed_password"/> </resultMap>
type屬性
:指定實(shí)體類的全限定類名
id="userResultMap"
:給定?個唯?標(biāo)識,是給查詢select標(biāo)簽引??的。
<id>標(biāo)簽
:?于指定主鍵字段
<result>標(biāo)簽
:?于指定?主鍵字段
column屬性
:?于指定數(shù)據(jù)庫列名
property屬性
:?于指定實(shí)體類屬性名稱
而在引用它的語句中使用 resultMap 屬性就行了(注意我們?nèi)サ袅?resultType 屬性)。比如:
<select id="selectUsers" resultMap="userResultMap"> select user_id, user_name, hashed_password from some_table where id = #{id} </select>
使用外部的 resultMap ,這也是解決 實(shí)體類屬性 和 數(shù)據(jù)庫表的列名 不匹配的另外一種方式。
到此,相信大家對“怎么解決mybatis映射和實(shí)際類型不一致的問題”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。