<?xml version="1.0" encoding="UTF-8"?>
<!--

    Copyright ${license.git.copyrightYears} the original author or authors.

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

-->
<document xmlns="http://maven.apache.org/XDOC/2.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">

  <properties>
    <title>MyBatis-Spring | 使用 MyBatis API</title>
    <author email="hpresnall@gmail.com">Hunter Presnall</author>
    <author email="eduardo.macarron@gmail.com">Eduardo Macarron</author>
    <author email="nanlei1987@gmail.com">Nan Lei</author>
  </properties>
     
  <body>
    <section name="使用 MyBatis API">
      <p>
        使用 MyBatis-Spring，你可以继续直接使用 MyBatis 的 API。只需简单地使用 <code>SqlSessionFactoryBean</code> 在 Spring 中创建一个 <code>SqlSessionFactory</code>，然后按你的方式在代码中使用工厂即可。
      </p>
      <source><![CDATA[public class UserDaoImpl implements UserDao {
  // SqlSessionFactory 一般会由 SqlSessionDaoSupport 进行设置
  private final SqlSessionFactory sqlSessionFactory;

  public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
  }

  public User getUser(String userId) {
    // 注意对标准 MyBatis API 的使用 - 手工打开和关闭 session
    try (SqlSession session = sqlSessionFactory.openSession()) {
      return session.selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId);
    }
  }
}]]></source>

      <p>
        <b>小心使用</b>此选项，错误地使用会产生运行时错误，更糟糕地，会产生数据一致性的问题。直接使用 API 时，注意以下弊端：
      </p>
      <ul>
        <li>
          <p>
            它不会参与到 Spring 的事务管理之中。
          </p>
        </li>
        <li>
          <p>
            如果 <code>SqlSession</code> 使用与 Spring 事务管理器使用的相同 <code>DataSource</code>，并且有进行中的事务，代码<b>将</b>会抛出异常。
          </p>
        </li>
        <li>
          <p>
            MyBatis 的 <code>DefaultSqlSession</code> 是线程不安全的。如果在 bean 中注入了它，<b>将</b>会发生错误。
          </p>
        </li>
        <li>
          <p>
            使用 <code>DefaultSqlSession</code> 创建的映射器也不是线程安全的。如果你将它们注入到 bean 中，<b>将</b>会发生错误。
          </p>
        </li>
        <li>
          <p>
            你必须确保总是在 finally 块中来关闭 <code>SqlSession</code>。
          </p>
        </li>
      </ul>
    </section>
  </body>
</document>
