MyBatis框架學習總結
技術標籤:mybatis
MyBatis框架學習總結
1.Mybatis介紹
一個優秀的基於java的持久層框架,內部封裝了jdbc,使開發者只需要關心sql語句本身,而不需要花費經歷在如何載入驅動,建立連結,建立statement等繁雜的過程, mybatis通過註解和xml配置的方式將要執行各種statement配置起來。並通過java物件和statement中的動態引數進行對映生成最終執行的sql語句
最後mybatis框架執行sql語句並將其封裝為java物件返回採用ORM思想解決了實體與資料庫對映的問題,遮蔽了jdbc api 底層訪問細節,使我們不用與jdbc api 打交道,就可以完成對資料庫的持久化操作。
原始jdbc開發存在的問題如下:
1.資料庫建立及頻繁釋放造成系統資源浪費
2.sql語句在程式碼中硬編碼,實際運用中sql的變化較大,sql變動需要改變java程式碼
3.查詢操作,需要手動將結果集裡的資料封裝到實體中,插入操作時,需要手動將實體的資料設定到sql語句的佔位符
解決方案:
1.使用資料庫連線池技術
2.使用xml配置的方式配置sql語句
3.使用反射內省的技術自動將實體和表進行屬性與欄位的自動對映
ORM(Object Relational Mapping)物件關係對映,它的作用是在關係型資料庫和物件之間作一個對映,這樣,我們在具體的操作資料庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作物件一樣操作它就可以了 ,即將程式中的物件自動的持久化到關係資料庫中
ORM簡介:
O(物件模型):
實體物件,即我們在程式中根據資料庫表結構建立的一個個實體Entity。
R(關係型資料庫的資料結構):
即我們建立的資料庫表。
M(對映):
從R(資料庫)到O(物件模型)的對映,可通過XML檔案對映。
如圖:當表實體傳送變化時,ORM會幫助我們把實體的變化對映到資料庫表。
作用
ORM框架自動實現Entity實體的屬性與關係型資料庫欄位的對映。CRUD的工作則可以交給ORM來自動生成程式碼方式實現。隱藏了資料訪問細節,“封閉”的通用資料庫互動,他使得我們的通用資料庫互動變得簡單易行,並且完全不用考慮SQL語句。大大提高我們開發效率, 這樣一來也減少我們維護一個複雜 缺乏靈活性資料訪問層的成本。
2.一對一對映
1.巢狀結果
是關聯的意思,常被用來表示(has-one)型別的關聯。就是物件1裡面關聯另
一個物件2
<!-- 獨立的Address封裝對映 --> <resultMap type="Address" id="AddressResult"> <id property="addrId" column="addr_id" /> <result property="street" column="street" /> <result property="city" column="city" /> <result property="state" column="state" /> <result property="zip" column="zip" /> <result property="country" column="country" /> </resultMap> <!-- Student封裝對映,裡面關聯上Address的封裝對映 --> <resultMap type="Student" id="StudentWithAddressResult"> <id property="studId" column="stud_id" /> <result property="name" column="name" /> <result property="email" column="email" /> <result property="dob" column="dob" /> <result property="phone" column="phone" /> <association property="address" resultMap="AddressResult" /> </resultMap> <select id="selectStudentWithAddress" parameterType="int" resultMap="StudentWithAddressResult"> select s.stud_id, s.name, s.email,s.dob,s.phone, a.addr_id, a.street, a.city, a.state, a.zip, a.country from students s left outer join addresses a on s.addr_id = a.addr_id where stud_id = #{id} </select>
2.巢狀查詢
<!-- 獨立的Address封裝對映 -->
<resultMap type="Address" id="AddressResult">
<id property="addrId" column="addr_id" />
<result property="street" column="street" />
<result property="city" column="city" />
<result property="state" column="state" />
<result property="zip" column="zip" />
<result property="country" column="country" />
</resultMap>
<!-- 獨立的select查詢,專門查詢Address -->
<select id="findAddressById" parameterType="int" resultMap="AddressResult">
select * from addresses
where addr_id=#{id}
</select>
<!-- Student封裝對映,裡面關聯了查詢address使用的select語句,並指定資料庫表中的這個關聯的外
鍵列的名字,這裡是addr_id -->
<resultMap type="Student" id="StudentWithAddressResult">
<id property="studId" column="id" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="dob" column="dob" />
<result property="phone" column="phone" />
<association property="address" column="addr_id" select="findAddressById" />
</resultMap>
<!-- 查詢Student的select語句,這裡不用寫多表查詢,因為對於address的關聯查詢,已經在上邊定義
好了,並且在結果對映中關聯進來了 -->
<select id="selectStudentWithAddress" parameterType="int"
resultMap="StudentWithAddressResult">
select
id,name,email,dob,phone,addr_id
from
students
where
id = #{id}
</select>
在此方式中, 元素的select屬性被設定成了id為findAddressById的語句。
兩個分開的SQL語句將會在資料庫中分別執行,第一個通過id查詢student資訊,而第二個呼叫
findAddressById來載入address資訊。
addr_id列的值將會被作為輸入引數傳遞給selectAddressById語句作為引數進行條件查詢。
總結對比:
巢狀結果
一條sql語句,查詢出所有表中的資料,然後交給一個ResultMap去對映,這個ResultMap只負責對映
封裝一部分資料,另一部分資料交給第二個ResultMap來對映,這個倆個ResultMap之間,使用標籤
進行關聯
例如,
巢狀查詢
把之前一條sql語句,拆分成多條sql語句,每條sql語句只查詢一張表並封裝一部分資料,然後使用
標籤 將多條sql語句關聯起來,最後把結果合併起來就是完整的查詢結果
例如,
3.一對多對映
標籤可以用來將多行課程結果對映成一個課程Course物件的集合。
類似於一對多
4.多對多對映
參照一對多
5.動態(動態SQL是Mybatis強大的特性之一)
if
被用來通過條件嵌入SQL片段,如果條件為true,則相應地SQL片段將會被新增到SQL語句中。
假定有一個課程搜尋介面,設定了講師(Tutor)下拉列表框,課程名稱(CourseName)文字輸入框,
開始時間(StartDate)輸入框,結束時間(EndDate)輸入框,作為搜尋條件,其中課講師下拉列表是必
須選的,其他的都是可選的。
choose
有時候,查詢功能是以查詢 類別 為基礎的。
例如,頁面中有一個下拉列表,可以選擇查詢的類別,可以選擇根據講師查詢、或者根據課程名查詢、
或者根據時間查詢等等,選擇了列表之後,再輸入關鍵字進行查詢。
搭配使用
where
有時候,所有的查詢條件應該是可選的。
在需要使用至少一種查詢條件的情況下,可以直接使用WHERE子句,如果有多個條件,需要在條件中添
加AND或OR。
foreach
另外一個強大的動態SQL語句構造標籤是
它可以迭代遍歷一個數組或者集合,構造AND/OR條件或一個IN子句。
假設查詢tutor_id為 1,3,6的講師所教授的課程,我們可以傳遞一個tutor_id組成的列表給對映語句,然
後通過 遍歷此列表構造動態SQL。
trim
元素和 元素類似,同時 提供了新增 字首/字尾 或者 移除 字首/字尾 的功能。
<select id="searchCourses" parameterType="map" resultMap="CourseResult">
SELECT * FROM COURSES
<trim prefix="WHERE" suffixOverrides="and">
<if test=" tutorId != null ">
TUTOR_ID = #{tutorId} and
</if>
<if test="courseName != null">
name like #{courseName} and
</if>
</trim>
</select>
prefix表示有一個if成立則插入where語句
suffix表示字尾,和prefix相反
suffixOverrides="and"表示如果最後生成的sql語句多一個and,則自動去掉.
prefixOverrides的意思是處理字首,和suffixOverrides相反
set
元素和 元素類似,但是set元素只是針對update更新語句使用的。
<update id="updateStudent" parameterType="Student">
update students
<set>
<if test="name != null">name=#{name},</if>
<if test="email != null">email=#{email},</if>
<if test="phone != null">phone=#{phone},</if>
</set>
where id=#{studId}
</update>