轉載:http://www.tuicool.com/articles/auaAru
iBatis 框架的主要優勢:
1、iBatis 封裝了絕大多數的 JDBC 樣板代碼,使得開發者只需關注 SQL 本身,而不需要花費精力去處理例如注冊驅動,創建 Connection,以及確保關閉 Connection 這樣繁雜的代碼。
2、從 iBatis 到 MyBatis,不只是名稱上的變化,MyBatis 提供了更為強大的功能,同時並沒有損失其易用性,相反,在很多地方都借助於 JDK 的泛型和注解特性進行了簡化
常用的 Java EE 框架,應該都知道這些框架需要提供一個全局配置文件,用於指定程序正常運行所需的設置和參數信息。而針對常用的持久層框架而言(Hibernate、JPA、iBatis 等),則通常需要配置兩類文件:
一類用於指定數據源、事務屬性以及其他一些參數配置信息(通常是一個獨立的文件,可以稱之為全局配置文件);
另一類則用於指定數據庫表和程序之間的映射信息(可能不止一個文件,我們稱之為映射文件)。
MyBatis 也不例外,雖然其中的一部分可以通過注解的形式進行,但是這兩部分內容本身仍是必不可少的
MyBatis 全局配置文件中可以配置的信息主要包括如下幾個方面:
properties — 用於提供一系列的鍵值對組成的屬性信息,該屬性信息可以用於整個配置文件中。
settings — 用於設置 MyBatis 的運行時方式,比如是否啟用延遲加載等。
typeAliases — 為 Java 類型指定別名,可以在 XML 文件中用別名取代 Java 類的全限定名。
typeHandlers — 在 MyBatis 通過 PreparedStatement 為占位符設置值,或者從 ResultSet 取出值時,特定類型的類型處理器會被執行。
objectFactory — MyBatis 通過 ObjectFactory 來創建結果對象。可以通過繼承 DefaultObjectFactory 來實現自己的 ObjectFactory 類。
plugins — 用於配置一系列攔截器,用於攔截映射 SQL 語句的執行。可以通過實現 Interceptor 接口來實現自己的攔截器。
environments — 用於配置數據源信息,包括連接池、事務屬性等。
mappers — 程序中所有用到的 SQL 映射文件都在這里列出,這些映射 SQL 都被 MyBatis 管理。
上面提及的大多數元素都不是必需的,通常 MyBatis 會為沒有顯式設置的元素提供缺省值。
iBatis 2.x 和 MyBatis 3.0.x 的區別
1、 全局配置文件命名
iBatis 通常把為 sqlMapConfig.xml,文件名本身並沒有要求,在 MyBatis 中經常會將該文件命名為 Configuration.xml
2、 全局配置文件
<?xml version=”1.0″ encoding=”UTF-8″ ?> iBatis 和 MyBatis 的全局配置文件使用不同的 DTD 約束,在將應用由 iBatis 升級至 MyBatis 時需要注意(兩者的映射文件 DTD 約束也不相同)
<!DOCTYPE configuration PUBLIC “-//mybatis.org//DTD Config 3.0//EN” “http://mybatis.org/dtd/mybatis-3-config.dtd”>
<configuration>
<!– 配置數據源相關的信息 –>
<environments default=”demo”>
<environment id=”demo”>
<transactionManager type=”JDBC”/>
<dataSource type=”POOLED”>
<property name=”driver” value= … />
<property name=”url” value= … />
<property name=”username” value=”root”/>
<property name=”password” value=”root”/>
</dataSource>
</environment>
</environments>
<!– 列出映射文件 –>
<mappers>
<mapper resource=”footmark/mybatis/demo/UserInfoMapper.xml”/>
</mappers>
</configuration>
有了這些信息,MyBatis 便能夠和數據庫建立連接,並應用給定的連接池信息和事務屬性。
MyBatis 封裝了這些操作,最終暴露一個 SqlSessionFactory 實例供開發者使用,從名字可以看出來,
這是一個創建 SqlSession 的工廠類,通過 SqlSession 實例,開發者能夠直接進行業務邏輯的操作,
而不需要重復編寫 JDBC 相關的樣板代碼。根據全局配置文件生成 SqlSession 的代碼如下:
Reader reader = Resources.getResourceAsReader("Configuration.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
上面的三行代碼看做是 MyBatis 創建 SqlSession 的樣板代碼。
其中第一行代碼在類路徑上加載配置文件,Resources 是 MyBatis 提供的一個工具類,它用於簡化資源文件的加載,它可以訪問各種路徑的文件,不過最常用的還是示例中這種基於類路徑的表示方式
在完成全局配置文件,並通過 MyBatis 獲得 SqlSession 對象之后,便可以執行數據訪問操作了
— 設置屬性的區別
iBatis :<settings props1=”value1″ props2=”value2″… />
MyBatis :<settings> <setting name=”props1″ value=”value1″/> <setting name=”props2″ value=”value2″/> …… </settings>
—配置事務管理器和數據源的區別
iBatis :
<transactionManager type=”JDBC” >
<dataSource type=”SIMPLE”>
<property name=”JDBC.Driver” value=”${driver}”/>
</dataSource>
</transactionManager>
MyBatis :
<environments default=”demo”>
<environment id=”demo”>
<transactionManager type=”JDBC”/>
<dataSource type=”POOLED”>
<property name=”JDBC.Driver” value=”${driver}”/>
</dataSource>
</environment>
</environments>
通過 <environments> 來進行數據源管理,主要是為了簡化在多套數據源配置之間的切換,比如開發和發布使用不同的配置。
3、 在映射文件中配置 SQL 語句
<?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=”mybatis.demo.UserInfoMapper”>
<select id=”selectUser” parameterType=”int” resultType=”mybatis.demo.UserInfo”>
select * from UserInfo where userid =#{userid}
</select>
</mapper>
在 iBatis 中,namespace 不是必需的,且它的存在沒有實際的意義。在 MyBatis 中,namespace 終於派上用場了,它使得映射文件與接口綁定變得非常自然
—指定映射文件的方式的區別
iBatis:<sqlMap resource=… /> <sqlMap resource=… /> <sqlMap resource=… />
MyBatis :<mappers> <mapper resource=… /> <mapper resource=… /> </mappers>
4、 使用 SqlSession 執行映射文件中配置的 SQL 語句
try {
UserInfo userinfo = (UserInfo) sqlSession.selectOne (“mybatis.demo.UserInfoMapper.getUser”, 2);
System.out.println(userinfo);
} finally {
sqlSession.close();
}
需要注意的是,SqlSession 的使用必需遵守上面的格式,即在 finally 塊中將其關閉。以保證資源得到釋放,防止出現內存泄露!
5、 在 MyBatis 中使用代碼進行配置
DataSource ds = …… // 獲取一個 DataSource
TransactionFactory txFactory = new JdbcTransactionFactory();
Environment env = new Environment(“demo”, txFactory, ds);
Configuration cfg = new Configuration(env);
cfg.addMapper(UserInfoMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfg);
結合前面的配置文件,很容易理解這段代碼的意思,故不再贅述。不過,需要注意的是 Configuration 的 addMapper() 方法,該方法的參數通常是一個接口,可以在接口里面定義若干方法,在方法上使用注解來指定映射的 SQL 語句。一個典型的接口定義以及對應的數據訪問方法如下:
6、 將映射的 SQL 語句與接口中的方法綁定
// 映射 SQL 綁定接口
public interface UserInfoMapper {
@Select(“select * from userinfo where userid = #{userid}”)
public UserInfo getUserInfo(int userid);
}
// 接口綁定對應的數據訪問方法
try {
//UserInfo userinfo = (UserInfo) sqlSession.selectOne (“mybatis.demo.UserInfoMapper.selectUser”, 2);
UserInfoMapper userinfoMapper = sqlSession.getMapper(UserInfoMapper.class);
UserInfo userinfo = userinfoMapper.getUserInfo(1);
System.out.println(userinfo);
} finally {
sqlSession.close();
}
7、 MyBatis 映射文件的改變 (僅僅是名稱的改變,用法和含義並沒有發生變化)
和全局配置文件一樣,由於 DTD 約束發生變化,根元素也由原來的 <sqlMap> 調整為 <mapper>。
<select> 等元素的 parameterClass 屬性改為了 parameterType 屬性。
<select> 等元素的 resultClasss 屬性改為了 resultType 屬性。
<parameterMap> 等元素的 class 屬性改為了 type 屬性。
<result> 元素的 columnIndex 屬性被移除了。
嵌套參數由 #value# 改為了 #{value}。
<parameter> 等元素的 jdbcType 屬性取值中,原來的 “ORACLECURSOR” 取值改為了現在的 “CURSOR”,”NUMBER” 取值改為了 “NUMERIC”。
iBatis/MyBatis 對存儲過程的支持一直是值得稱道的。之前通過使用 <procedure> 元素進行存儲過程的定義,示例如下:
— 存儲過程的區別
iBatis:
<procedure id=”getValues” parameterMap=”getValuesPM”>
{ ? = call pkgExample.getValues(p_id => ?) }
</procedure>
MyBatis :
<select id=”getValues” parameterMap=”getValuesPM” statementType=”CALLABLE”>
{ ? = call pkgExample.getValues(p_id => ?)}
</select>
通過 statementType 屬性將該語句標識為存儲過程而非普通 SQL 語句
8、代碼層面的改變
MyBatis 在編碼中的最大的改變就是將一個最常用的 API 由 SqlMapClient 改為了 SqlSessionFactory。
另外,類型處理器接口也由原來的 TypeHandlerCallback 改為了 TypeHandler。
最后 DataSourceFactory 也進行了調整,移動到 org.apache.ibatis.datasource 包下,其中的方法也作了微調。總之,代碼層面公開的部分改動較少,不會給開發者造成較大的移植成本