MyBatis 是支持定制化 SQL元潘、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的持久層框架馁菜。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以對(duì)配置和原生Map使用簡(jiǎn)單的 XML 或注解最爬,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄涉馁。[來(lái)自官方文檔]
1.MyBatis的優(yōu)點(diǎn)和缺點(diǎn)
- 優(yōu)點(diǎn)
- 易于上手和掌握。
- sql寫在xml里爱致,便于統(tǒng)一管理和優(yōu)化烤送。
- 解除sql與程序代碼的耦合。
- 提供映射標(biāo)簽糠悯,支持對(duì)象與數(shù)據(jù)庫(kù)的ORM字段關(guān)系映射
- 提供對(duì)象關(guān)系映射標(biāo)簽帮坚,支持對(duì)象關(guān)系組建維護(hù)
- 提供xml標(biāo)簽妻往,支持編寫動(dòng)態(tài)sql。
- 缺點(diǎn)
- sql工作量很大试和,尤其是字段多讯泣、關(guān)聯(lián)表多時(shí),更是如此阅悍。
- sql依賴于數(shù)據(jù)庫(kù)好渠,導(dǎo)致數(shù)據(jù)庫(kù)移植性差。
- 由于xml里標(biāo)簽id必須唯一节视,導(dǎo)致DAO中方法不支持方法重載拳锚。[重點(diǎn)注意]
- 字段映射標(biāo)簽和對(duì)象關(guān)系映射標(biāo)簽僅僅是對(duì)映射關(guān)系的描述,具體實(shí)現(xiàn)仍然依賴于sql寻行。(比如配置了一對(duì)多Collection標(biāo)簽霍掺,如果sql里沒(méi)有join子表或查詢子表的話,查詢后返回的對(duì)象是不具備對(duì)象關(guān)系的拌蜘,即Collection的對(duì)象為null)
- DAO層過(guò)于簡(jiǎn)單杆烁,對(duì)象組裝的工作量較大。
- 不支持級(jí)聯(lián)更新拦坠、級(jí)聯(lián)刪除连躏。
- 編寫動(dòng)態(tài)sql時(shí),不方便調(diào)試,尤其邏輯復(fù)雜時(shí)贞滨。
- 提供的寫動(dòng)態(tài)sql的xml標(biāo)簽功能簡(jiǎn)單(連struts都比不上)入热,編寫動(dòng)態(tài)sql仍然受限,且可讀性低晓铆。
- 若不查詢主鍵字段勺良,容易造成查詢出的對(duì)象有“覆蓋”現(xiàn)象。
- 參數(shù)的數(shù)據(jù)類型支持不完善骄噪。(如參數(shù)為Date類型時(shí)尚困,容易報(bào)沒(méi)有g(shù)et、set方法链蕊,需在參數(shù)上加@param)
- 多參數(shù)時(shí)事甜,使用不方便,功能不夠強(qiáng)大滔韵。(目前支持的方法有map逻谦、對(duì)象、注解@param)
- 緩存使用不當(dāng)陪蜻,容易產(chǎn)生臟數(shù)據(jù)邦马。二級(jí)緩存機(jī)制不佳,需要使用第三方的緩存框架。
2.MyBatis安裝
首先我們需要聲明一下iBatis和MyBatis都是一個(gè)組織開(kāi)發(fā)滋将,只是版本不相同而已邻悬,就想我們學(xué)習(xí)的Java的版本命名規(guī)則類似,實(shí)際上MyBatis就是iBatis的一個(gè)大版本號(hào)的提升随闽。
下載地址:https://github.com/mybatis/mybatis-3/releases
官方文檔:http://www.mybatis.org/mybatis-3/
3.MyBatis的環(huán)境搭建
(1) 新建Java項(xiàng)目
- 新建lib文件夾,導(dǎo)入mybatis-3.4.2.jar的框架核心包和MySQL的數(shù)據(jù)庫(kù)驅(qū)動(dòng)包
- 選中兩個(gè)Jar包,右鍵選擇Bulid Path
(2) 新建MyBatis核心配置文件
個(gè)人建議將核心配置文件建立在mybatis-config.xml文件
- 新建核心xml文件
需要設(shè)置文檔類型
<?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>
</configuration>
- 配置數(shù)據(jù)源
<!-- 配置數(shù)據(jù)庫(kù)環(huán)境 -->
<environments default="development">
<environment id="development">
<!-- 事務(wù)管理器:保證數(shù)據(jù)的完整性和一致性 -->
<!-- 框架:默認(rèn)情況下CUD操作需要手動(dòng)提交事務(wù) -->
<transactionManager type="JDBC" />
<!-- 使用的是連接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/cy42_mss" />
<property name="username" value="root" />
<property name="password" value="shxt" />
</dataSource>
</environment>
</environments>
百度Java如何實(shí)行連接池的原理?
- 配置加載映射文件
<mappers>
<mapper resource="com/shxt/model/ShxtMapper.xml"/>
</mappers>
-
附錄
(3) 新建MyBatis映射文件
- 位置建立: com/shxt/model/ShxtMapper.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="命名空間,唯一的不能重復(fù)"> -->
<mapper namespace="shxt.cy42.mss">
</mapper>
目前我們使用的傳統(tǒng)模式,那么namespace一般建議使用持久化類的全路徑com.shxt.model.User這樣的字符串保持一致,方便后面代碼處理.
但是,我們現(xiàn)在沒(méi)有持久化類,所以就是設(shè)置了一個(gè)簡(jiǎn)單的字符串
- 定制SQL語(yǔ)句,簡(jiǎn)單測(cè)試
<!-- 定制SQL語(yǔ)句 -->
<insert id="add01">
INSERT INTO skill (skill_name,num) VALUES ('JS',75)
</insert>
-
附錄
(4) 測(cè)試代碼
public class API的調(diào)用過(guò)程演示 {
public static void main( String[] args ) {
//讀取核心配置文件的位置
//InputStream is = Resources.getResourceAsStream("com/shxt/model/mybatis-config.xml");
SqlSession sqlSession = null;
try {
//1.讀取核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.創(chuàng)建SqlSession工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//3.獲取SqlSession
//****** SqlSession完成所有的持久化操作CRUD
sqlSession = sqlSessionFactory.openSession();
//4.關(guān)鍵步驟: 定位執(zhí)行SQL語(yǔ)句 重點(diǎn)重點(diǎn)重點(diǎn)
//****如何定位 (namespace+"."+id)
int row = sqlSession.insert("shxt.cy42.mss.add01");
//5.針對(duì)于CUD操作需要手動(dòng)提交事務(wù)
sqlSession.commit();
System.out.println("影響的行數(shù):"+row);
} catch (IOException ex) {
ex.printStackTrace();
}finally {
//6.關(guān)閉資源
if(sqlSession!=null){
sqlSession.close();
}
}
}
}