您好,登錄后才能下訂單哦!
這篇文章主要介紹“Mybatis的詳細配置方法”,在日常操作中,相信很多人在Mybatis的詳細配置方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Mybatis的詳細配置方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
核心配置文件
environments元素
mappers元素
Mapper文件
Properties優化
typeAliases優化
生命周期和作用域
mybatis-config.xml 系統核心配置文件
MyBatis 的配置文件包含了會深深影響 MyBatis 行為的設置和屬性信息。
能配置的內容如下:
configuration(配置) properties(屬性) settings(設置) typeAliases(類型別名) typeHandlers(類型處理器) objectFactory(對象工廠) plugins(插件) environments(環境配置) environment(環境變量) transactionManager(事務管理器) dataSource(數據源) databaseIdProvider(數據庫廠商標識) mappers(映射器) <!-- 注意元素節點的順序!順序不對會報錯 -->
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <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>
配置MyBatis的多套運行環境,將SQL映射到多個不同的數據庫上,必須指定其中一個為默認運行環境(通過default指定)
子元素節點:environment
dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 連接對象的資源。
數據源是必須配置的。
有三種內建的數據源類型
type="[UNPOOLED|POOLED|JNDI]")
unpooled:這個數據源的實現只是每次被請求時打開和關閉連接。
pooled:這種數據源的實現利用“池”的概念將 JDBC 連接對象組織起來 , 這是一種使得并發 Web 應用快速響應請求的流行處理方式。
jndi:這個數據源的實現是為了能在如 Spring 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。
數據源也有很多第三方的實現,比如dbcp,c3p0,druid等等…
這兩種事務管理器類型都不需要設置任何屬性。
具體的一套環境,通過設置id進行區別,id保證唯一!
子元素節點:transactionManager - [ 事務管理器 ]
<!-- 語法 --> <transactionManager type="[ JDBC | MANAGED ]"/>
子元素節點:數據源(dataSource)
映射器 : 定義映射SQL語句文件
既然 MyBatis 的行為其他元素已經配置完了,我們現在就要定義 SQL 映射語句了。但是首先我們需要告訴 MyBatis 到哪里去找到這些語句。Java 在自動查找這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪里去找映射文件。你可以使用相對于類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。映射器是MyBatis中最核心的組件之一,在MyBatis 3之前,只支持xml映射器,即:所有的SQL語句都必須在xml文件中配置。而從MyBatis 3開始,還支持接口映射器,這種映射器方式允許以Java代碼的方式注解定義SQL語句,非常簡潔。
引入資源方式
<!-- 使用相對于類路徑的資源引用 推薦使用這種 --> <mappers> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
<!-- 使用完全限定資源定位符(URL) --> <mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> </mappers>
<!-- 使用映射器接口實現類的完全限定類名 需要配置文件名稱和接口名稱一致,并且位于同一目錄下 --> <mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> </mappers>
<!-- 將包內的映射器接口實現全部注冊為映射器 但是需要配置文件名稱和接口名稱一致,并且位于同一目錄下 --> <mappers> <package name="org.mybatis.builder"/> </mappers>
<?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.luckylazypig.mapper.UserMapper"> </mapper>
namespace中文意思:命名空間,作用如下:
namespace的命名必須跟某個接口同名
namespace和子元素的id聯合保證唯一 , 區別不同的mapper
綁定DAO接口
namespace命名規則 : 包名+類名
接口中的方法與映射文件中sql語句id應該一一對應
數據庫這些屬性都是可外部配置且可動態替換的,既可以在典型的 Java 屬性文件中配置,亦可通過 properties 元素的子元素來傳遞。具體的官方文檔
我們來優化我們的配置文件
第一步 ; 在資源目錄下新建一個db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8 username=root password=123456
第二步 : 將文件導入properties 配置文件
<configuration> <!--導入properties文件--> <properties resource="db.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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> <mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
配置文件優先級問題 外部優先級大于內部優先級
新特性:使用占位符
類型別名是為 Java 類型設置一個短的名字。它只和 XML 配置有關,存在的意義僅在于用來減少類完全限定名的冗余。
<!--配置別名,注意順序--> <typeAliases> <typeAlias type="com.qifei.pojo.User" alias="User"/> </typeAliases>
當這樣配置時,User可以用在任何使用com.qifei.pojo.User的地方。
也可以指定一個包名,MyBatis 會在包名下面搜索需要的 Java Bean,比如:
<typeAliases> <package name="com.qifei.pojo"/> </typeAliases>
每一個在包 com.qifei.pojo 中的 Java Bean,在沒有注解的情況下,會使用 Bean 的首字母小寫的非限定類名來作為它的別名。
若有注解,則別名為其注解值。見下面的例子:
@Alias("user") public class User { ... }
作用域(Scope)和生命周期
理解我們目前已經討論過的不同作用域和生命周期類是至關重要的,因為錯誤的使用會導致非常嚴重的并發問題。
我們可以先畫一個流程圖,分析一下Mybatis的執行過程!
作用域理解
SqlSessionFactoryBuilder 的作用在于創建 SqlSessionFactory,創建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于創建 SqlSessionFactory 的方法中,而不要讓其長期存在。因此 SqlSessionFactoryBuilder 實例的最佳作用域是方法作用域(也就是局部方法變量)。
SqlSessionFactory 可以被認為是一個數據庫連接池,它的作用是創建 SqlSession 接口對象。因為 MyBatis 的本質就是 Java 對數據庫的操作,所以 SqlSessionFactory 的生命周期存在于整個 MyBatis 的應用之中,所以一旦創建了 SqlSessionFactory,就要長期保存它,直至不再使用 MyBatis 應用,所以可以認為 SqlSessionFactory 的生命周期就等同于 MyBatis 的應用周期。
由于 SqlSessionFactory 是一個對數據庫的連接池,所以它占據著數據庫的連接資源。如果創建多個 SqlSessionFactory,那么就存在多個數據庫連接池,這樣不利于對數據庫資源的控制,也會導致數據庫連接資源被消耗光,出現系統宕機等情況,所以盡量避免發生這樣的情況。
因此在一般的應用中我們往往希望 SqlSessionFactory 作為一個單例,讓它在應用中被共享。所以說 SqlSessionFactory 的最佳作用域是應用作用域。
如果說 SqlSessionFactory 相當于數據庫連接池,那么 SqlSession 就相當于一個數據庫連接(Connection 對象),你可以在一個事務里面執行多條 SQL,然后通過它的 commit、rollback 等方法,提交或者回滾事務。所以它應該存活在一個業務請求中,處理完整個請求后,應該關閉這條連接,讓它歸還給 SqlSessionFactory,否則數據庫資源就很快被耗費精光,系統就會癱瘓,所以用 try…catch…finally… 語句來保證其正確關閉。
nFactory 相當于數據庫連接池,那么 SqlSession 就相當于一個數據庫連接(Connection 對象),你可以在一個事務里面執行多條 SQL,然后通過它的 commit、rollback 等方法,提交或者回滾事務。所以它應該存活在一個業務請求中,處理完整個請求后,應該關閉這條連接,讓它歸還給 SqlSessionFactory,否則數據庫資源就很快被耗費精光,系統就會癱瘓,所以用 try…catch…finally… 語句來保證其正確關閉。
所以 SqlSession 的最佳的作用域是請求或方法作用域。
到此,關于“Mybatis的詳細配置方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。