1. 程式人生 > >MyBatis框架簡單入門

MyBatis框架簡單入門

· MyBatis 起步: (1)MyBatis 是一個優秀的資料庫持久化框架 (2)可以解決java中進行JDBC操作時的繁雜步驟
  • 將物件作為SQL的引數傳入
  • 將查詢的結果轉換為Java物件
(3)不會自動生成SQL,需要開發人員提供 (4)歷史上名為IBatis ,隸屬於apache 獨立後釋出MyBatis3.x 改名為MyBatis (5)官網: https://github.com/mybatis/ http://www.mybatis.org/mybatis-3/zh/index.html
(6)核心物件 1.SqlSessionFactory 工廠模式 2.SqlSession 執行SQL 配置:
  1. 建立工程

  1. 新增Maven依賴
    1. junit
    2. MySQL
    3. MyBatis
  2. 建立MyBatis配置檔案
    1. <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<!--配置資料庫環境--> <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>
  1. 建立Mapper配置檔案
    1. <?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"> <mapper namespace="com.kaishengit.mapper.ProductMapper">
<insert id="save" parameterType="com.kaishengit.entity.Product"> insert into product(product_name,product_inventory) values(#{productName},#{productInventory}) </insert>
</mapper>
  1. 其他配置
    1. settings
      1. 將資料庫中的下劃線風格的命名對映為java中的駝峰命名風格;
      2. <setting name="mapUnderscoreToCamelCase" value="true"/>
    2. 別名:給java類的完全限定名建立別名:
      1. 包中所有類都有一個類名首字母小寫的別名
<package name="com.kaishengit.entity"/> 包中所有類都有一個類名首字母小寫的別名 <typeAlias type="com.kaishengit.entity.Product" alias="Product"/>
使用sqlSessiopn api 進行CRUD
  1. 新增insert()
  2. 檢視結果為selectList()
  3. 檢視結果單條記錄selectOne()
  4. 修改update
  5. 刪除 delete
使用Mapper介面進行CURD
  1. 建立介面:
    1. 介面的完全限定名和Maooer.xml 檔案中的namespach相同
    2. 介面的方法名和xml檔案中的id屬性相同
    3. 介面中的引數和返回值的型別和xml檔案中的引數和返回值相同
  2. 通過SqlSession物件的getMapper()方法動態建立介面的實現類(動態程式碼模式)
  3. 通過介面指向實現類的方法來呼叫介面中定義的方法;
技巧: 一.對於insert,update,delete三種操作,MaBatis會自動返回int型別的 受影響行數; 二. 獲取自動增長的主鍵值: <insert id="save" parameterType="product" useGeneratedKeys="true" keyProperty="id"> insert into product(product_name,product_inventory) values(#{productName},#{productInventory}) </insert> useGenrateKeys="true" 使用自動增長的主鍵值 keyPropery=“id” 將主鍵賦值給parameter對應的物件的屬性上
三.多個方法引數 ①將多個引數封裝到一個物件裡,將該物件傳到方法裡; ② 將多個引數封裝到一個Map集合裡,key值為引數的名稱,value值為引數的值; ③將多個引數傳入到方法裡:
  1. xml中不能寫引數型別
  2. 引數名稱
    1. 第一個引數為arg0,第二個引數為arg1
    2. 第一個引數為param1.第二個引數為param2
  3. 使用@param註解來給引數命名
四.一對一,多對一 ①使用resultMap節點 < resultMap id="userMap" type="user"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <result column="address" property="address"/> <result column="password" property="password"/> <result column="dept_id" property="deptId"/> < association property="dept" javaType="com.kaishengit.entity.Dept"> <id column="dept_id" property="id"/> <result column="dept_name" property="deptName"/> </association> </resultMap> ②使用OGNL(物件圖導航語言) SELECT t_user.id, user_name, address, PASSWORD, dept_id, t_dept.id as 'dept.id', dept_name as 'dept.deptName' FROM t_user LEFT JOIN t_dept ON t_user.dept_id = t_dept.id WHERE t_user.id = #{userId} ③注意N+1問題: 快取不健全,依賴的外來鍵非常的分散請況下,效能很低。 通過設定別名來獲取,dept(關聯表)id...(關聯表中的屬性,別名和dept表中的屬性名相同) 五.多對多,一對多 只能使用resultMap節點 < resultMap id="userWithTagMap" type="com.kaishengit.entity.User" extends="baseMap"> <collection property="tagList" ofType="com.kaishengit.entity.Tag"> <id column="tag_id" property="id"/> <result column="tag_name" property="tagName"/> </collection> </resultMap> 查詢一個是使用<association>標籤 屬性 javaType=“關聯表的完全限定名” 查詢多個時使用<collection>標籤 屬性 ofType=“關聯表的完全限定名”
六.動態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