1. 程式人生 > >**Mybatis框架 筆記一 [共四篇,史上最全重點]*

**Mybatis框架 筆記一 [共四篇,史上最全重點]*

mybatis的四天安排

* 第一天: mybatis入門
	* mybatis的概述
	* mybatis的環境搭建
	* mybatis入門案例
	* 自定義mybatis框架(主要的目的是為了讓大家瞭解mybatis中執行細節)
* 第二天:mybatis基本使用
	* mybatis的單表crud操作
	* mybatis的引數和返回值
	* mybatis的dao編寫
	* mybatis配置的細節
		* 幾個標籤的使用
* 第三天:
	* mybatis的深入和多表
	* mybatis的連線池
	* mybatis的事務控制及設計的方法
	* mybatis的多表查詢
		* 一對一(多對一)
		* 多對多
* 第四天:
	* mybatis的快取和註解開發
	* mybatis中的載入時機(查詢的時機)
	* mybatis中的一級快取和二級快取
	* mybatis的註解開發
		* 單表CRUD
		* 多表查詢

mybatis今日

1.什麼是框架? * 它是我們軟體開發中的一套解決方案,不同的框架解決的是不同的問題。 * 框架是整個或部分系統的可重用設計,表現為一組抽象構件及構件例項間互動的方法。 另一種定義認為:框架是一種可被應用開發者定製的應用骨架。前者是從應用層面後者是從目的方面給出的定義。 * 通俗的講:它是我們軟體開發中的一套解決方案,不同的框架解決的是不同的問題。 * 以我們的角度解決實際開發的角度描述框架: * 框架是實現了一定功能的半成品軟體,所謂半成品軟體,就是沒有完全實現使用者的需求,只實現了一部分。框架還需要加工,不斷完善,才能滿足使用者的所有需求。所以:框架面向的客戶是開發人員,而不是客戶。 * 既然框架是半成品軟體,我們又為什麼要花這麼大的成本去學習呢? 1.實現完成了一定的功能(簡單,重複的,複雜的等之類的),提供了方便。 2.提供了非常清晰的架構。 3.做IT,網際網路,思維很重要!要懂底層原理,活學活用。 * 使用的好處: * 框架封裝了很多的細節,使開發者可以使用極簡的方式實現功能。大大提高效率 2.三層架構: * 表現層: 是用於展示資料的 SpringMVC * 業務層: 是處理業務需求 Sping :IOC(控制反轉與面向切面) * 持久層: 是和資料庫互動的 Mybatis 3.持久層技術解決方案: * JDBC技術: * Connection 連線 * PreparedStatement 連線物件 * ResultSet 查詢 * Spring 的JdbcTemplate * Spring 中對jdbc的簡單封裝 * Apache的BDUtils: * 它和Spring的JdbcTemplate很像,也是對Jdbc的簡單封裝 * 以上這些都不是框架,JDBC是規範,其他都只是工具類。只是使用的封裝,並沒有一套完整的解決方案。 * 為什麼要用框架: * 開發人員需要關心的是核心業務邏輯,而不是一系列為了核心業務邏輯而做的大量預備工作。 4.mybatis的概述: * mybatis是一個持久層框架,用java編寫的 * 它封裝了jdbc操作的很多細節,使開發者只需要關注sql語句本身,而無需關注註冊驅動,建立連線等繁雜過程 * mybatis通過xml或註解的方式將要執行的各種statement配置起來,並通過java物件和statement中sql的動態引數進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映為java物件並返回。 * 它使用ORM思想解決了實體和資料庫對映的問題,對jdbc進行了封裝,遮蔽了jdbc實現的細節。實現了結果集的封裝。 * ORM:Object Relational Mappging 物件關係對映 * 簡單的說:就是把資料庫表和實體類及實體類的屬性對應起來,讓我們可以操作實體類就實現操作資料庫表; * 今天我們需要做到:實體類中的屬性和資料庫表的欄位名稱保持一致。 * user -> Uer * id -> id * user_name ->user_name 5.mybatis的入門 * mybatis的環境搭建(建立專案的時候不要匯入模板,因為裡面有很多bug,以後可能會出現各種各樣的問題。) 1. 開啟idea工具,建立一個空的工程 2. 建立一個maven專案,GroupId:com.theima ArtifactId:day01_mybatis 3. 開啟SQLYog,複製mybatisdb.sql中的User,建立User表,再新增進資料。 4. 在pom.xml中新增角標。depencies中新增:mybatis, mysql,log4j(日誌),junit(單元測試) 5. 在com.ithema.domain建立一個User.java表,建立對應的引數和相應的方法。 6. 建立一個Dao包下的IUserDao(前面I無其他含義,只是為了表明這是一個介面)介面,提供一個方法,ListfindALl() 7. 在resource下新建一個SqlMapConfig.xml(習慣會以此命名,無其他含義),將pom.xml頭部資訊匯入進來。(核心配置檔案)

<?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>
	<!-- 配置 mybatis 的環境 -->
	<environments default="mysql">
	<!-- 配置 mysql 的環境 -->
	<environment id="mysql">
	<!-- 配置事務的型別 -->
	<transactionManager type="JDBC"></transactionManager>
	<!-- 配置連線資料庫的資訊:用的是資料來源(連線池) -->
	<dataSource type="POOLED">
	<property name="driver" value="com.mysql.jdbc.Driver"/>
	<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
	<property name="username" value="root"/>
	<property name="password" value="123456"/>
	</dataSource>
	</environment>
	</environments>
	<!-- 告知 mybatis 對映配置的位置 -->
	<mappers>
	<mapper resource="com/itheima/dao/IUserDao.xml"/>
	</mappers>
	</configuration>
	8. 在resources中建立對應的三級目錄對映檔案IUserDao.xml,寫入:
		<?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.itheima.dao.IUserDao">
		<!-- 配置查詢所有操作 -->
		<select id="findAll" resultType="com.itheima.domain.User">
		select * from user
		</select>
	9. 測試---步驟:
		1. 讀取配置檔案 
			* InputStream in=Resources.getResourceAsStream("SqlMapConfig.xml")
		2. 建立SqlSessionFactory工廠
			* SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
			* SqlSessionFactory factory =builder.build(in);
		3. 使用工廠生產SqlSession物件
			* SqlSession session=factory.openSession();
		4. 使用SqlSession建立Dao介面的代理物件
			* IUserDao userDao=session.getMapper(IUserDao.class);
		5. 使用代理物件執行方法
			* List<User> users=userDao.findAll();
			* for(User suer: users){
			* System.out.println(user);
			* }
		6. 釋放資源
			* session.close();
			* in.close();
* 總結:
	* mybaits的環境搭建
		1. 建立maven專案
		2. 匯入maven的相關座標
		3. 準備資料資源(建表)
		4. 建立核心配置檔案SqlMapConfig.xml  (建議命名統一規範)
		5. 建立對映配置檔案			(對映與包名都必須一致相同)
		6. 建立測試類
			1. 讀取配置檔案
			2. 建立SqlSessionFactory工廠
			3. 建立SqlSession
			4. 建立Dao介面的代理物件
			5. 執行dao中的方法
			6. 釋放資源
				* 注意事項:不要忘記在對映配置中告知mybatis中
	* 環境搭建的注意事項:
		1. 建立IUserDao.xml和IuserDao.java時名稱是為了和我們之前的知識保持一致,在Mybatis中它把持久層的操作介面名稱和對映檔案也叫做Mapper;所以:IuserDao和IUserMapper是一樣的
		2. 
			* 在idea中建立目錄的時候,它和包是不一樣的
			* 包在建立時,com.itheima.dao是三級目錄
			* 目錄在建立時,com.theima.dao是一級目錄
		3. mybatis的對映配置檔案位置必須和dao介面的包結構相同
		4. 對映配置檔案的mapper標籤namespace屬性的取值必須是dao介面的全限定類名
		5. 對映配置檔案的操作配置(select),id屬性的取值必須是dao介面的方法名
			當我們遵從了三,四,五點之後,我們在開發中就無需再寫dao的實現類。
* 使用註解方法建立mybatis案例:
	1.建立環境工程
	2.建立對應的專案,domain實體類,dao介面,pom.xml(不需要在resouces中建立dao介面的對應配置檔案了)
	3.將pom.xml中<mappers>內容修改為:<mapper class="com.itheima.dao.UserDao";  //class中寫全限定類名
	4.在dao介面的方法上使用@Select註解,並且指定SQL語句  //@Select("select* from user")
* 明確:
	* 我們在實際開發中,都是越簡便越好,所以都是採用不寫dao實現類的方式。(mybatis中是支援寫實現類的,但實際上是不用寫的)
	* 不管
	* 使用配置檔案跟類不關聯,而配置檔案是直接寫在類方法上的,所以能省去很多方法。實際開發過程中,兩個都在用,看實際情況。
* 讀配置檔案:
	* 錯誤:
		* d:/xxx/xxx.xml
		* src/java/main/xxx.xml
	* 正確方式:
		1. 使用類載入器,它只能讀取類路徑的配置檔案
		2. 使用ServletContext物件的getRealPath()
	* 建立工廠mybatis使用了構建者模式:
		* 優勢:把物件的建立細節隱藏,使使用者直接呼叫方法即可拿到物件。
	* 生產SqlSession使用了工廠模式:
		* 優勢:解耦(降低類之間的依賴關係)
	* 建立Dao介面實現類使用了代理模式
		* 優勢:不修改原始碼的基礎上對已有的方法進行增強。

mybatis的入門案例–掌握

* 讀取配置檔案sqlMapconfig.xml
* 建立SqlSessionFactory工廠	
* 使用工廠生成SqlSession物件
* 使用sqlSession物件建立dao介面的代理獨享
* 執行dao的方法
* 釋放資源
  注意:在查詢操作過程中,不要忘記在對映配置檔案中藥指定返回的結果集全類名,要求XML和註解的方式各寫一套;

自定義mybatis框架

  1. 原理解析一:
    1. 根據配置檔案的資訊建立Connection物件
      • 註冊驅動,獲取連線
    2. 獲取預處理物件PreparedSatement
      • 此時需要SQL語句 conn.prepareStatement(sql);
    3. 執行查詢
      • ResultSet resultSet=preparedStatement.executeQuery();
    4. 遍歷結果集用於封裝: Listlist=new ArrayList(); while(reulstSet.next()){ E element=(E)Class.forName(配置的全限定類名).newInstance() //進行封裝,把每個rs的內容都新增到element中 //我們的實體類屬性和表中的列名是一致的。 //於是我們就可以把表的列名看成是實體類的屬性名稱 //就可以使用反射的方式來根據名稱獲取每個屬性,並把值賦值進去 //把element加入到list中 list.add(element); }
    5. 要想上上策的方法執行,需要給方法提供兩個資訊
      • 第一個: 連線資訊
      • 第二個:對映資訊:
        • 它包含了兩個部分:
          • 第一:執行的SQL語句
          • 第二: 封裝結果的實體類的全限定類名
          • 把這兩個資訊組合起來定義成一個物件
      1. 通過了一個方法實現了一個代理物件的建立

2.自定義Mybatis建立: 1. 建立maven工程,賦值程式碼(入門案例的程式碼) 2. 幹掉pom.xml中的mybatis的座標 3. 在測試類MyBatisTest類中會大量報錯—>報什麼錯就建什麼類或介面 1. Resources–讀取io操作。用類載入器 2. sqlSessionFactoryBuilder–>提供一個build(inputstream in)方法產生一個SqlSessionFactory工廠(介面) 3. 建立SqlSession物件–>SqlSessionFactory中定義另一個openSession()方法 4. SqlSession物件中定義一個getMapper方法 T getMapper(class daoInterfaceClass) 4.關鍵點:架子已經搭好,接下來就是展示真正的技術了! 1. 在SQLSessionFacotryBuilder,build方法中去加入的工具類去解析io流 2. 工具類就是XMLConfigBuilder 1. 該類幫助我們解析核心主配置檔案以及對應的對映檔案 2. 返回給我們一個configuration物件,該物件就包含了連線資料庫的資訊以及sql語句和返回型別的全限定類名 5.核心點: * 有builder物件創建出來factory物件,factory建立了sqlSession物件 * 關鍵點Ian就在sqlSession物件的getMapper方法–>通過動態代理