MyBatis框架簡單入門
阿新 • • 發佈:2018-11-13
·
MyBatis
起步:
(1)MyBatis 是一個優秀的資料庫持久化框架
(2)可以解決java中進行JDBC操作時的繁雜步驟
(6)核心物件
1.SqlSessionFactory 工廠模式
2.SqlSession 執行SQL
配置:
<!--配置資料庫環境--> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mydb"/> <property name="username" value="root"/> <property name="password" value="rootroot"/> </dataSource> </environment> </environments>
<!--配置Mapper檔案--> <mappers> <!--classpath中的路徑--> <mapper resource="mapper/ProductMapper.xml"/> </mappers>
</configuration>
<insert id="save" parameterType="com.kaishengit.entity.Product"> insert into product(product_name,product_inventory) values(#{productName},#{productInventory}) </insert>
</mapper>
使用sqlSessiopn api 進行CRUD
三.多個方法引數 ①將多個引數封裝到一個物件裡,將該物件傳到方法裡; ② 將多個引數封裝到一個Map集合裡,key值為引數的名稱,value值為引數的值; ③將多個引數傳入到方法裡:
六.動態Sql if choose(when,otherwise) trim(where,set) foreach ①if 做判斷,查詢符合條件的語句: eg: < select id ="find" resultType ="com.kaishengit.entity.Article" > SELECT * from t_article < if test ="title !=null and title!= ''" > WHERE title like #{title} </ if > </ select > 更具條件判斷
②WHERE 拼接sql語句中有where and| on 開頭時 通過<WHERE> 可以將拼接SQL中的And on 等抹掉 eg: < select id ="findByParam" resultType ="com.kaishengit.entity.Article" > SELECT * from t_article < where > < if test ="title != null and title != ''" > WHERE title LIKE #{title} </ if > < if test ="simplecontent !=null and simplecontent!= ''" > AND simplecontent LIKE #{simplecontent} </ if > </ where > </ select > ③choose...when 有多個限制語句時,使用choose...when
④trim where的增強版,可以設定屬性 prefix="where" prefixOverrides="and|or" 通過設定 可以抹去sql語句中後面的and | or 等 eg: <trim prefix="where" prefixOverrides ="and|or"> <if test="username != null and username != ''"> username = #{username} </if> <choose> <when test="password != null and password != ''">and password = # {password} </when> <when test="email != null and email != ''"> and email = #{email} </when> </choose> </trim> ⑤set 修改多個屬性的時候,set判斷是否為空,抹去SQL語句後的, eg: <update id="updateAuthorIfNecessary" parameterType="domain.blog.Author"update Author <set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id} </update>
⑥foreach 可以迴圈查詢多條語句, eg: < select id ="findByIdList" resultType ="com.kaishengit.entity.Article" > SELECT * from t_article WHERE id IN < foreach collection ="collection" item ="id" separator ="," open ="(" close =")" > #{id} </ foreach > </ select > 注:sepatator:分隔符 open:左括號 close:右括號 ⑦批量新增 一條insert語句插入多條內容 eg: < insert id ="batchSave" > INSERT INTO mybatis (NAME, age, cls_id) VALUES < foreach collection ="UserList" item ="User" separator ="," > (#{User.name},#{User.age},#{User.clsId}) </ foreach > </ insert > 快取: 一級快取: 在 同一個Sqlsession 中,查詢 同一個物件 多次,只有第一次會真正的 去 資料庫中去查詢,其他的查詢都在一級快取中獲得 預設開啟 二級快取: 預設關閉 在同一個 SqlSessionFactory 中產生的 多個Sqlsession 之間共享; 開啟二級快取: 1.將被快取的物件進行序列化(實現序列化介面) 2.在Mapper.xml檔案中新增 <cache/> 節點,
基於註解的配置: 一。在MyBatis中註解不能完全替代XML,常以註解加xml或只使用xml的形式; 二。如果只使用註解,則在Mabatis配置檔案中配置介面,如果是註解+xml或這是xml 時。則在MyBatis的主配置檔案中配置XMl,不能時介面 三。常見的註解:
檢視程式碼:https://github.com/Deerlinh/MyBatis_1
- 將物件作為SQL的引數傳入
- 將查詢的結果轉換為Java物件
- 建立工程
- 新增Maven依賴
- junit
- MySQL
- MyBatis
- 建立MyBatis配置檔案
- <?xml version="1.0" encoding="UTF-8" ?>
<!--配置資料庫環境--> <environments default="dev"> <environment id="dev"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mydb"/> <property name="username" value="root"/> <property name="password" value="rootroot"/> </dataSource> </environment> </environments>
<!--配置Mapper檔案--> <mappers> <!--classpath中的路徑--> <mapper resource="mapper/ProductMapper.xml"/> </mappers>
</configuration>
- 建立Mapper配置檔案
- <?xml version="1.0" encoding="UTF-8" ?>
<insert id="save" parameterType="com.kaishengit.entity.Product"> insert into product(product_name,product_inventory) values(#{productName},#{productInventory}) </insert>
</mapper>
- 其他配置
- settings
- 將資料庫中的下劃線風格的命名對映為java中的駝峰命名風格;
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- 別名:給java類的完全限定名建立別名:
- 包中所有類都有一個類名首字母小寫的別名
- settings
使用sqlSessiopn api 進行CRUD
- 新增insert()
- 檢視結果為selectList()
- 檢視結果單條記錄selectOne()
- 修改update
- 刪除 delete
- 建立介面:
- 介面的完全限定名和Maooer.xml 檔案中的namespach相同
- 介面的方法名和xml檔案中的id屬性相同
- 介面中的引數和返回值的型別和xml檔案中的引數和返回值相同
- 通過SqlSession物件的getMapper()方法動態建立介面的實現類(動態程式碼模式)
- 通過介面指向實現類的方法來呼叫介面中定義的方法;
三.多個方法引數 ①將多個引數封裝到一個物件裡,將該物件傳到方法裡; ② 將多個引數封裝到一個Map集合裡,key值為引數的名稱,value值為引數的值; ③將多個引數傳入到方法裡:
- xml中不能寫引數型別
- 引數名稱
- 第一個引數為arg0,第二個引數為arg1
- 第一個引數為param1.第二個引數為param2
- 使用@param註解來給引數命名
六.動態Sql if choose(when,otherwise) trim(where,set) foreach ①if 做判斷,查詢符合條件的語句: eg: < select id ="find" resultType ="com.kaishengit.entity.Article" > SELECT * from t_article < if test ="title !=null and title!= ''" > WHERE title like #{title} </ if > </ select > 更具條件判斷
②WHERE 拼接sql語句中有where and| on 開頭時 通過<WHERE> 可以將拼接SQL中的And on 等抹掉 eg: < select id ="findByParam" resultType ="com.kaishengit.entity.Article" > SELECT * from t_article < where > < if test ="title != null and title != ''" > WHERE title LIKE #{title} </ if > < if test ="simplecontent !=null and simplecontent!= ''" > AND simplecontent LIKE #{simplecontent} </ if > </ where > </ select > ③choose...when 有多個限制語句時,使用choose...when
④trim where的增強版,可以設定屬性 prefix="where" prefixOverrides="and|or" 通過設定 可以抹去sql語句中後面的and | or 等 eg: <trim prefix="where" prefixOverrides ="and|or"> <if test="username != null and username != ''"> username = #{username} </if> <choose> <when test="password != null and password != ''">and password = # {password} </when> <when test="email != null and email != ''"> and email = #{email} </when> </choose> </trim> ⑤set 修改多個屬性的時候,set判斷是否為空,抹去SQL語句後的, eg: <update id="updateAuthorIfNecessary" parameterType="domain.blog.Author"update Author <set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id} </update>
⑥foreach 可以迴圈查詢多條語句, eg: < select id ="findByIdList" resultType ="com.kaishengit.entity.Article" > SELECT * from t_article WHERE id IN < foreach collection ="collection" item ="id" separator ="," open ="(" close =")" > #{id} </ foreach > </ select > 注:sepatator:分隔符 open:左括號 close:右括號 ⑦批量新增 一條insert語句插入多條內容 eg: < insert id ="batchSave" > INSERT INTO mybatis (NAME, age, cls_id) VALUES < foreach collection ="UserList" item ="User" separator ="," > (#{User.name},#{User.age},#{User.clsId}) </ foreach > </ insert > 快取: 一級快取: 在 同一個Sqlsession 中,查詢 同一個物件 多次,只有第一次會真正的 去 資料庫中去查詢,其他的查詢都在一級快取中獲得 預設開啟 二級快取: 預設關閉 在同一個 SqlSessionFactory 中產生的 多個Sqlsession 之間共享; 開啟二級快取: 1.將被快取的物件進行序列化(實現序列化介面) 2.在Mapper.xml檔案中新增 <cache/> 節點,
- 對映語句檔案中所有的select語句將被快取
- select節點的userCache屬性為false時表示不使用快取
- 對映語句檔案中的insert,update,delete語句會重新整理快取
- flushCache屬性為false時表示不重新整理快取
- 快取會使用lset recently used(LRU 最進很少使用 的) 演算法來回收
- 根據時間的間隔來重新整理快取,預設不重新整理
- 快取會儲存列集合或物件的1024個引用;
- 快取被視為read/writh的快取
基於註解的配置: 一。在MyBatis中註解不能完全替代XML,常以註解加xml或只使用xml的形式; 二。如果只使用註解,則在Mabatis配置檔案中配置介面,如果是註解+xml或這是xml 時。則在MyBatis的主配置檔案中配置XMl,不能時介面 三。常見的註解:
- @insert
- @update
- @select
- @delete
- Options
- 使用自動增長的主鍵
- 重新整理快取
- 不適用快取
- 結果集對映
- @Results
- @Result
- @One
- @Many
- CaCheNamespace
- 二級快取開啟
- 如果是註解+xml時,二級快取在XML中進行
檢視程式碼:https://github.com/Deerlinh/MyBatis_1