Mybatis架构设计及源码分析-SqlSession

我们知道执行一次sql语句至少要创建一个SqlSession,一个SqlSession包含了只少一次与数据库的回话过程,mybatis中SqlSession中包含了所有可能出现的sql语句执行过程其默认实现为DefaultSqlSession。下面我们分析下DefaultSqlSession。

还是回到上述编程式使用mybatis。

String resource = "mybatis.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
  session.close();
}

具体的xml配置文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

最终调用的是这段代码:

public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
    try {
      MappedStatement ms = configuration.getMappedStatement(statement);
      return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);
    } finally {
      ErrorContext.instance().reset();
    }
}

很简单根据statement拿到MappedStatement然后通过executor执行query并返回结果,其它语句也是类似执行。

猜你喜欢

转载自my.oschina.net/wenbo123/blog/1819294