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

Mybatis結果集自動映射的實例代碼

 更新時間:2017年02月06日 16:59:53   投稿:mrr  
在使用Mybatis時,有的時候我們可以不用定義resultMap,而是直接在<select>語句上指定resultType。這個時候其實就用到了Mybatis的結果集自動映射,下面通過本文給大家分享Mybatis結果集自動映射的實例代碼,一起看看吧

在使用Mybatis時,有的時候我們可以不用定義resultMap,而是直接在<select>語句上指定resultType。這個時候其實就用到了Mybatis的結果集自動映射。Mybatis的自動映射默認是開啟的,有需要我們也可以將其關閉(還可以調整自動映射的策略)。

1       Mybatis結果集自動映射 

       在使用Mybatis時,有的時候我們可以不用定義resultMap,而是直接在<select>語句上指定resultType。這個時候其實就用到了Mybatis的結果集自動映射。Mybatis的自動映射默認是開啟的,其在映射的時候會先把沒有在resultMap中定義字段映射的字段按照名稱相同的方式自動映射到返回類型的對應屬性上。自動映射的時候會忽略大小寫,比如查詢語句中查詢出來了一個字段是ID,我們對應的返回類型有一個屬性id,且有一個setId()方法,那么id跟ID也是可以匹配的,是可以自動映射的,Mybatis就會把查詢出來的結果集中字段ID對應的值賦給返回類型對象的id屬性。

1.1     源碼分析

       關于自動映射這塊的邏輯規(guī)則可以參考Mybatis的DefaultResultSetHandler的源碼,其核心代碼如下。 

private boolean applyAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, String columnPrefix) throws SQLException {
  List<UnMappedColumAutoMapping> autoMapping = createAutomaticMappings(rsw, resultMap, metaObject, columnPrefix);
  boolean foundValues = false;
  if (autoMapping.size() > 0) {
   for (UnMappedColumAutoMapping mapping : autoMapping) {
    final Object value = mapping.typeHandler.getResult(rsw.getResultSet(), mapping.column);
    if (value != null || configuration.isCallSettersOnNulls()) {
     if (value != null || !mapping.primitive) {
      metaObject.setValue(mapping.property, value);
     }
     foundValues = true;
    }
   }
  }
  return foundValues;
 }
 private List<UnMappedColumAutoMapping> createAutomaticMappings(ResultSetWrapper rsw, ResultMap resultMap, MetaObject metaObject, String columnPrefix) throws SQLException {
  final String mapKey = resultMap.getId() + ":" + columnPrefix;
  List<UnMappedColumAutoMapping> autoMapping = autoMappingsCache.get(mapKey);
  if (autoMapping == null) {
   autoMapping = new ArrayList<UnMappedColumAutoMapping>();
   final List<String> unmappedColumnNames = rsw.getUnmappedColumnNames(resultMap, columnPrefix);
   for (String columnName : unmappedColumnNames) {
    String propertyName = columnName;
    if (columnPrefix != null && !columnPrefix.isEmpty()) {
     if (columnName.toUpperCase(Locale.ENGLISH).startsWith(columnPrefix)) {
      propertyName = columnName.substring(columnPrefix.length());
     } else {
      continue;
     }
    }
    final String property = metaObject.findProperty(propertyName, configuration.isMapUnderscoreToCamelCase());
    if (property != null && metaObject.hasSetter(property)) {
     final Class<?> propertyType = metaObject.getSetterType(property);
     if (typeHandlerRegistry.hasTypeHandler(propertyType)) {
      final TypeHandler<?> typeHandler = rsw.getTypeHandler(propertyType, columnName);
      autoMapping.add(new UnMappedColumAutoMapping(columnName, property, typeHandler, propertyType.isPrimitive()));
     }
    }
   }
   autoMappingsCache.put(mapKey, autoMapping);
  }
  return autoMapping;
 } 

       在上面的源碼中createAutomaticMappings()方法中的下面這句就是獲取當前查詢結果集中沒有在resultMap中映射的字段,以進行自動映射。詳情請參考完整的源碼。

 final List<String> unmappedColumnNames = rsw.getUnmappedColumnNames(resultMap, columnPrefix);

1.2     示例

       現(xiàn)假設我們有一個User類,其有id、name、username、email、mobile屬性,然后有下面這樣一個查詢及其對應的resultMap定義。我們可以看到我們查詢出來的有id、name、user_name、email和mobile字段,在resultMap中我們只配置了字段user_name對應的是username屬性,其它的我們都沒配置,但是查詢出來的結果中User對象的id、name、username、email和mobile屬性都會有值,因為它們會被Mybatis以自動映射策略進行賦值。

 <resultMap type="com.elim.learn.mybatis.model.User" id="BaseResult">
   <result column="user_name" property="username"/>
  </resultMap>
  <select id="findById" resultMap="BaseResult" parameterType="java.lang.Long" >
   select id,name,username user_name,email,mobile from t_user where id=#{id}
  </select>

1.3     自動映射策略

       Mybatis的自動映射策略默認是開啟的,而且默認是只對非嵌套的resultMap進行自動映射。這是通過Mybatis的全局配置autoMappingBehavior參數(shù)配置的。它一共有三種取值,分別是NONE、PARTIAL和FULL。

l  NONE表示不啟用自動映射

l  PARTIAL表示只對非嵌套的resultMap進行自動映射

l  FULL表示對所有的resultMap都進行自動映射

    <!-- 自動映射類型,可選值為NONE、PARTIAL和FULL,參考AutoMappingBehavior枚舉 -->
   <setting name="autoMappingBehavior" value="PARTIAL"/>

       除了全局的是否啟用自動映射的配置外,還可以對特定的resultMap設置是否啟用自動映射。這是通過resultMap的autoMapping屬性配置的,可選值是true和false。定義在resultMap上的autoMapping的優(yōu)先級比全局配置的優(yōu)先級更高。

1.4     resultType自動映射分析

       我們在指定一個查詢語句的返回結果時,可以直接指定resultType,也可以是指定resultMap,然后由指定的resultMap的type屬性指定真實的返回類型。實際上,Mybatis的底層在對結果集進行處理時都是通過resultMap進行處理的。當我們指定的是resultType時,Mybatis內部會生成一個空的resultMap,然后指定其對應的type為我們指定的resultType類型。那這個時候之所以返回結果能自動映射到resultType類型的對應屬性上,就是上面介紹的Mybatis的自動映射機制的作用。如果在這種情況下,我們把全局的自動映射關閉了,那么Mybatis就不能自動映射了,也就得不到我們需要的返回結果了。如下就是直接指定的resultType。

  <select id="findById" resultType="com.elim.learn.mybatis.model.User" parameterType="java.lang.Long" >
   select id,name,username,email,mobile from t_user where id=#{id}
  </select>

       Mybatis的mapper.xml文件的內容是由XMLMapperBuilder解析的,而其中定義的Mapper語句(select、insert等)則是由XMLStatementBuilder解析的,解析后會生成一個MappedStatement。對于Select語句,其對應的resultMap的解析的核心邏輯如下,更多信息請參考官方源碼。

private List<ResultMap> getStatementResultMaps(
   String resultMap,
   Class<?> resultType,
   String statementId) {
  resultMap = applyCurrentNamespace(resultMap, true);
  List<ResultMap> resultMaps = new ArrayList<ResultMap>();
  if (resultMap != null) {
   String[] resultMapNames = resultMap.split(",");
   for (String resultMapName : resultMapNames) {
    try {
     resultMaps.add(configuration.getResultMap(resultMapName.trim()));
    } catch (IllegalArgumentException e) {
     throw new IncompleteElementException("Could not find result map " + resultMapName, e);
    }
   }
  } else if (resultType != null) {
   ResultMap inlineResultMap = new ResultMap.Builder(
     configuration,
     statementId + "-Inline",
     resultType,
     new ArrayList<ResultMapping>(),
     null).build();
   resultMaps.add(inlineResultMap);
  }
  return resultMaps;
 }

以上所述是小編給大家介紹的Mybatis結果集自動映射的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • Java自動拆箱空指針異常的解決

    Java自動拆箱空指針異常的解決

    這篇文章主要介紹了Java自動拆箱空指針異常的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Mybatis-plus在項目中的簡單應用

    Mybatis-plus在項目中的簡單應用

    Mybatis-plus是Spring框架中OOM的一大利器,其簡單易用參考官網(wǎng)文檔即可很快上手,本文主要介紹了邏輯刪除,自動填充,分頁插件等的簡單使用,感興趣的可以了解一下
    2021-07-07
  • SpringBoot Admin2.0 集成Arthas的實現(xiàn)步驟

    SpringBoot Admin2.0 集成Arthas的實現(xiàn)步驟

    這篇文章主要介紹了SpringBoot Admin2.0 集成Arthas的實現(xiàn)步驟,幫助大家更好的理解和學習使用SpringBoot框架,感興趣的朋友可以了解下
    2021-04-04
  • Java I/O中I/O流的典型使用方式詳解

    Java I/O中I/O流的典型使用方式詳解

    這篇文章主要介紹了Java I/O中I/O流的典型使用方式詳解,盡管可以通過不同的方式組合IO流類,但我們可能也就只用到其中的幾種組合。下面的例子可以作為典型的IO用法的基本參考,,需要的朋友可以參考下
    2019-06-06
  • Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法

    Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法

    這篇文章主要介紹了Java中FTPClient上傳中文目錄、中文文件名亂碼問題解決方法,本文使用apache-commons-net工具包時遇到這個問題,解決方法很簡單,需要的朋友可以參考下
    2015-05-05
  • springboot基于keytool實現(xiàn)https的雙向認證示例教程

    springboot基于keytool實現(xiàn)https的雙向認證示例教程

    這篇文章主要介紹了springboot基于keytool實現(xiàn)https的雙向認證,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • Idea2023創(chuàng)建springboot不能選擇java8的解決方法(最新推薦)

    Idea2023創(chuàng)建springboot不能選擇java8的解決方法(最新推薦)

    在idea2023版本創(chuàng)建springboot的過程中,選擇java版本時發(fā)現(xiàn)沒有java8版本,只有java17和java20,遇到這樣的問題如何解決呢,下面小編給大家分享Idea2023創(chuàng)建springboot不能選擇java8的解決方法,感興趣的朋友一起看看吧
    2024-01-01
  • JAVA并發(fā)編程有界緩存的實現(xiàn)詳解

    JAVA并發(fā)編程有界緩存的實現(xiàn)詳解

    這篇文章主要介紹了JAVA并發(fā)編程有界緩存的實現(xiàn)詳解的相關資料,這里舉例說明如何實現(xiàn),四種方法一一代碼實現(xiàn),需要的朋友可以參考下
    2016-12-12
  • java多線程Thread的實現(xiàn)方法代碼詳解

    java多線程Thread的實現(xiàn)方法代碼詳解

    這篇文章主要介紹了java多線程Thread的實現(xiàn)方法代碼詳解,涉及start(),run(),stop(),interrupt(),isInterrupted(),join()和join(long millis)等方法的介紹,具有一定借鑒價值,需要的朋友可以了解下。
    2017-11-11
  • springboot 排除redis的自動配置操作

    springboot 排除redis的自動配置操作

    這篇文章主要介紹了springboot 排除redis的自動配置操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

红桥区| 乌拉特后旗| 微山县| 墨玉县| 昌乐县| 凌海市| 平顺县| 商南县| 荃湾区| 鄢陵县| 卢湾区| 宜春市| 鄂托克旗| 海门市| 灵川县| 宁河县| 阜南县| 法库县| 会理县| 乡城县| 江北区| 天峻县| 万宁市| 周至县| 友谊县| 南通市| 永春县| 长治市| 永顺县| 姚安县| 梨树县| 中超| 伊金霍洛旗| 秦安县| 襄垣县| 清河县| 百色市| 辉南县| 彭阳县| 双辽市| 株洲县|