1,讀取配置文件,生成連接
2,讀取sql語句,生成sql語句——執行,得到結果,組裝到結果集中
2,讀取sql語句,生成sql語句 ——執行,得到結果,組裝到結果集中
SqlSession session = SqlsessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectById(1);
SqlSession session = SqlsessionFactory.openSession();
User user = session.selectOne("org.mybatis.example.UserMapper.selectById",1);
這裏寫的比較簡單,詳細的Mybatis寫法,可以參考https://www.cnblogs.com/hellokitty1/p/5216025.html
在DefaultSqlSession中,getMapper() 方法最終返回一個根據提供的接口的代理類,來執行其方法
public <T> T getMapper(Class<T> type) {
return this.configuration.getMapper(type, this);
}
在Configuration類中,getMapper是通過調用一些的方法,最終通過反射建立接口的代理
public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
return this.mapperRegistry.getMapper(type, sqlSession);
}
在SqlSession接口中,主要方法有:selectOne,selectList,selectMap,selectCursor,insert,update,delete,commit,rollback
選擇類的selectOne,selectMap,selectList,根據不同的參數也重載了幾個方法,但是最終都指向了selectList()方法
selectOne在selectList的結果集中判斷,長度必須是1,就返回get(0),否則報錯
selectMap就是把List結果集中的數據包裝成Map
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
List var5;
try {
MappedStatement ms = this.configuration.getMappedStatement(statement);
var5 = this.executor.query(ms, this.wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
} catch (Exception var9) {
throw ExceptionFactory.wrapException("Error querying database. Cause: " + var9, var9);
} finally {
ErrorContext.instance().reset();
}
return var5;
}
selectCursor是關於遊標的,我目前也不明白,以後研究吧。
insert,update,delete是三個修改數據庫的,由於他們最終執行都是executor.update(),所有三者重載的所有方法最終都指向了update方法。
public int update(String statement, Object parameter) {
int var4;
try {
this.dirty = true;
MappedStatement ms = this.configuration.getMappedStatement(statement);
var4 = this.executor.update(ms, this.wrapCollection(parameter));
} catch (Exception var8) {
throw ExceptionFactory.wrapException("Error updating database. Cause: " + var8, var8);
} finally {
ErrorContext.instance().reset();
}
return var4;
}