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