【MyBatis】| MyBatis核⼼配置⽂件详解

时间:2023-01-20 10:52:02

目录

一:MyBatis核⼼配置⽂件详解

1. Mybatis核心配置文件之多环境

2. Mybatis事务管理器

3. 对数据源的深度剖析

4. properties和mapper标签的配置和使用


一:MyBatis核⼼配置⽂件详解

(1)configuration:根标签,表示配置信息。

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

default属性:后面跟着default属性,表示默认使⽤的是哪个环境,default后⾯填写的是environment的id,default的值只需要和environment的id值⼀致即可。

(3)environment:具体的环境配置(主要包括:事务管理器的配置 + 数据源的配置)。

id属性:给当前环境一个唯⼀标识,该标识⽤在environments的default后⾯,⽤来指定默认环境的 选择。

(4)transactionManager:配置事务管理器

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

(5)dataSource:指定数据源

type属性:⽤来指定具体使⽤的数据库连接池的策略,可选值包括三个 

(6)mappers:在mappers标签中可以配置多个sql映射⽂件的路径。

(7)mapper:配置某个sql映射⽂件的路径:

resource属性:使⽤相对于类路径的资源引⽤⽅式 。

url属性:使⽤完全限定资源定位符(URL)⽅式 。

<?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="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://localhost:3306/po
wernode"/>
                    <property name="username" value="root"/>
                    <property name="password" value="root"/>
                </dataSource>
            </environment>
        </environments>

        <mappers>
            <mapper resource="CarMapper.xml"/>
        </mappers>
    </configuration>

1. Mybatis核心配置文件之多环境

environments标签

(1)environments标签表示可以有多个环境,一个环境environment对应一个数据库,一个数据库就对应着一个SqlSessionFactory对象!

(2)一个环境environment对应着一个唯一标识的id,多个环境environments对应的default属性可输入environment对应的id,用来指定默认使用的数据库对象

<?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数据库-->
    <environments default="mybatisDB">
        <!--连接的是mybatis数据库-->
        <environment id="mybatisDB">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>
        <!--连接的是bjpowernode数据库-->
        <environment id="bjpowernodeDB">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
                <property name="username" value="root"/>
                <property name="password" value="123"/>
            </dataSource>
        </environment>   
    </environments>

    <mappers>
        <!--关联CarMapper.xml配置文件-->
        <mapper resource="CarMapper.xml"/>
    </mappers>

</configuration>

(3)编写sql语句

<?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="car">
    <insert id="insertCar">
        insert into t_car values(null,'8888','特斯拉',30.0,'2000-11-11','燃油车')
    </insert>
</mapper>

(4)编写测试程序

package com.bjpowernode.mybatis.test;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

/**
 * @Author:朗朗乾坤
 * @Package:com.bjpowernode.mybatis.test
 * @Project:mybatis
 * @name:ConfigurationTest
 * @Date:2022/12/30 20:15
 */
public class ConfigurationTest {
    @Test
    public void testEnvironment() throws Exception{
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 使用默认的
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
        // 自己指定连接数据库的对象
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "bjpowernodeDB");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        // 执行sql
        int count = sqlSession.insert("car.insertCar");
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }
}

2. Mybatis事务管理器

transactionManager标签
(1)作用:配置事务管理器。指定mybatis具体使用什么方式去管理事务。
(2)type属性有两个值:

①JDBC:使⽤JDBC原⽣的事务管理机制。

底层原理:事务开启 conn.setAutoCommit(false); ...处理业务...事务提交conn.commit();

②MANAGED:mybatis不再负责事务的管理,交给其它容器来管理事务,⽐如:Spring等。如果没有管理事务的容器,则没有事务。没有事务的含义是只要执⾏⼀条DML语句,则提交⼀次。
(3)不缺分大小写,但是不能写其他值。只能是二选一: jdbc、managed
(4)在mybatis中提供了一个事务管理器接口:Transaction该接口下有两个实现类:
①如果type="JDBC",那么底层会实例化JdbcTransaction对象。
②如果type="MANAGED",那么底层会实例化ManagedTransaction对象。        

 <transactionManager type="JDBC"/>

3. 对数据源的深度剖析

dataSource标签

(1)dataSource被称为数据源,作用是为程序提供连接对象;凡是给程序提供Connection对象的都叫做数据源。

(2)数据源实际上是一套规范。JDK中有这套规范:javax.sql.DataSource;我们自己也可以编写数据源组件,只要实现javax.sql.DataSource接口就行了。实现接口当中所有的方法。这样就有了自己的数据源,比如:可以写一个属于自己的数据库连接池(数据库连接池是提供连接对象的,所以数据库连接池就是一个数据源)。

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

 阿里巴巴的德鲁伊连接池:druid、c3p0、dbcp ....

(4)type属性用来指定数据源的类型,就是指定具体使用什么方式来获取Connection对象,type属性有三个值:type="[UNPOOLED|POOLED|JNDI]"
①UNPOOLED:不使用数据库连接池,每一次请求过来后,都是创建新的Connection对象
②POOLED:使用mybatis自己实现的数据库连接池。
③JNDI:集成其它第三方的数据库连接池。

(5)JNDI是:java命名目录接口,是一套规范。大部分的web容器都实现了JNDI规范;例如:Tomcat、Jetty、WebLogic、WebSphere,这些服务器(容器)都实现了JNDI规范。
 (6)连接池的优点:每一次获取连接都是从连接池中拿,所以每次连接对象的创建数量都是可控的。

①UNPOOLED:采⽤传统的获取连接的⽅式,虽然也实现Javax.sql.DataSource接⼝,但是 并没有使⽤池的思想。 property可以是:

????driver:JDBC 驱动的 Java 类全限定名。

????url:数据库的 JDBC URL 地址。

????username:登录数据库的⽤户名。

????password:登录数据库的密码。

????defaultTransactionIsolationLevel:默认的连接事务隔离级别。

????defaultNetworkTimeout:等待数据库操作完成的默认⽹络超时时间(单位:毫秒)

②POOLED:采⽤传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实 现。property可以是(除了包含UNPOOLED中之外):

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

????poolMaximumIdleConnections – 任意时间可能存在的空闲连接数;例如:上面配置的最多连接数量是10,这里配置最多空闲的数量是5个,如果空闲第6个了,此时连接池为了保证最多空闲的数量是5个,会真正关闭多余的空闲的连接对象。

????poolMaximumCheckoutTime – 设置超时时间,在被强制返回之前,池中连接被检出(checked out)时间,默认值:20000 毫秒(即 20 秒)。

????poolTimeToWait – 间隔多久打印一次日志信息,并尝试获取连接。

其它....

③JNDI:采⽤服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所拿到 DataSource不⼀样。如果不是web或者maven的war⼯程,JNDI是不能使⽤的。property可以是(最多只包含以下两个属性):

????initial_context 这个属性⽤来在 InitialContext 中寻找上下⽂(initialContext.lookup(initial_context))这是个可选属性,如果忽略,那么将会直接从

InitialContext 中寻找 data_source 属性。

????data_source 这是引⽤数据源实例位置的上下⽂路径。提供了 initial_context 配置时会 在其返回的上下⽂中进⾏查找,没有提供时则直接在 InitialContext 中查找。

<dataSource type="POOLED">
     <property name="driver" value="com.mysql.jdbc.Driver"/>
     <property name="url" value="jdbc:mysql://localhost:3306/bjpowernode"/>
     <property name="username" value="root"/>
     <property name="password" value="123"/>
     <!--连接池中最多正在使用的连接对象的数量上限,默认是10-->
     <property name="poolMaximumActiveConnections" value="10" />
     <!--最多的空闲数量-->
     <property name="poolMaximumIdleConnections" value="5" />
     <!--强行让让某个连接空闲,超时时间的设置-->
     <property name="poolMaximumCheckoutTime" value="100000" />
     <!--每隔2秒打印日志,并且尝试获取连接对象-->
     <property name="poolTimeToWait" value="2000" />
</dataSource>

4. properties和mapper标签的配置和使用

(1)java.util.Properties类,实际上是一个Map集合,key和value都是String类型;语法格式:<property name="属性名" value="属性值"/>

(2)例如:我们可以把连接数据库的代码单独抽取出来配置,然后在通过变量的形式赋值过去即可

<?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>
    <!-- 单独抽取出来连接数据库的代码-->
    <properties>
        <property name="jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis" />
        <property name="jdbc.username" value="root" />
        <property name="jdbc.password" value="123" />
    </properties>
    <settings>
        <setting name="logImpl" value="SLF4J"/>
    </settings>
    <!-- 默认获取的是mybatis数据库-->
    <environments default="mybatisDB">
        <!--连接的是mybatis数据库-->
        <environment id="mybatisDB">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <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>
        <!--关联CarMapper.xml配置文件-->
        <mapper resource="CarMapper.xml"/>
    </mappers>
</configuration>

(3)实际上这些连接数据库中的信息,可以配置到一个文件里;在类路径下(resources),创建一个jdbc.properties文件

jdbc.properties配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=123

使用resource引入配置文件

<?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>
  
    <!--resource一定是从类路径下开始查找资源-->
    <properties resource="jdbc.properties" />

    <settings>
        <setting name="logImpl" value="SLF4J"/>
    </settings>

    <!-- 默认获取的是mybatis数据库-->
    <environments default="mybatisDB">
        <!--连接的是mybatis数据库-->
        <environment id="mybatisDB">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <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>
        <!--关联CarMapper.xml配置文件-->
        <mapper resource="CarMapper.xml"/>
    </mappers>

</configuration>

(4)也可以使用url属性,表示从绝对路径中加载资源,绝对路径的语法:file:///路径

例如:把jdbc.properties放到d盘的根目录下

<!--从绝对路径下加载-->
<properties url="file:///d:/jdbc.properties" />

(5)注意:mapper标签的使用和properties标签的使用很相似;也是resource属性:使⽤相对于类路径的资源引⽤⽅式 ;url属性:使⽤绝对路径中加载资源。