1   Spring boot、spring、spring mvc的关系区别
1.1 Spring boot包含spring,并简化了spring复杂繁琐的配置问题
1.2 Spring是一个实现了ioc与aop模型的框架
1.3 Spring mvc是基于servlet的web开发框架,主要解决web开发问题,是spring框架中的一个模块
2   创建第一个使用mybatis的web应用程序
3   引入spring boot依赖
<!--spring boot 依赖-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.1.RELEASE</version>
    <relativePath/>
</parent>
<!--thymeleaf 模板引擎依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--全栈web开发依赖,包括tomcat和springMVC依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nekohtml为HTML的扫描器和修补器,可以自动补齐html缺失-->
<dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
</dependency>
4   /demo/firstMybatis/controller/下编写控制器QuestionController
@Controller
@RequestMapping("/question")
public class QuestionController {
    @GetMapping("/{id}")
    public String showQuestion(@PathVariable Long id, Model model) throws Exception{
        //读取mybatis.xml文件配置
        InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
        //实例化SqlSessionFactory的创建对象
        //SqlSessionFactory一旦创建就一直存在
        //所以SqlSessionFactoryBuilder在创建完SqlSessionFactory后就可以销毁
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        //根据mybatis.xml的配置来创建SqlSessionFactory
        //一个web应用程序只有一个SqlSessionFactory,所以要用单例模式
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
        //开启(创建)本次sql操作会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //会话通过mybatis将映射的数据库操作对象实例化
        IQuestionDao iQuestionDao = sqlSession.getMapper(IQuestionDao.class);
        //访问数据库操作对象的方法
        Question question = iQuestionDao.findOne(id); 
        //关闭数据库连接
        sqlSession.close();
        //将对象保存到model
        model.addAttribute("question", question);
        return "question";
    }
}
5   在/resources/templates/下编写question.html页面
<html xmlns:th="http://www.w3.org/1999/xhtml">
<body>
    <h2>你好,这个我的第一个基于mybatis的web页面</h2>
    <h2 th:text="${question.getId()}">问题ID</h2>
    <h2 th:text="${question.getTitle()}">问题标题</h2>
    <h2 th:text="${question.getDescription()}">问题内容</h2>
</body>
</html>
6   在/demo/firstMybatis/下编写web应用程序的入口类WebApp
//标注这是一个spring boot的web应用程序
@SpringBootApplication
public class WebApp {
    //应用程序入口,第一次访问站点时,tomcat调用此方法来其中这个web应用程序
    public static void main(String[] args){
        SpringApplication.run(WebApp.class);
    }
}
7   右键webapp执行
7.1 访问:http://localhost:8080/查看
7.2 访问:http://localhost:8080/question/1查看
8   由于SqlSessionFactory负责创建所有会话,所以一个站点只有一个SqlSessionFactory就够了,下面采用单例模式产生SqlSessionFactory,/demo/firstMybatis/controller/下编写SqlSessionFactoryManager来负责产生单例的SqlSessionFactory
public class SqlSessionFactoryManager {
    private static String mybatis_config = "mybatis.xml";
    private static SqlSessionFactory sqlSessionFactory;
    public static SqlSessionFactory getSqlSessionFactory()throws Exception{
        if(sqlSessionFactory == null){
            InputStream inputStream = Resources.getResourceAsStream(mybatis_config);
            //此处创建的SqlSessionFactoryBuilder为匿名对象,使用完由GC直接回收
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        }
        return sqlSessionFactory;
    }
}
9   控制器可以修改为如下
@GetMapping("/{id}")
public String showQuestion(@PathVariable Long id, Model model) throws Exception{
    //从单例模式中获取SqlSessionFactory的实例化对象
    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryManager.getSqlSessionFactory();
    //开启(创建)本次会话
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //会话通过mybatis将映射的数据库操作对象实例化
    IQuestionDao iQuestionDao = sqlSession.getMapper(IQuestionDao.class);
    //访问数据库操作对象的方法
    Question question = iQuestionDao.findOne(id);
    //关闭数据库连接
    sqlSession.close();
    //将对象保存到model
    model.addAttribute("question", question);
    return "question";
}
10  访问http://localhost:8080/question/1查看