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;
}