1. 程式人生 > >MyBatis 自動對映

MyBatis 自動對映

歡迎加我微信:fageweiketang一起交流討論,一起學習進步。

0x00:引子

在 MyBatis 的對映配置檔案中,select 標籤查詢配置結果集時使用過 resultType 屬性,當在 resultType 中定義一個 Java 包裝類時,如果 sql 語句查詢的結果中有列名與該 Java 包裝類中的屬性名一致,則該欄位就會被對映到該屬性上。這裡用到的就是 MyBatis 的自動對映功能,

當 sql 語句查詢出結果時,如果對應輸出配置的 Java 包裝類中有相同名稱的屬性,且擁有 set 方法,則該結果就會被自動對映。

0x01:原理

MyBatis 的自動對映功能是建立在 resultMap 基礎之上的。resultType 屬性自動對映的原理是,當 sql 對映輸出配置為 resultType 時,MyBatis 會生成一個空的 resultMap,然後指定這個 resultMap 的 type 為指定的 resultType 的型別,接著 MyBatis 檢測查詢結果集中欄位與指定 type 型別中屬性的對映關係,對結果進行自動對映。

在 MyBatis 全域性配置檔案中,在 setting 標籤內設定自動對映模式:

<setting name="autoMappingBehavior" value="PARTIAL"/>

0x02:配置

在 MyBatis 中,自動對映有三種模式,分別是 NONE、PARTIAL、FULL。其中 NONE 表示不啟用自動對映,PARTIAL 表示只對非巢狀的 resultMap 進行自動對映,FULL 表示對所有的 resultMap 都進行自動對映。預設的自動對映模式為 PARTIAL。

0x03:拓展

在 sql 查詢結果中,如果只有部分欄位與輸入配置型別中的屬性名稱不一樣,則可以僅在 resultMap 中指定不一樣的欄位對應的輸出型別的屬性,其他的則會直接進行自動對映。

例如以下示例,Java 包裝類中使用者名稱屬性為 username,而在 t_user 表中使用者名稱的欄位名為 name,這裡需要手動對映 name 欄位,其他的屬性可以通過預設的自動對映機制來對映:

<resultMap type="cn.com.mybatis.pojo.User" id="UserResult">
    <result property="username" column="name"/>
</resultMap>
<select id="findUserById" parameterType="java.lang.Long"
resultMap="UserResult"> select id,name,email from t_user where id=#{id} </select>

在 User 類中,包含了手動對映的 username 屬性和自動對映的 id、email 屬性。

如果在某些 resultMap 中不想使用自動對映,則可以單獨在該 resultMap 中設定 autoMapping 的屬性為 false,此時該 resultMap 僅對映指定的對映欄位:

<select id="findUserById" parameterType="java.lang.Long" resultMap="UserResult" autoMapping="false">
    select id,name,email from t_user where id=#{id}
</select>

當配置了 autoMapping 屬性後,就會忽略全域性配置檔案中的 autoMappingBehavior 對映模式。

0x04:關於 FULL

關於 FULL 模式,應該謹慎使用,該模式不管 resultMap 是巢狀的還是非巢狀的,都會進行自動對映,這可能會造成某些巢狀屬性與查詢結果的欄位名一致而誤被自動對映,例如以下示例:

<resultMap id="replyResult" type="cn.com.mybatis.pojo.Reply">
    <association property="user" resultMap="userResult"/>
</resultMap>

<resultMap id="userResult" type="cn.com.mybatis.pojo.User">
    <result property="username" column="name"/>
</resultMap>

<select id="queryReplyInfo" parameterType="java.lang.Long" resultMap="replyResult">
    select R.id,R.title,R.info,U.name form
    reply R left join t_user U on R.user_id = U.id where R.id=#{id}
</select>

以上示例載入了一個評論 Reply 和該評論的作者 User 資訊,User 並不要求對映 id 屬性,如果這個時候設定了自動對映模式為 FULL,那麼就會將從結果中取出的評論 Reply 的 id 值賦給巢狀的 resultMap 中 User 的 id,造成資料混亂。

0x05:總結

MyBatis 中的 resultMap 對映當返回的欄位名與類中欄位名一致時,預設配置是自動對映。通過 autoMappingBehavior 來配置,配置方式有三種,NONE、PARTIAL、FULL,其中 NONE 代表不啟用自動對映,PARTIAL 代表只對非巢狀的 resultMap 進行對映,FULL 代表對所有的 resultMap 都進行對映。而對於 FULL 配置,用時需要謹慎,避免造成資料混亂的情況。

更多關於程式碼審計、WEB滲透、網路安全的運維的知識,請關注微信公眾號:發哥微課堂。

相關推薦

不學無數——Mybatis自動對映器Mapper原理分析

在使用MyBatis時,有時候會想,為什麼只寫一個介面沒有編寫任何的實現類,但是就能返回介面的例項,並且呼叫介面的方法返回資料庫中的資料?此時腦海中浮現了寫動態代理時候的記憶,記得動態代理也是接管了介面,不需要實際的代理角色。然後經過原始碼的Debug發現果然是

MyBatis 自動對映

歡迎加我微信:fageweiketang一起交流討論,一起學習進步。 0x00:引子 在 MyBatis 的對映配置檔案中,select 標籤查詢配置結果集時使用過 resultType 屬性,當在 resultType 中定義一個 Java 包裝類時,如果 sql 語句

使用MyBatis自動對映表建立實體類

作用:可利用MyBatis生成器自動生成實體類、DAO介面和Mapping對映檔案 第一步:首先準備一個這樣的目錄,以及對應的檔案,generatorConfig.xml暫時是空白的 第二步:編寫generatorConfig.xml檔案 <

Mybatis自動對映autoMappingBehavior與mapUnderscoreToCamelCase

autoMappingBehavior 在Mybatis的配置檔案中新增settings屬性的autoMappingBehavior <settings> <setting name="autoMappingBehavior" value="NONE"/> </set

【筆記】Mybatis高階查詢--使用自動對映處理一對一關係

假設在RBAC許可權系統中,一個使用者只能有一個角色,那麼就是一對一關係了。一對一對映因為不需要考慮是否存在重複資料,用起來簡單,所以可以直接使用Mybatis的自動對映。 以下例子為使用自動對映實現在查詢使用者資訊的同時獲取使用者的角色資訊。 在SysU

MyBatis自動生成實體類、對映、Dao介面

1、在web.xml配置,加入以下程式碼(加在<plugins><plugins/>標籤中) <plugin>   <groupId>org.mybatis.generator</groupId>

mybatis自動生成對應表的實體類、介面和對映檔案

使用maven構建的專案,其中整合了mybatis,每次使用時都需要建立model實體類,dao介面和mapper對映檔案,為了方便開發,maven中有一種外掛可以直接生成資料庫表對應的實體類,介面和對映檔案 1.首先要在pom.xml檔案中加入外掛依賴,注意直接放在<

Mybatis自動生成實體類,對映檔案,以及dao層介面。

      Mybatis不像Hibernate那樣可以直接通過Myeclipse直接生成相應的對映檔案,它是一個半自動化的ORM框架,所以主要的工作就是配置Mapping對映檔案,但是由於手寫對映檔案很容易出錯,所以可利用MyBatis生成器自動生成實體類、DAO介面和M

MyBatis自動生成實體類、DAO介面和Mapping對映檔案的程式碼(逆向工程)

MyBatis屬於一種半自動的ORM框架,它需要程式設計師自己編寫sql語句和對映檔案,但是編寫對映檔案和sql語句很容易出錯,所以mybatis官方提供了Generator生成器,自動生成DAO介面。實體類和Mapping。這個生成器是根據單表自動生成myba

Mybatis單表自動對映;使用設定對映結果集;多表查詢

1. 自動對映【資料庫欄位名與實體類的屬性名一致】     <select id="selectList" resultType="cn.bjsxt.pojo.User">        select id,name,pwd,age from       

利用Maven自動生成mybatis對映類檔案

1.首先在pom.xml裡配置包依賴和plugin外掛         <!-- 自動生成 -->         <dependency>             <groupId>org.mybatis.generator</g

MyBatis對映自動匹配

 開始標籤: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/d

Mybatis自動生成對映檔案和PO物件和呼叫示例程式碼工

 src/generatorConfig.properties suppressAllComments=false driverClass=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:152

mybatis開啟資料庫欄位自動對映為java駝峰命名規則

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD C

mybatis中的自動對映是什麼意思?

不廢話直接來: 啥叫自動? 有別人替你做了事情就叫自動 所以自動與手動相對  比如:自動洗衣機 是說這個機器替你把洗衣服的事情給做了 啥叫對映? 請參考我的博文如何理解資料庫中的對映 所以 所謂自動對映就是:           只要sql返回的列名和java

Mybatis自動生成Xml文件,針對字段類型為text等會默認產生XXXXWithBlobs的方法問題

div 生成xml文件 處理 pre cnblogs href 字段 默認 mybatis 默認情況下產生的Mapper.xml裏面存在: 需要修改generatorConfiguration.xml,裏面的table加屬性,如: <t

Mybatis自動生成實體類和實體映射工具

ase 忽略 路徑 package mapping decimal rri upd 需要 Mybatis Mysql生成實體類 用到的Lib包: mybatis-generator-core-1.3.2.jarmysql-connector-java-5.1.30.jar

mybatis自動generator

epo connect resources nis ces resolv ive java-5 點擊 在pom.xml 新加 <plugin> <groupId>org.mybatis.generator</groupId>

mybatis自動生成代碼

url package odin .bat 第一步 rim jar包 product bound 第一步:先下載jar包,mybatis-generator-core-1.3.2.jar, mysql-connector-java-5.1.13.jar;第二步:編寫需要生成

SpringBoot19 利用mybatis自動生成項目

1.8 color === urn view 技術 java pre 4.0 1 環境配置 2 新建一個新的springboot項目      2.1 選擇一些必要的依賴     web jpa mysql <?xml version="1.0" enco