最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis映射和實(shí)際類(lèi)型不一致的問(wèn)題

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

mybatis映射和實(shí)際類(lèi)型不一致

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

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

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

原因分析

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

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

小結(jié)一下

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

解決方法

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

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

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

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

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

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

需要注意的是,它和parameterType?樣,如果注冊(cè)過(guò)類(lèi)型別名的,可以直接使?別名。沒(méi)有注冊(cè)過(guò)的必須使?全限定類(lèi)名。例如:我們的實(shí)體類(lèi)此時(shí)必須是全限定類(lèi)名

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

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

這?考慮實(shí)體類(lèi)屬性和數(shù)據(jù)庫(kù)表的列名已經(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ī)范,上面這個(gè)類(lèi)有 3 個(gè)屬性:id,username 和 hashedPassword。這些屬性會(huì)對(duì)應(yīng)到 select 語(yǔ)句中的列名。

xml映射

類(lèi)型別名是你的好幫手。使用它們,你就可以不用輸入類(lèi)的完全限定名稱了。比如:

<!-- 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 會(huì)在幕后自動(dòng)創(chuàng)建一個(gè) ResultMap,再基于屬性名來(lái)映射列到 JavaBean 的屬性上。

如果列名和屬性名沒(méi)有精確匹配,可以在 SELECT 語(yǔ)句中對(duì)列使用別名(這是一個(gè)基本的 SQL 特性)來(lái)匹配標(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í)體類(lèi)屬性和數(shù)據(jù)庫(kù)表的列名已經(jīng)不?致的情況

思考:如果我們的查詢很多,都使?別名的話寫(xiě)起來(lái)豈不是很麻煩,有沒(méi)有別的解決辦法呢?

2. resultMap結(jié)果類(lèi)型

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

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

而在引用它的語(yǔ)句中使用 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í)體類(lèi)屬性 和 數(shù)據(jù)庫(kù)表的列名 不匹配的另外一種方式。

3. 小結(jié)一下

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

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

相關(guān)文章

  • java web項(xiàng)目里ehcache.xml介紹

    java web項(xiàng)目里ehcache.xml介紹

    java web項(xiàng)目里ehcache.xml介紹,需要的朋友可以參考一下
    2013-03-03
  • Centos中yum方式安裝java的實(shí)現(xiàn)示例

    Centos中yum方式安裝java的實(shí)現(xiàn)示例

    這篇文章主要介紹了Centos中yum方式安裝java的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • SpringBoot 增量部署發(fā)布的實(shí)現(xiàn)步驟

    SpringBoot 增量部署發(fā)布的實(shí)現(xiàn)步驟

    本文介紹了通過(guò)拆分項(xiàng)目jar包和使用類(lèi)加載器實(shí)現(xiàn)Spring Boot的增量部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Mybatis中BindingException異常的產(chǎn)生原因及解決過(guò)程

    Mybatis中BindingException異常的產(chǎn)生原因及解決過(guò)程

    BindingException異常是MyBatis框架中自定義的異常,顧名思義指的是綁定出現(xiàn)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于MyBatis報(bào)錯(cuò)BindingException異常的產(chǎn)生原因及解決過(guò)程,需要的朋友可以參考下
    2023-06-06
  • SpringBoot項(xiàng)目中枚舉類(lèi)型字段與前端和數(shù)據(jù)庫(kù)的交互方法

    SpringBoot項(xiàng)目中枚舉類(lèi)型字段與前端和數(shù)據(jù)庫(kù)的交互方法

    最近做的這個(gè)項(xiàng)目中,用到了大量的枚舉類(lèi),下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目中枚舉類(lèi)型字段與前端和數(shù)據(jù)庫(kù)的交互方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 解決springboot+thymeleaf視圖映射報(bào)錯(cuò)There?was?an?unexpected?error?(type=Not?Found,?status=404)

    解決springboot+thymeleaf視圖映射報(bào)錯(cuò)There?was?an?unexpected?erro

    這篇文章主要介紹了解決springboot+thymeleaf視圖映射報(bào)錯(cuò)There?was?an?unexpected?error?(type=Not?Found,?status=404)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)

    springboot中設(shè)置定時(shí)任務(wù)的三種方法小結(jié)

    在我們開(kāi)發(fā)項(xiàng)目過(guò)程中,經(jīng)常需要定時(shí)任務(wù)來(lái)幫助我們來(lái)做一些內(nèi)容,本文介紹了springboot中設(shè)置定時(shí)任務(wù)的三種方法,主要包括@Scheduled注解,Quartz框架和xxl-job框架的實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • springboot整合持久層的方法實(shí)現(xiàn)

    springboot整合持久層的方法實(shí)現(xiàn)

    本文主要介紹了springboot整合持久層的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Gson之toJson和fromJson方法的具體使用

    Gson之toJson和fromJson方法的具體使用

    Gson是Google的一個(gè)開(kāi)源項(xiàng)目,可以將Java對(duì)象轉(zhuǎn)換成JSON,也可能將JSON轉(zhuǎn)換成Java對(duì)象。本文就詳細(xì)的介紹了toJson和fromJson方法的具體使用,感興趣的可以了解一下
    2021-11-11
  • 一文詳解Spring的Enablexxx注解使用實(shí)例

    一文詳解Spring的Enablexxx注解使用實(shí)例

    這篇文章主要為大家介紹了一文詳解Spring的Enablexxx注解使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11

最新評(píng)論

新巴尔虎左旗| 栖霞市| 盘山县| 阜宁县| 镇沅| 砚山县| 东光县| 屏东县| 修文县| 郑州市| 拉孜县| 乐陵市| 河池市| 西乌珠穆沁旗| 阿拉尔市| 安岳县| 绍兴市| 永州市| 大洼县| 东乌珠穆沁旗| 甘孜县| 灵丘县| 农安县| 安顺市| 家居| 老河口市| 高淳县| 南丹县| 蒙山县| 饶平县| 灵山县| 梓潼县| 隆回县| 崇左市| 邵东县| 平阴县| 洛阳市| 微山县| 杨浦区| 保亭| 家居|