主要实现都在DefaultSqlSession中
DefaultSqlSession中包含两个关键引用:
private Configuration configuration;
private Executor executor;
DefaultSqlSession定义了一系列的方法来满足需求增删改查,但是最终执行sql语句都是由executor来完成的。
一.select
1.selectList(String statement,Object parameter,RowBounds rowBounds):
先从configuration中获取解析的MappedStatement,同时对参数进行包装:
//把参数包装成Collection
private Object wrapCollection(final Object object) {
if (object instanceof Collection) {
//参数若是Collection型,做collection标记
StrictMap<Object> map = new StrictMap<Object>();
map.put("collection", object);
if (object instanceof List) {
//参数若是List型,做list标记
map.put("list", object);
}
return map;
} else if (object != null && object.getClass().isArray()) {
//参数若是数组型,,做array标记
StrictMap<Object> map = new StrictMap<Object>();
map.put("array", object);
return map;
}
//参数若不是集合型,直接返回原来值
return object;
}
然后将这些传递给excutor来处理。
2.selectOne:调用selectList,返回的list为1则返回结果,大于1抛出TooManyResultsException,否则返回null
3.selectMap会先调用selectList获取结果集,之后会将结果集处理成map,这里面处理使用了对象工厂objecFactory与对象包装工厂objectWrapperFactory
//核心selectMap
@Override
public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
//转而去调用selectList
final List<?> list = selectList(statement, parameter, rowBounds);
final DefaultMapResultHandler<K, V> mapResultHandler = new DefaultMapResultHandler<K, V>(mapKey,
configuration.getObjectFactory(), configuration.getObjectWrapperFactory());
final DefaultResultContext context = new DefaultResultContext();
for (Object o : list) {
//循环用DefaultMapResultHandler处理每条记录
context.nextResultObject(o);
mapResultHandler.handleResult(context);
}
//注意这个DefaultMapResultHandler里面存了所有已处理的记录(内部实现可能就是一个Map),最后再返回一个Map
return mapResultHandler.getMappedResults();
}
insert delete在内部都是调用update实现,update则调用excutor.update实现