mybatis
mybatis分页插件:
PageHelper继承了PageMethod;在PageMethod中有个threadLocal保存的是分页信息,当执行完第一个sql后,threadLocal会被clear掉(PageInterceptor会调用删除接口)
==================================================================================================================================
spring集成mybatis分三步来处理sql:
第一步:通过sqlSessionFactoryBean的afterPropertySet来创建一个sqlSessionFactory,
第二步:通过mapperFactoryBean的getObject方法获取这些mapper的代理方法,并将这些proxyBeans装入spring容器;
第三步:当crud任务来的时候,通过sqlSessionManager调用sqlSessionFactory开启一个sessoion,调用对应的代理方法,最终通过session的相关crud方法执行sql
==================================================================================================================================
涉及到的其他相关类:
MappedStatement(加入到Configuration的mappedStatementMap中去),
mappedStatementMap:key=sql,value=MappedStatement
调用jdbc的executor.crud(sql,params)去执行sql
Executor(由Configuration来创建)===>执行sql
DefaultSqlSession.selectList()
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
}
StatementHandler(由Configuration来创建)===>执行sql
SimpleExecutor.doQuery
public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
stmt = prepareStatement(handler, ms.getStatementLog());
return handler.query(stmt, resultHandler);
}
BoundSql
BoundSql boundSql = ms.getBoundSql(parameter);
RowBound....
==================================================================================================================================
public static void main(String[] args){
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建sqlSessionFactory工厂 (构建者模式)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.创建sqlSession (工厂模式)
SqlSession session = factory.openSession();
//4.使用工厂创建dao代理对象 (代理模式)
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
//6.释放资源
in.close();
}

浙公网安备 33010602011771号