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();

}

posted @ 2020-02-16 20:12  骑驴晒太阳  阅读(99)  评论(0)    收藏  举报