Mybatis的学习 1. MyBatis 的简单使用和学习

2016-04-10 | 阅读

Mybatis

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久化框架,MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO映射成数据库中的记录.中文文档

简单介绍

每个基于MyBatis 的应用都是以一个SqlSessionFactory的示例为中心的,SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例.

从XML文件构建SqlSessionFactory的实例很简单,MyBatis包含一个名叫Resources的工具类,包含一些方法,如从classpath或其他位置加载资源文件:

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

MyBatis还会有一个XML配置文件,包含了对MyBatis系统的核心设置,下一节详细介绍,包含获取数据库连接实例的数据源DataSource和决定事务范围和控制方式的事务管理器TransactionManager.

MyBatis可以使用两种方式来编写SQL语句,一种是写在XMP配置中,一种是通过注解写在Java代码中,如果不使用XML来创建SqlSessionFactory,则可以自己创建configuration构建器:

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

从SqlSessionFactory中获取SqlSession

获得SqlSession实例,这个实例包含了面向数据库执行SQL命令所需的所有方法,如:

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

这边提供了两种写法,但是下面这种方法更加清晰且类型安全,建议使用下面这种写法.

各个对象的范围和生命周期

如果使用了依赖注入框架,可以创建线程安全的 基于事务的SqlSession 和映射器(Mapper)并将其注入到你的bean中,因此可以忽略它们的生命周期.也就是可以研究一下MyBatis-Spring.

  • SqlSessionFactoryBuilder : 这个方法一般会解析XML来创建SqlSessionFactory,一旦这个操作完成了,这个对象就没有用了.
  • SqlSessionFactory : 一旦被创建,就应该在应用的运行期间一直存在,不需要对其进行清除或重建,可以使用单例模式来存放.
  • SqlSession : 每个线程都应该有它自己的SqlSession实例,这一层的话,已经相当于jdbc的一个连接了,所以这个实例不是线程安全的,也不能被共享,且每次使用后都应该被关闭.
  • 映射器实例Mapper Instances : 映射器是创建用来绑定映射语句的接口,从SqlSession中获得,所以也应该用过之后就废弃,但不需要显示关闭Mapper实例:

      SqlSession session = sqlSessionFactory.openSession();
      try {
        BlogMapper mapper = session.getMapper(BlogMapper.class);
        // do work
      } finally {
        session.close();
      }
    

MyBaits的配置文件

配置文件,由sqlSessionFactoryBuilder来指定,所以,可以配置多个环境,而配置文件命名也没有限制要求,所以可以将SQL映射应用到多种数据库指针,或者配置不同环境.