關於mybatis返回結果映射和條件查詢和ResultMap

ResultMap

基本使用

適合使用返回值是自定義實體類的狀況java

映射實體類的數據類型sql

id:resultMap的惟一標識數據庫

column: 庫表的字段名緩存

property: 實體類裏的屬性名安全

resultType能夠直接返回給出的返回值類型,好比String、int、Map,等等,其中返回List也是將返回類型定義爲Map,而後mybatis會自動將這些map放在一個List中,resultType還能夠是一個對象mybatis


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:當前庫表映射文件的命名空間,惟一的不能重複 -->
<mapper namespace="com.hao947.sql.mapper.PersonMapper">
  <!-- type:映射實體類的數據類型 id:resultMap的惟一標識 -->
  <resultMap type="person" id="BaseResultMap">
    <!-- column:庫表的字段名 property:實體類裏的屬性名 -->
    <id column="person_id" property="personId" />
    <result column="name" property="name" />
    <result column="gender" property="gender" />
    <result column="person_addr" property="personAddr" />
    <result column="birthday" property="birthday" />
  </resultMap>
  <!--id:當前sql的惟一標識
     parameterType:輸入參數的數據類型
     resultType:返回值的數據類型
     #{}:用來接受參數的,若是是傳遞一個參數#{id}內容任意,若是是多個參數就有必定的規則,採用的是預編譯的形式select
    * from person p where p.id = ? ,安全性很高 -->
 
  <!-- sql語句返回值類型使用resultMap -->
  <select id="selectPersonById" parameterType="java.lang.Integer"
    resultMap="BaseResultMap">
    select * from person p where p.person_id = #{id}
  </select>
  <!-- resultMap:適合使用返回值是自定義實體類的狀況
  resultType:適合使用返回值的數據類型是非自定義的,即jdk的提供的類型 -->
  <select id="selectPersonCount" resultType="java.lang.Integer">
    select count(*) from
    person
  </select>
 
  <select id="selectPersonByIdWithMap" parameterType="java.lang.Integer"
    resultType="java.util.Map">
    select * from person p where p.person_id= #{id}
    </select>
 
</mapper>

oracle

resultType是結果集的一個映射,能夠簡單的寫成resultType="map"或者resultType="hashmap",其中"map"和"hashmap"都是mybatis可以識別的別名,寫成"java.util.HashMap"固然也沒有問題,在java代碼端,是這麼寫的: app

List<Map<String,Object>> list =sqlSession.selectList("User.test"); 測試

      for(Map<String,Object> map :list){  spa

           System.out.println(map.get("id"));  //經過map.get("key"),就能夠獲取你須要的結果。

      } 

****************************************MyBatis如何寫條件查詢**************************************************

基本標籤語句

<select id="" parameterType="" resultMap="xxResultMap">

sql語句

</select>

id標識該查詢;parameterType指參數類型;resultMap指返回類型,這裏與下面設置的resultMap關聯。

 

做爲查詢語句,返回結果是一個List,當選擇性的輸出字段時,須要添加一個ResultMap屬性與之關聯。id標識主鍵,result標識字段。property指向實體類的屬性,column指向數據庫列名。

 

拼接條件以前須要加where關鍵字。

由於可能沒有查詢條件,因此寫成where 1=1。或者用查詢的必要條件拼接。

拼接條件爲「=」的狀況

if 判斷是否爲空,不爲空則用AND拼接。變量寫成#{xx}

拼接條件爲"LIKE"模糊查詢,適用於MySql數據庫

if 條件同樣,另外要用concat做拼接。

like concat('%', #{userName}, '%')

oracle數據庫中,模糊查詢報錯「參數缺失」。

模糊查詢的格式問題

法一用"||"分隔。like '%' || #{userName} || '%'

法二:like concat(concat('%', #{userName}), '%')

 Mybatis中實現傳統多條件查詢

 

 數據表student以下:

 

已有的數據以下:

 

咱們如今進行以下查詢:

查詢表中grade>70 age>20 的女生

SQL語句天然以下:


在數據庫中直接執行這句SQL語句:select * from student where sex="女" and grade>70 and age>20;

如今使用Mybatis完成這個操做:

在student.xml中添加以下配置語句:

測試語句:

 
     

 

由於傳入的參數有多個 因此須要使用Map來傳遞

能夠獲得剛纔的答案

 

這樣的查詢引出了下面三個問題:

1.沒法靈活的添加條件

2.若是隻想按照年齡與成績查詢 不能在sex處賦值爲空 仍須要新的SQL語句

3.若是採用拼接的方式(其實這樣也算改變了SQL語句)很是容易產生格式錯誤或者順序錯誤

 

動態SQL:if

 

應用場景1:

假設咱們如今須要對student表進行兩種操做:

  • 查詢全部信息
  • 根據專業名進行模糊查詢

按照如今的方式 咱們必須提供2條SQL語句分別應對這兩種操做

 

此時咱們介紹一下動態SQL中的if標籤在這裏的使用:

咱們來解釋一下這條SQL語句:

這條語句意味着:若是沒有傳入參數major 那麼執行select * from student 即查詢全部

若是傳入了參數majo 那麼執行這句模糊查詢

注意:這裏的<if test>中的test僅爲語法 實際等於if()

測試一下這兩種狀況:

 

第二種狀況:

 

 

 

 

 

應用場景2:

如今須要進行這種查詢:

根據姓名與專業來查詢數據:若是姓名爲空 將只根據專業來查詢 若是姓名不爲空 將只根據姓名來查詢

傳統SQL語句以下:

 select * from student where name=#{name} and major=#{major};

 在上面的SQL語句中咱們發現 若是#{name}爲空 那麼查詢結果直接爲空 並不能進入「根據專業查詢」這一個環節

 

咱們在測試中發現 根據name來查詢能夠獲得正確結果 而name爲空 試圖根據major來查詢時報錯

這是由於當major爲空 name不爲空時 SQL語句以下:

咱們發現問題出在這個where上

如何解決這個問題呢?

<where>標籤能夠自動進行判斷

若是任何條件都不成立 那麼在SQL語句中不會出現where

若是有條件成立 且這個標籤返回的內容是以「AND」或「OR」開頭的 會自動去掉這個多出來的and或者or

在測試代碼中:

 

 

<!-- 導出全部數據 -->
    <select id="exportAll" resultMap="map"> SELECT t1.MEDICAL_ID AS medicalId, ADDRESS AS address, DATE_START AS dateStart, DATE_END AS dateEnd, TIME_START AS timeStart, TIME_END AS timeEnd, AMBULANCE_NUM AS ambulanceNum, NAME AS name, PHONE AS phone FROM PM.T_MEETING_MEDICAL t1,PM.T_MEETING_MEDICAL_DOCTOR t2 <where> t1.MEDICAL_ID = t2.MEDICAL_ID <if test="address != null and address !='' "> AND ADDRESS = #{address} </if> <if test="dateStart != null and dateStart !='' "> AND DATE_START = #{dateStart} </if> <if test="dateEnd != null and dateEnd !='' "> AND DATE_END = #{dateEnd} </if> <if test="meetingId != null and meetingId !='' "> AND MEETING_ID = #{meetingId} </if> </where> ORDER BY t1.ADDRESS,t1.DATE_START </select>

 

public List<Map<String, Object>> exportAll(MeetingMedicalVo meetingMedicalVo);//接口 

 resultType*****************************************************************************************************************************
resultType是結果集的一個映射,能夠簡單的寫成resultType="map"或者resultType="hashmap",其中"map"和"hashmap"都是mybatis可以識別的別名,寫成"java.util.HashMap"固然也沒有問題。

說白了,即使使用resultType,mybatis也將使用resultMap進行查詢結果的映射。只是映射過程咱們是看不見的,方便寫代碼。
resultMap中id和result的區別:這二者之間的惟一不一樣是id 表示的結果將是當比較對象實例時用到的標識屬性。這幫助來改進總體表現,特別是緩存和嵌入結果映射(也就是聯合映射) 。官方原話,簡單的理解,就是當某一個列是惟一索引時,用id標籤,提升效率。

MyBatis擁有自動封 裝功能,只要你提供了返回類型,MyBatis會根據本身的判斷來利用查詢結果封裝對應的對象,因此前面的簡單查詢中,若是你不在resultMap中明 確的指出id對應哪一個字段,title對應哪一個字段,MyBatis也會根據自身的判斷來幫你封裝,MyBatis的自身判斷是把查詢的field或其對 應的別名與返回對象的屬性進行比較,若是相匹配且類型也相匹配,MyBatis則會對其進行賦值。

相關文章
相關標籤/搜索