適合使用返回值是自定義實體類的狀況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則會對其進行賦值。