集成

要使用Mybatis,你需要引入mybatis-x.x.x.jar到你项目的classpath。

如果你的项目使用maven来管理,添加如下依赖到你的项目pom.xml。

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>

从XML中构建SqlSessionFactory

每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。 SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder来获得。

SqlSessionFactoryBuilder对象可以从XML配置文件,或从Configuration类的实例中构建SqlSessionFactory对象。

 

从XML文件中构建SqlSessionFactory的实例非常简单。这里建议你使用classpath路径下的资源文件来配置。MyBatis包含了一些工具类,这些工具类使得从classpath或其他位置加载资源文件更加简单。

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

XML配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。这里给出一个简单的示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

当然,XML配置文件中还有很多可以配置的,在上面的示例指出的则是最关键的部分。environment元素体中包含对事务管理和连接池的环境配置。mappers元素是包含所有mapper映射的列表,这些mapper的XML文件包含SQL代码和映射定义信息。

使用Java代码构建SqlSessionFactory

如果你喜欢使用Java代码而不是XML文件直接创建配置实例,MyBatis也提供完整的配置类,提供所有从XML文件中加载配置信息的选项。

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

注意这种情况下配置是添加的是Java的映射类,这些类包含SQL语句的注解从而避免了XML文件的依赖,但XML映射仍然在大多数高级映射(比如:嵌套Join映射)时需要。出于这样的原因,如果存在XML配置文件的话,MyBatis将会自动查找和加载一个和类名相同的XML文件(上面的示例,存在BlogMapper.class类,那么BlogMapper.xml将会被加载)。

从SqlSessionFactory中获取SqlSession

现在,我们已经知道如何获取SqlSessionFactory对象了,基于同样的方式,我们就可以获得SqlSession的实例了。SqlSession对象包含所有执行SQL操作的方法。你可以用SqlSession实例来直接执行已映射的SQL语句。例如:

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

这种使用方式和之前的MyBatis版本是一样的,现在提供了一种更简洁的方法,使用Mapper的接口(比如BlogMapper.class),这样的方式更简单也更安全,不会发生写错字符串找不到类的错误。例如:

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

映射的SQL语句

你也许想知道通过SqlSession和Mapper对象到底执行了什么操作。这是Mybatis最主要的一个主题,这里先给出一个宏观的概念,上面的示例,语句是通过XML或注解定义的。我们先来看看XML。如果你以前用过iBatis,这个应该很熟悉了,但是XML映射文件也有很多的改进,后面会详细来说。这里给出一个基于XML映射语句的示例,这些语句应该可以满足上述示例中SqlSession对象的调用。

<?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" parameterType="int" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

你可以在一个单独的XML映射文件中定义很多的SQL映射语句,在命名空间"com.mybatis.example.BlogMapper"中,它定义了一个名为"selectBlog"的映射语句,这样你可以使用完全限定名"org.mybatis.example.BlogMapper.selectBlog"来调用映射语句。

Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

你也可以用如下方式来调用:

BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

这里推荐第二种方式,优点是不言而喻的。

命名空间在之前版本的MyBatis中是可选的,而在新版本中是必须的,它的目的是使用更长的完全限定名来隔离语句。 命名解析:为了减少输入量,MyBatis对所有的命名配置元素使用如下的命名解析规则,包括语句,结果映射,缓存等。

直接查找完全限定名(比如"com.mypackage.MyMapper.selectAllThing")发现就使用。短名称(比如"selectAllThings")可以用来引用任意含糊的对象。而如果有两个或两个以上的(比如"com.foo.selectAllThings"和"com.bar.selectAllThings"),那么就会出现短名称不明确的错误,此时就必须使用完全限定名。

使用注解

你还可以用注解来映射SQL语句,比如上面的XML示例可以用如下注解来替换:

public interface BlogMapper {
  @Select("SELECT * FROM blog WHERE id = #{id}")
  Blog selectBlog(int id);
}

对于简单的SQL语句来说,使用注解代码会显得比较清晰,但是对于复杂语句来说就会显得很混乱。因此,建议你最好使用XML来映射语句。当然最终取决于你自己的决定。

范围和生命周期

理解不同范围不同对象的生命周期是很重要的,不正确的使用可能会导致严重的并发问题。

SqlSessionFactoryBuilder

一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但最好的方式是不要一直保持它来解析所有的XML资源。

SqlSessionFactory

一旦被创建,SqlSessionFactory应该在你的应用程序运行期间都存在。使用SqlSessionFactory的最佳实践是在应用运行期间只创建一次。因此SqlSessionFactory的最佳范围是应用范围,最简单的就是使用单例模式或者静态单例模式。

SqlSession

每个线程都应该有自己的SqlSession实例,SqlSession的实例不能被共享,它是线程不安全的。因此最佳的范围是请求或方法范围。不要将SqlSession的实例引用放在一个类的静态字段甚至是实例字段中,也不要将SqlSession的实例引用放在任何类型的管理范围中,比如Serlvet中的HttpSession。如果你现在正在使用Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。

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

在你的代码中使用这种模式, 将保证所有数据库资源都正确地关闭。

Mapper实例

Mapper是你创建绑定映射语句的接口,Mapper接口的实例可以从SqlSession中获得。也就是说,任意Mapper实例的最大范围和SqlSession是相同的。但是,Mapper实例的最佳范围是方法范围,它们应该在使用它们的方法中被请求,然后就抛弃掉,它们不需要显式地关闭。

SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // do work
} finally {
  session.close();
}
对象生命周期和依赖注入框架

使用注入框架可以创建线程安全的包含事务的sqlSession和Mapper,并将它们注入到你的Bean,这样你就可以不用去关心它们的生命周期。具体可参考Mybatis和Spring的整合。

你可能感兴趣的内容
0条评论

selfly

交流QQ群:32261424
Owner