前身背景:
前身是iBatis,為Apache的一個開源項目。2010年遷移到了Google Code,改名為MyBatis.2013年遷移到Github。
MyBatis框架以及ORM
MyBatis是一個開源的數據持久層框架,內部封裝了通過JDBC訪問數據庫的操作,支持普通的SQL查詢、存儲過程和高級映射。作為持久層框架,主要思想是將程序中的大量的SQL語句分離出來,配置在相應的配置文件中,這樣可以在不修改代碼的情況下,直接在配置文件中的修改SQL。
ORM(Object/Relational Mapping)對象關系映射。是一種數據持久化的技術。在對象模型和關系型數據庫之間建立關系,並且提供了一種機制,通過JavaBean對象去操作數據庫表中的數據。MyBatis通過簡單的XML或者注解進行配置和原始映射,將實體類和SQL語句之間建立映射關系,是一種半自動化的ORM實現。
MyBatis環境搭建:
1.下載jar包,
官方網站:http://mybatis.org.(目前官網在國內受限制,若可以訪問到,所有下載鏈接全部引導至github上-----推薦下載mybatis-3.2.2.zip和mybatis-3-mybatis-3.2.2.zip)
github網址:https://github.com/mybatis/mybatis-3/releases.
2.部署jar包,
將下載的jar包以及需要的jar包(如:數據庫驅動jar文件或log4j負責日志數據jar文件)部署至項目的lib目錄下。
3.創建mybatis核心配置文件-configuration.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> <properties resource="mybatis.properties" /> <typeAliases> <package name="cn.bdqn.pojo" /> </typeAliases> <!-- 配置數據源,事務 --> <environments default="deploy"> <environment id="deploy"> <!-- 事務管理器:JDBC/MANAGED --> <transactionManager type="JDBC" /> <!-- 數據源:POOLED/UNPOOLED/JNDI --> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> </configuration>
configuration:配置文件的根節點。
Properties:從外部引入指定的properties屬性文件,一般為數據庫連接的配置信息。
Settings:設置MyBatis運行中的一些行為,如果,此次設置MyBatis的log日志文件實現為LOG4J,既使用log4j實現日志功能。
Environments表示配置多套運行環境,映射到不同的數據庫,該元素下可以配置多個environment子元素節點,但是必須通過default指定一個默認的運行環境。
<mappers> <mapper resource="cn/bdqn/dao/IUserMapper.xml" /> </mappers>
Mappers:作用是告訴MyBatis去哪里找SQL映射文件。
Mapper:具體指定SQL映射文件的路徑,resource屬性的值表示映射文件的路徑。
------注意:MyBatis中核心配置文件的元素節點是有一定順序的,若不按順序排位,那么XML文件會報錯。
4.創建持久化類(POJO)和SQL映射文件。
因為MyBatis是pojo(實體類)與是SQL語句之間的映射機制,一般情況下,保證pojo類的屬性和表中的字段名一致。
SQL映射文件元素節點
Mapper:映射文件的根元素節點,只有一個屬性namespace:
Namespace:用於區分不同的mapper.全局唯一。(一般為接口的完全限定名)
Select:查詢語句,常用屬性如下(特別屬性后面介紹---)
Id:該命名空間下的唯一標識符。
resultType:表示SQL語句的返回值類型。
5.編寫測試類
(1)讀取全局配置文件(xxx.xml”)
Reader reader = Resources.getResourceAsReader(“xxx.xml”);
(2)創建sqlsessionfactory,完成配置文件的讀取。
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
(3)創建sqlSession對象,通過sqlSession調用相應的方法進行操作。
sessionFactory.openSession();//打開sqlSession對象
Sqlsession.getMapper(接口名.class).執行的方法(參數);
(4)關閉sqlSession對象。
sessionFactory.close();//關閉sqlSession對象
MyBatis優缺點以及其適用場合
優點:
1.與JDBC相比,代碼量減少了50%以上。
2.最簡單的持久層框架,小巧簡單易學
3.SQL語句寫在XML文件,從程序代碼中徹底分離,便於統一管理和優化,並可重用。
4.提供XML標簽,支持編寫動態SQL語句。
5.提供映射文件,支持對象與數據庫的ORM字段關系映射。
缺點:
1.SQL編寫工作量較大,對開發人員編寫SQL語句的功底有一定的要求。
2.SQL依賴於數據庫,數據庫的移植性差,不能隨意更換數據庫。
適應場合:
專注於SQL本身,一個靈活的DAO層的解決方案,對性能要求較高,或者需求變化較多的項目。
MyBatis的基本要素-----核心對象。
一、核心接口和類。
(1)每個MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心。
(2)首先獲取SqlSessionFactoryBuilder對象,根據xml文件或Configuration類的實例構建該對象。
(3)獲取SqlSessionFactory對象,通過SqlSessionFactoryBuilder對象獲取。
(4)通過SqlSessionFactory獲取SqlSession實例,此實例完全包含以數據庫為背景的所有執行SQL操作方法。
直接執行已經映射的SQL語句。
1.SqlSessionFactoryBuilder對象
作用:負責構建SqlSessionFactory,並且提供了多個build()方法的重載
(1).build(Reader reader,String environment,Properties properties)//字節流
(1).build(InputStream inputStream,String environment,Properties properties)//字符流
(1).build(Configuration config)//類
生命周期和作用域:最大的特點為用過即丟,一旦創建了SqlSessionFactory對象之后,這個類就不再需要了。
最佳范圍存在於方法體內,也就是個局部變量而已。
· 2.SqlSessionFactory對象
作用:可以通過此對象的OpenSession()方法獲得SqlSession()實例。
生命周期和作用域:對象一旦創建,在整個應用運行過程中始終存在。最佳的作用域范圍是Application,隨着應用的生命周期一同存在。
--------------------------------------------------------------------------------------------------------------------------
1.創建工具類util,在靜態塊中創建SqlSessionFactory對象。
2.創建SqlSession對象和關閉SqlSession
--------------------------------------------------------------------------------------------------------------------------
· 3.SqlSession對象
作用:用於持久化操作的對象,類似於JDBC中的connection,提供了面向數據庫執行SQL命令所需的所有方法,
生命周期和作用域:對應着一次數據庫會話,若關閉的SqlSession會話,就需要重新創建它。
注意:每個線程都有自己的SqlSession實例,所以不能被共享,是線程非安全的,最佳作用域范圍是request作用域或者方法體作用域。
使用方式:1.直接執行已映射的Sql語句,例如:直接調用selectList方法執行查詢。
2.基於mapper接口方式操作數據。例子:Sqlsession.getMapper(接口名.class).執行的方法(參數);
二、核心配置文件
核心配置文件的一些基本的元素,需注意,元素節點有相應的先后順序。如下圖:
----configuration元素為整個xml配置文件的根節點,相當於總管。
1.properties元素:外部化、可替代的屬性。
(1)通過外部指定的方式:<properties resource="database.properties">引入database.properties文件。
(2)直接配置xml文件。
<properties>
<property name = "xx" value = "xx">......
</properties>
補充:如果以上的兩種方式同時使用的話,外部引入優先級高於property子節點配置的值。
2.settings元素:設置重要的選項,用於設置和改變MyBatis運行中的行為。
設置項 | 描述 | 允許值 | 默認值 |
cacheEnabled | 對在此配置文件下的所有cache進行全局性開/關設置 | true | false | true |
lazyLoadingEnabled | 全局設置懶加載,設置為false,則所有相關聯的都會被初始化加載 | true | false | true |
autoMappingBehavior | MyBatis對於resultMap自動映射的自動匹配級別 | NONE | PARTIAL | FULL | PARTAL |
autoMappingBehavior的三個允許值:
NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結果集映射的結果集。 FULL 會自動映射任意復雜的結果集(無論是否嵌套)。
3.typeAliases元素:配置類型別名,減少輸入多余的完整類名,以簡化操作。
更簡化的寫法:通過package的name屬性直接指定包名,MyBatis會自動掃描指定包下的JavaBean,並默認設置別名(javabean的非限定類名)
4.environments元素:配置多套運行環境,可講SQL映射應用到不同數據庫環境上.
(1)默認的運行ID:通過default屬性來指定當前的運行環境ID。對於環境ID的命名要確保唯一。
(2)transactionManager事務管理器:類型分為JDBC和MANAGED,直接使用JDBC的提交和回滾功能。
一、使用JDBC的事務管理機制:即利用java.sql.Connection對象完成對事務的提交(commit())、回滾(rollback())、關閉(close())等
二、使用MANAGED的事務管理機制:這種機制MyBatis自身不會去實現事務管理,而是讓程序的容器如(JBOSS,Weblogic)來實現對事務的管理
(3)dataSource元素使用標准的JDBC數據源接口配置JDBC連接對象的資源。
1.UNPOOLED:為每一個數據庫操作創建一個新的連接,並關閉它,該方式只適用於只有小規模數量並發用戶的簡單應用程序上。
2.POOLED:創建一個數據庫連接池,池中的一個連接將會被用作數據庫操作,一旦完成,會將此連接返回給連接池,經常使用此種方式。
3.JNDI:從在應用服務器配置好的JNDI數據源datasource獲取數據庫連接,在生產環境中,優先考慮此方式。
5.mapper元素:映射器,用來定義SQL的映射語句,只需告訴MyBatis去哪里找這個SQL語句,
(1)使用類資源路徑獲取資源。
<mappers>
<mapper resource="cn/smbms/dao/user/UserMapper.xml" />
</mappers>
(2)使用URL獲取資源。
<mappers>
<mapper url="file:///E:/sqlmappers/UserMapper.xml" />
</mappers>
---------------------------------------------------------------------------------------------------------------------------