【Mybatis】03 官方文档指北阅读 vol1

【入门】阅读指北

https://mybatis.org/mybatis-3/zh/getting-started.html

安装

要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于类路径(classpath)中即可。

如果使用 Maven 来构建项目

则需将下面的依赖代码置于 pom.xml 文件中:

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

实际上,我们还需要其他依赖工具

这只是纯Mybatis的操作所需

- 1、JDBC 驱动

- 2、Lombok 实体类简化

- 3、Junit 单元测试

<dependencies>
        <!-- Mybatis 组件 -->
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!-- JDBC 驱动-->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>

        <!-- lombok -->
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>


        <!-- Junit 单元测试 -->
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得

而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。

从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。

但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。

MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。

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

我们可以做一个简单获取测试

    @Test
    public void ssf() throws IOException {
        // Maven构建的工程不再需要书写路径,给定文件名即可
        String mybatis_config = "mybatis-config.xml";

        // 通过Mybatis自己的Resources资源类读取目标文件,存在流异常,抛出即可
        InputStream resourceAsStream = Resources.getResourceAsStream(mybatis_config);

        // 调用会话工厂的建造方法,注入读取流,获取工厂实例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        // 通过工厂实例 获取 会话实例
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 成功即打印对象地址
        System.out.println(sqlSession);

        //释放资源
        sqlSession.close();
    }

测试结果

XML 配置文件中包含了对 MyBatis 系统的核心设置

包括获取数据库连接实例的数据源(DataSource)

以及决定事务作用域和控制方式的事务管理器(TransactionManager)

后面会再探讨 XML 配置文件的详细内容,这里先给出一个简单的示例:

<?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>

    <!-- Mybatis多环境配置 default="development"表示默认使用的1个环境 -->
    <environments default="development">

        <!-- default 环境 -->
        <environment id="development">

            <!-- 事务管理 默认使用JDBC -->
            <transactionManager type="JDBC"/>

            <!-- 数据源 ,也就是我们所学的连接池技术 -->
            <dataSource type="POOLED">

                <!-- 不用我说是了把,老4样了 -->

                <!-- 这是jdbc8.0+ 的版本驱动,老版本5.0+ 是com.mysql.jdbc.Driver -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

                <!-- 本机连接可以不用写 localhost:3306 -->
                <!-- 8.0+的驱动访问数据库必须声明时区参数 ,5.0+不需要 直接就是 jdbc:mysql:///mybatis -->
                <!-- 时区还可以设置为 -->
                <!-- jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8&useSSL=true&amp;serverTimezone=GMT&useUnicode=true -->
                <property name="url" value="jdbc:mysql:///mybatis?serverTimezone=GMT"/>

                <!-- 用户&密码 -->
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>

        <!-- 我们复制粘贴,可以使用第二套环境 -->
        <environment id="development2">
            <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>

    <!-- 我们需要绑定的Dao,按Mybatis的话来说,就是Mapper映射器 -->
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>

</configuration>

当然,还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。

注意 XML 头部的声明,它用来验证 XML 文档的正确性。【也就是XML的约束】

environment 元素体中包含了事务管理和连接池的配置。

mappers 元素则包含了一组映射器(mapper),

这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。


【从不使用 XML 构建 SqlSessionFactory】开始是对老版Mybatis的介绍,不要再看了!!!】

  在现在的版本中都已经找不到这个Blog类型的源码了

【到命名空间的一点补充为止都不需要看了】


作用域(Scope)和生命周期

理解我们之前讨论过的不同作用域和生命周期类别是至关重要的,

因为错误的使用会导致非常严重的并发问题。

提示 对象生命周期和依赖注入框架

依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,

并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。

如果对如何通过依赖注入框架使用 MyBatis 感兴趣,可以研究一下 MyBatis-Spring 或 MyBatis-Guice 两个子项目。

SqlSessionFactoryBuilder

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。

因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,

但最好还是不要一直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情。

【也就是说,读取到核心配置生成了会话工厂实例,然后调用finalize销毁掉?】

SqlSessionFactory

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。

使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,

多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。

因此 SqlSessionFactory 的最佳作用域是应用作用域。

有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式

【就像我们写的MybatisUtil一样,静态的,加载获取了保留在那就行了】

SqlSession

每个线程都应该有它自己的 SqlSession 实例。

SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域

绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。

也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。

如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。

换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。

这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。

下面的示例就是一个确保 SqlSession 关闭的标准模式:

try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}

在所有代码中都遵循这种使用模式,

可以保证所有数据库资源都能被正确地关闭

【官方鼓励我们使用异常捕获机制处理会话实例,但是代码看起来很乱,这只是一个建议,可写也可不写】

映射器实例

映射器是一些绑定映射语句的接口。

映射器接口的实例是从 SqlSession 中获得的。

虽然从技术层面上来讲,任何映射器实例的最大作用域与请求它们的 SqlSession 相同。

但方法作用域才是映射器实例的最合适的作用域。

也就是说,映射器实例应该在调用它们的方法中被获取,使用完毕之后即可丢弃。

映射器实例并不需要被显式地关闭。

尽管在整个请求作用域保留映射器实例不会有什么问题,

但是你很快会发现,在这个作用域上管理太多像 SqlSession 的资源会让你忙不过来。

因此,最好将映射器放在方法作用域内。就像下面的例子一样:

try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  // 你的应用逻辑代码
}

【同SqlSession会话实例一样,鼓励使用try-catch-finally处理,可写也可不写】

猜你喜欢

转载自www.cnblogs.com/mindzone/p/12823158.html