0%

Mybatis核心配置文件详解

  • MyBatis核心配置文件包括属性:
    • configuration
    • environment
    • transactionManager
    • dataSource
    • properties
    • mapper

四、MyBatis核心配置文件详解

  • 以下面的配置文件为例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?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="mybatisDB">
    <environment id="mybatisDB">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="poolMaximumActiveConnections" value="10"/>
    <property name="poolTimeToWait" value="2000"/>
    <property name="poolMaximumCheckoutTime" value="10000"/>
    <property name="poolMaximumIdleConnections" value="5"/>
    </dataSource>
    </environment>
    <environment id="javawebDB">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/javaweb"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    </dataSource>
    </environment>
    </environments>
    <mappers>
    <mapper resource="CarMapper.xml"/>
    </mappers>
    </configuration>

4.1 configuration

  • configuration:根标签,表示配置信息。

  • "http://mybatis.org/dtd/mybatis-3-config.dtd" 规定了配置文件中可以有哪些标签,标签的属性有哪些,标签的顺序是什么等等。

    1
    2
    3
    4
    5
    6
    7
    <?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>
    ......
    </configuration>

4.2 ★environment

  • environment 对应数据库

  • environments :环境(多个),以 “s” 结尾表示复数,也就是说 mybatis-config.xml 的环境可以配置多个数据源。

    • default属性:表示默认使用的是哪个环境,default 后面填写的是 environment 的 id,default 的值只需要和 environment 的 id 值一致即可。
  • environment:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)

    • id:给当前环境一个唯一标识,在 java 程序中可以通过 id 来选择要使用哪个环境。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <!--default表示默认使用的环境。-->
    <!--默认环境什么意思?当你使用mybatis创建SqlSessionFactory对象的时候,没有指定环境的话,就默认使用这个环境。-->
    <environments default="mybatisDB">
    <!--其中的一个环境。连接的数据库是mybatis-->
    <!--一般一个数据库会对应一个SqlSessionFactory对象。-->
    <!--一个环境environment会对应一个SqlSessionFactory对象-->
    <environment id="mybatisDB">
    ...
    </environment>
    <!--这是mybatis的另一个环境,也就是连接的数据库是另一个数据库javaweb-->
    <environment id="javawebDB">
    ...
    </environment>
    </environments>
  • 在 java 程序中创建 SqlSessionFactory 对象时,可以使用默认的环境,也可以使用指定的环境。

    1
    2
    3
    4
    5
    6
    7
    8
    @Test
    public void testEnvironment() throws Exception {
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    // 使用默认的环境,即对应mybatis数据库
    SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
    // 通过environment的id使用指定的环境,即对应javaweb数据库
    SqlSessionFactory sqlSessionFactory2 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "javawebDB");
    }

4.3 transactionManager

  • transactionManager:配置事务管理器。

    • type属性:指定事务管理器具体使用什么方式,可选值包括两个:JDBCMANAGED

    可见 2.2 小节。

    1
    2
    3
    4
    <environment id="mybatisDB">
    <transactionManager type="JDBC"/>
    ...
    </environment>

4.4 ★dataSource

  • dataSource 对应使用的数据库连接池技术

  • dataSource 被称为数据源。

    • dataSource 作用是什么?为程序提供 Connection 对象(但凡是给程序提供 Connection 对象的,都叫做数据源)。
  • 数据源实际上是一套规范,JDK 中有这套规范:javax.sql.DataSource(这个数据源的规范,这套接口实际上是 JDK 规定的)。

    • 我们自己也可以编写数据源组件,只要实现 javax.sql.DataSource 接口就行了。实现接口当中所有的方法。这样就有了自己的数据源。

      比如你可以写一个属于自己的数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。

    • 常见的数据源组件有哪些呢【常见的数据库连接池有哪些呢】?

      • 阿里巴巴的德鲁伊连接池:druid
      • c3p0
  • dataSource:指定数据源。

    • type 属性:用来指定具体使用的数据库连接池的策略,就是指定具体使用什么方式来获取 Connection 对象。可选值包括三个 [UNPOOLED|POOLED|JNDI]

      • UNPOOLED:采用传统的获取连接的方式,不使用数据库连接池技术。每一次请求过来之后,都是创建新的 Connection 对象,虽然也实现 Javax.sql.DataSource 接口,但是并没有使用池的思想。

        • type="UNPOOLED" 时,property 可以是:

          • driver 这是 JDBC 驱动的 Java 类全限定名。

          • url 这是数据库的 JDBC URL 地址。

          • username 登录数据库的用户名。

          • password 登录数据库的密码。

          • ……

        1
        2
        3
        4
        5
        6
        7
        8
        9
        <environment id="mybatisDB">
        <transactionManager type="JDBC"/>
        <dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        </dataSource>
        </environment>
      • POOLED:采用传统的 javax.sql.DataSource 规范中的连接池,mybatis 中有针对规范的实现,即使用 mybatis 自己实现的数据库连接池

        • type="POOLED" 时,property 可以是(除了包含 UNPOOLED 中之外):

          • poolMaximumActiveConnections 在任意时间可存在的活动(正在使用)连接数量,默认值:10。

          • poolMaximumIdleConnections 任意时间可能存在的空闲连接数。

          • ……

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        <environment id="mybatisDB">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
        <!--提醒:正常使用连接池的话,池中有很多参数是需要设置的。设置好参数,可以让连接池发挥的更好。事半功倍的效果。-->
        <!--具体连接池当中的参数如何配置呢?需要反复的根据当前业务情况进行测试。-->
        <!--poolMaximumActiveConnections:连接池当中最多的正在使用的连接对象的数量上限。最多有多少个连接可以活动。默认值10-->
        <property name="poolMaximumActiveConnections" value="10"/>
        <!--每隔2秒打印日志,并且尝试获取连接对象-->
        <property name="poolTimeToWait" value="2000"/>
        <!--强行让某个连接空闲,超时时间的设置。这里设置为10s-->
        <property name="poolMaximumCheckoutTime" value="10000"/>
        <!--最多的空闲数量-->
        <property name="poolMaximumIdleConnections" value="5"/>
        </dataSource>
        </environment>

        ![](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/Mybatis/002-连接池.png)

      • JNDI集成其它第三方的数据库连接池,采用服务器提供的 JNDI 技术实现,来获取 DataSource 对象,不同的服务器所能拿到 DataSource 是不一样。如果不是 web 或者 maven 的 war 工程,JNDI 是不能使用的。

        JNDI 是一套规范,Java Name and Directory Interface,java 命名目录接口。谁实现了这套规范呢?大部分的 web 容器都实现了 JNDI 规范。例如:Tomcat、Jetty、WebLogic、WebSphere,这些服务器(容器)都实现了 JNDI 规范。

        • type="JNDI" 时,property 可以是(最多只包含以下两个属性):
          • initial_context 这个属性用来在 InitialContext 中寻找上下文(即,initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从 InitialContext 中寻找 data_source 属性。
          • data_source 这是引用数据源实例位置的上下文路径。提供了 initial_context 配置时会在其返回的上下文中进行查找,没有提供时则直接在 InitialContext 中查找。

        关于 JNDI 的配置,等后面讲到在 Web 服务器中使用 mybatis 技术时会详细介绍。

4.5 properties

  • mybatis 提供了更加灵活的配置,连接数据库的信息可以单独写到一个属性资源文件中,假设在类的根路径下创建 jdbc.properties 文件,配置如下:

    1
    2
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/powernode

    那么就可以在 mybatis 核心配置文件中引入并使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?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>

    <!--java.util.Properties类。是一个Map集合,key和value都是String类型-->
    <!--在properties标签中可以配置很多属性-->
    <!--用resource="jdbc.properties"引入外部属性资源文件-->
    <properties resource="jdbc.properties">
    <!--这是其中的一个属性-->
    <!--<property name="属性名" value="属性值"/>-->
    <property name="jdbc.username" value="root"/>
    <property name="jdbc.password" value="root"/>
    </properties>

    <environments default="dev">
    <environment id="dev">
    <transactionManager type="JDBC"/>
    <dataSource type="POOLED">
    <!--使用${key}取值-->
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    </dataSource>
    </environment>
    </environments>
    <mappers>
    <mapper resource="CarMapper.xml"/>
    </mappers>
    </configuration>
    • properties 两个属性:
      • resource:这个属性从类的根路径下开始加载【常用的】。
      • url:从指定的 url 加载,假设文件放在 d:/jdbc.properties,这个 url 可以写成:file:///d:/jdbc.properties。注意是三个斜杠。
        • 类似于 2.1 节中注意细节的倒数第二条。

4.6 mapper

  • mapper 标签用来指定 SQL 映射文件的路径,包含多种指定方式,这里先主要看其中两种:

    • 第一种:resource,从类的根路径下开始加载【比 url 常用】:

      1
      2
      3
      <mappers>
      <mapper resource="CarMapper.xml"/>
      </mappers>

      如果是这样写的话,必须保证类的根下有 CarMapper.xml 文件。

      • 如果类的根路径下有一个包叫做 testCarMapper.xml 如果放在 test 包下的话,这个配置应该是这样写:

        1
        2
        3
        <mappers>
        <mapper resource="test/CarMapper.xml"/>
        </mappers>
    • 第二种:url,从指定的 url 位置加载:

      假设 CarMapper.xml 文件放在 d 盘的根下,这个配置就需要这样写:

      1
      2
      3
      <mappers>
      <mapper url="file:///d:/CarMapper.xml"/>
      </mappers>

    mapper 还有其他的指定方式,后面再看。

---------------The End---------------