MyBatis快速入門 配置文件解析 動態sql

mybatis 基礎目標

目標
1.Mybatis概述
2.MyBatis快速入門
3.配置文件解析(mybatis 的核心)
4.mapper配置文件解析
5.動態SQL

Mybatis概述

ORM ,即對象關係映射(ORM Obeject Relational Mapping) 。ORM模型就是數據庫的表與簡單Java對象(POJO)的映射模型,它主要解決數據庫數據和POJO對象的相互映射。

對象關係映射

1.ORM 與JDBC的區別

/*jdbc代碼*/
...
Connection conn =null;
statement state=null;
try{
	//註冊mysql 驅動
	class.forName(“com.mysql.jdbc.Driver”);
	//建立數據庫連接
	conn=DriverManager.getConnection();
	//建立運行對象
	Statement st = connection.createStatement();
	// prepareStatement 和 Statement 區別?前者高效且可以防止sql注入,這裏不做過多的解釋
	//運行sql語句
	String sql="..";
	//需要設置事務手動提交用於回滾事務
	ResultSet rs=st.executeQuery(sql)
	//st.executeUpdate(sql)
	//處理運行結果
	if (rs.next()) {
		...
	}
}catch(){
}finally{
 //關閉連接
 rs.close();
 st.close();
 conn.close();
}

JDBC操作數據庫——步驟:

第1步:註冊驅動 (僅僅做一次)
第2步:建立連接(Connection)
第3步:創建運行SQL的語句(Statement)
第4步:運行語句
第5步:處理運行結果(ResultSet)
第6步:釋放資源*

傳統的JDBC編程存在的弊端:

1.工作量大,操作數據庫至少要5步;
2.業務代碼和技術代碼高耦合;
3.連接資源手動關閉,帶來了隱患;

ORM優勢

1.工作量減少了,更加貼合面向對象的編程語意
2.業務代碼和技術代碼解耦
3.連接資源自動關閉

ORM 下的兩大框架hibernate和mybatis的區別?

hibernate 優劣

缺點
1.無法自定義組裝sql,複雜的關聯關係以及複雜的sql語句處理支持弱
2.不支持存儲過程
3.HQL黑盒封裝,調優複雜。
4.性能較差,不適合大型互聯網高性能要求,適合OA,ERP等辦公管理系統。
優點
1.不需要寫sql語句
2.移植性好
3.二級緩存良好

mybatis 優劣

缺點
1.需要寫大量的sql語句,工作量大。
2.移植性弱
優點
1.學習門檻低,易於維護
2.高度靈活,幾乎可以取代JDBC
3.調優方便,基於底層SQL的優化能力
4.性能較高。

2.MyBatis快速入門

mybatis 是面向接口編程。

其原因是它是通過xml配置文件直接映射到mapper接口上的,而沒有具體實現,我們用的時候就是直接調用mapper接口。

mybatis執行流程

SqlSessionFactoryBuilder:讀取配置信息創建SqlSessionFactory,建造者模式,方法級別生命週期;
SqlSessionFactory:創建Sqlsession,工廠單例模式,存在於程序的整個生命週期;
SqlSession:代表一次數據庫連接,可以直接發送SQL執行,也可以通過調用Mapper訪問數據庫;線程不安全,要保證線程獨享(方法級);
SQL Mapper:由一個Java接口和XML文件組成,包含了要執行的SQL語句和結果集映射規則。方法級別生命週期;
config.xml是mybatis核心配置文件

	private SqlSessionFactory sqlSessionFactory;

	@Before
	public void init() throws IOException {
		String resource = "config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		// 1.讀取mybatis配置文件創SqlSessionFactory
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		inputStream.close();
	}

	@Test
	// 測試自動映射
	public void testAutoMapping() throws IOException {
		// 2.獲取sqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// 3.獲取對應mapper
		TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
		// 4.執行查詢語句並返回結果
		TUser user = mapper.selectByPrimaryKey(1);
		System.out.println(user);
	}

3.配置文件解析(mybatis 的核心)

屬性名 說明 備註
properties 定義配置,配置的屬性可以在整個配置文件中其他位置進行引用; 重要,優先使用property配置文件解耦
settings 設置,用於指定MyBatis的一些全局配置屬性,這些屬性非常重要,它們會改變MyBatis的運行時行爲; 重要
typeAliases 別名,爲Java類型設置一個短的名字,映射時方便使用;分爲系統定義別名和自定義別名; 可以通過xml和註解配置
typeHandlers 用於jdbcType與javaType之間的轉換 用於jdbcType與javaType之間的轉換;
plugins 插件,MyBatis允許你在已映射的語句執行過程中的某一點進行攔截調用; 重要
environments 用於配置多個數據源,每個數據源分爲數據庫源和事務的配置; 在多數據源環境使用
ObjectFactory MyBatis每次創建結果對象的新實例時,它都會使用對象工廠(ObjectFactory)去構建POJO 大部分場景下無需修改
mappers 配置引入映射器的方法。可以使用相對於類路徑的資源引用、或完全限定資源定位符(包括file:///的URL),或類名和包名等等 重要

config.xml

4.mapper配置文件解析

cache – 給定命名空間的緩存配置。
cache-ref – 其他命名空間緩存配置的引用。
resultMap – 是最複雜也是最強大的元素,用來描述如何從數據庫結果集中來加載對象。
sql – 可被其他語句引用的可重用語句塊。
insert – 映射插入語句
update – 映射更新語句
delete – 映射刪除語句
select – 映射查詢語句

insert 標籤,delete 標籤,select標籤,update標籤
其傳遞多個查詢入參時規範如下:

使用map傳遞參數;可讀性差,導致可維護性和可擴展性差,杜絕使用;
使用註解傳遞參數;直觀明瞭,當參數較少一般小於5個的時候,建議使用;
使用Java Bean的方式傳遞參數;當參數大於5個的時候,建議使用;

自動映射使用resultType

自動映射前提:SQL列名和JavaBean的屬性是一致的;
自動映射等級autoMappingBehavior設置爲PARTIAL,需要謹慎使用FULL;
如果列名和JavaBean不一致,但列名符合單詞下劃線分割,Java是駝峯命名法,則mapUnderscoreToCamelCase可設置爲true;

一般企業上用的是resultMap 手動映射
resultMap標籤

constructor - 用於在實例化類時,注入結果到構造方法中
idArg - ID 參數;標記出作爲 ID 的結果可以幫助提高整體性能
arg - 將被注入到構造方法的一個普通結果
id – 一個 ID 結果;標記出作爲 ID 的結果可以幫助提高整體性能
result – 注入到字段或 JavaBean 屬性的普通結果
association – 一個複雜類型的關聯;許多結果將包裝成這種類型
嵌套結果映射 – 關聯可以指定爲一個 resultMap 元素,或者引用一個
collection – 一個複雜類型的集合
嵌套結果映射 – 集合可以指定爲一個 resultMap 元素,或者引用一個
discriminator – 使用結果值來決定使用哪個 resultMap
case – 基於某些值的結果映射
嵌套結果映射 – 一個 case 也是一個映射它本身的結果,因此可以包含很多相 同的元素,或者它可以參照一個外部的 resultMap

sql標籤

參數:向sql語句中傳遞的可變參數
預編譯 #{}:將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號,能夠很大程度防止sql注入;
傳值 $ {} :傳入的數據直接顯示生成在sql中,無法防止sql注入;
表名、選取的列是動態的,order by和in操作, 可以考慮使用$

5.動態SQL

標籤 作用 備註
if 判斷語句 單條件分支判斷
choose、when、otherwise 相當於java的case when 多條件分支判斷
Trim、where、set 用於處理sql拼裝問題
foreach 在in語句等列舉條件常用,常用於實現批量操作 循環語句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章