欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis映射和實際類型不一致的問題

 更新時間:2021年11月26日 14:55:31   作者:北城深海未眠  
這篇文章主要介紹了mybatis映射和實際類型不一致的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

mybatis映射和實際類型不一致

項目今天出現(xiàn)個問題,在dao中定義了一個查詢,方法的返回值是map并定義了泛型都是String類型,可是方法返回值中還是存在其他的類型。

//DAO接口查詢 返回類型Map<String,String>
 Map<String,String> dealerInfo(String userId,String brandId);

實際返回類型還是存在不是String類型的數(shù)據(jù)

原因分析

1、泛型作用于編譯階段,僅為了防止類型混亂而出現(xiàn),類型轉(zhuǎn)換異常

2、mybatis結(jié)果集封裝bean時采用反射,是在運行時進(jìn)行的。

小結(jié)一下

泛型是在編譯階段將我們的返回值類型匹配到一具體類型,而DAO層的接口卻沒有具體的返回值信息,所以在編譯階段它是可以通過的,這也就是說我們在DAO層定義的接口返回值泛型是不起作用的,具體的類型還是得依靠mapper.xml文件中定義的返回值類型為準(zhǔn)。

解決方法

在查詢sql中就將數(shù)據(jù)轉(zhuǎn)換成對應(yīng)類型即可

SELECT CONVERT(23,CHAR); 會將23轉(zhuǎn)成字符串

mybatis映射器Mapper(結(jié)果映射以及解決列名不一致)

結(jié)果映射:(resultMap, resultType)

resultMap 元素是 MyBatis 中最重要最強大的元素。它可以讓你從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來,并在一些情形下允許你進(jìn)行一些 JDBC 不支持的操作。實際上,在為一些比如連接的復(fù)雜語句編寫映射代碼的時候,一份 resultMap 能夠代替實現(xiàn)同等功能的長達(dá)數(shù)千行的代碼。ResultMap 的設(shè)計思想是,對于簡單的語句根本不需要配置顯式的結(jié)果映射,而對于復(fù)雜一點的語句只需要描述它們的關(guān)系就行了。

resultType屬性可以指定結(jié)果集的類型,它?持 基本類型和 實體類類型(JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 對象))

需要注意的是,它和parameterType?樣,如果注冊過類型別名的,可以直接使?別名。沒有注冊過的必須使?全限定類名。例如:我們的實體類此時必須是全限定類名

同時,當(dāng)是實體類名稱是,還有?個要求,實體類中的屬性名稱必須和查詢語句中的列名 保持? 致,否則?法實現(xiàn)封裝。

1. resultType配置結(jié)果類型

這?考慮實體類屬性和數(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ù)據(jù)庫表的列名已經(jīng)不?致的情況

思考:如果我們的查詢很多,都使?別名的話寫起來豈不是很麻煩,有沒有別的解決辦法呢?

2. resultMap結(jié)果類型

resultMap標(biāo)簽可以建?查詢的列名和實體類的屬性名稱不?致時建?對應(yīng)關(guān)系。從?實現(xiàn)封裝。 在select標(biāo)簽中使?resultMap屬性指定引?即可。同時resultMap可以實現(xiàn)將查詢結(jié)果映射為復(fù) 雜類型的pojo,?如在查詢結(jié)果映射對象中包括pojo和list實現(xiàn)?對?查詢和?對多查詢。

<!--
 建?User實體和數(shù)據(jù)庫表的對應(yīng)關(guān)系
 type屬性:指定實體類的全限定類名
 id屬性:給定?個唯?標(biāo)識,是給查詢select標(biāo)簽引??的。
 -->
<resultMap id="userResultMap" type="User">
    <!-- id標(biāo)簽:?于指定主鍵字段
     result標(biāo)簽:?于指定?主鍵字段
     column屬性:?于指定數(shù)據(jù)庫列名
     property屬性:?于指定實體類屬性名稱
     -->
 
 <!--主鍵映射-->
  <id property="id" column="user_id" />
 
<!--普通屬性映射-->
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>
  • type屬性:指定實體類的全限定類名
  • id="userResultMap":給定?個唯?標(biāo)識,是給查詢select標(biāo)簽引??的。
  • <id>標(biāo)簽:?于指定主鍵字段
  • <result>標(biāo)簽:?于指定?主鍵字段
  • column屬性:?于指定數(shù)據(jù)庫列名
  • property屬性:?于指定實體類屬性名稱

而在引用它的語句中使用 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ù)據(jù)庫表的列名 不匹配的另外一種方式。

3. 小結(jié)一下

都可以解決實體類屬性 和 數(shù)據(jù)庫表的列名 不匹配 情況

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談Spring Boot 2.0遷移指南主要注意點

    淺談Spring Boot 2.0遷移指南主要注意點

    Spring官方的Spring Boot 2變動指南,主要是幫助您將應(yīng)用程序遷移到Spring Boot 2.0,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • java和c/c++ 數(shù)據(jù)類型長度的比較

    java和c/c++ 數(shù)據(jù)類型長度的比較

    本篇文章主要是對java和c/c++ 數(shù)據(jù)類型長度的進(jìn)行了詳細(xì)的比較。需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • java使用TimeZone將中國標(biāo)準(zhǔn)時間轉(zhuǎn)成時區(qū)值

    java使用TimeZone將中國標(biāo)準(zhǔn)時間轉(zhuǎn)成時區(qū)值

    這篇文章主要介紹了java使用TimeZone將中國標(biāo)準(zhǔn)時間轉(zhuǎn)成時區(qū)值的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件

    SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件

    這篇文章主要介紹了SpringCloud Feign如何在遠(yuǎn)程調(diào)用中傳輸文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • SpringMVC中DispatcherServlet的HandlerMapping詳解

    SpringMVC中DispatcherServlet的HandlerMapping詳解

    這篇文章主要介紹了SpringMVC中DispatcherServlet的HandlerMapping詳解,上回說的Handler,我們說是處理特定請求的,也就是說,不是所有的請求都能處理,那么問題來了,我們怎知道哪個請求是由哪個Handler處理的呢,需要的朋友可以參考下
    2023-10-10
  • Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源

    Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源

    這篇文章主要介紹了Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源,多數(shù)據(jù)源就是在一個單一應(yīng)用中涉及到了兩個及以上的數(shù)據(jù)庫,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章介紹
    2022-05-05
  • java文件下載代碼實例(單文件下載和多文件打包下載)

    java文件下載代碼實例(單文件下載和多文件打包下載)

    這篇文章主要介紹了java文件下載代碼實例(單文件下載和多文件打包下載),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • 關(guān)于JSON解析中獲取不存在的key問題

    關(guān)于JSON解析中獲取不存在的key問題

    這篇文章主要介紹了關(guān)于JSON解析中獲取不存在的key問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • java讀取csv文件和寫csv示例分享

    java讀取csv文件和寫csv示例分享

    這篇文章主要介紹了JAVA對CSV格式文本數(shù)據(jù)處理后再保存成新CSV格式文本的模板,可以學(xué)習(xí)到j(luò)ava讀取csv文件和寫csv的方法,需要的朋友可以參考下
    2014-03-03
  • 百度Java面試題 前200頁精選(中)

    百度Java面試題 前200頁精選(中)

    這篇文章主要為大家分享了Java面試資源中篇,百度“Java面試題”前200頁都在這里了,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論