分析
package com.ccut.test;
import com.ccut.dao.IUserDao;
import com.ccut.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
/**
* 入門案例
* @param args
*/
public static void main(String[] args) throws IOException {
//1、讀取配置文件
InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
//2、創建SqlSessionFactory工廠
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3、使用工廠生產SqlSession對象
SqlSession session=factory.openSession();
//4、使用SqlSession創建Dao接口的代理對象
IUserDao userDao=session.getMapper(IUserDao.class);
//5、使用代理對象執行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//6、釋放資源
session.close();
in.close();
}
}
- 絕對路徑:d:\xxx\\xxx.html,使用類加載器,只能讀取類加載的配置文件
- 相對路徑:src/xxx/xxx.html,使用ServletContext對象getRealPath()
- 創建工廠時mybatis使用了構建者模式
優勢:把對象的創建細節隱藏,讓使用者直接條用方法即可拿到對象。
builder就是構建者。
- 生產SqlSession使用了工廠模式
優勢:解耦,降低類之間的依賴關係。
- 創建DAO接口使用了代理模式
優勢:不修改源碼的基礎上對已有方法增強。
mybatis在使用dao代理模式實現增刪改查時做了什麼事?
做了兩件事:
第一、創建代理對象
第二、在代理對象中調用selectList
1、
連接數據庫的信息,有了他們就能創建Connection對象。
2、
有了它就有了映射配置信息。
3、
有了它就有了執行的SQL語句,就可以獲取PrepareStatement,此配置中還有實體類封裝的全限定類名。
讀取(1)(2)(3)配置文件用到的技術是解析XML的技術,此處使用dom4j解析xml。
解析完成後:
1、根據配置文件創建Connection對象
註冊驅動、獲取連接。。。
2、獲取預處理對象PreparedStatement
此時需要SQL語句
conn.preparedStatement(sql);
3、執行查詢
ResultSet resultSet = preparedStatement.excuteQuery();
4、遍歷結果集用於封裝
List<E> list =new ArrayList<>();
while(resultSet.next()){
E element=(E)class.forName(配置的全限定類名).newInstance();
進行封裝,把每個rs內容添加到element中
【反射封裝】我們的實體類屬性和表的列明是一致的。於是我們就可以把表的列名來看成實體類的屬性名稱,於是就可以使用反射的方式來根據名稱獲取每個屬性,並把值賦值進去。
把element加入到list中
list.add(element);
}
5、返回list集合
return list;
要想讓方法執行,需要提供來給兩個信息:
第一個:連接信息
第二個:映射信息
映射信息包含兩個部分:1、執行的sql語句 2、封裝結果的實體類的全限定類名。那這兩個信息組合起來定義成一個對象Mapper,
代理對象分析
1、根據dao接口的字節碼創建dao的代理對象
public <T>T getMapper(Class<T> daoInterfaceClass{
類加載器:他使用和被代理對象相同的類加載器。
代理對象要實現的,和被代理對象實現相同的接口。
如何代理:他就是增強的方法,需要自己來提供。此處是一個InvocationHandler的接口,我們需要寫一個該接口的實現類,再該接口的實現類中調用selectlist方法。
proxy.newProxyInstance(類加載器,代理對象要實現的字節碼數組,如何代理)
}