三、Mybatis 配置文件解析

4.1、核心配置文件

Mybatis中的核心配置文件就是MyBatis-config.xml了,从官方文档中我们可以看到涉及的配置项还是挺多的,接下来我们会挑一些重要的看下

image-20210805110114764

4.2、环境配置(environments)

在开发过程中我们有时需要多套环境进行切换,例如一套开发环境,一套测试环境。这时就可以用到environments配置,我们在mybatis-congif.xml中增加一个test的环境配置,如下:

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicodetrue&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicodetrue&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/luca/dao/UserMapper.xml"/>
    </mappers>
</configuration>

我们修改Utils中的MybatisUtils中,指定SqlSessionFactoryBuilder方法的环境信息为新增的test

image-20210805140817798

再运行下之前的测试方法,发现可以正常运行,说明切换了环境是可以正常使用的。从这里可以看到,不论设置了多少个环境配置,在工厂方法调用的使用最终只是使用一个。

4.3、属性(properties)

在mybatis-config.xml中,dataSource的driver, url等信息很长很复杂,既不方便使用也不方便维护,为了让配置信息更方便使用和维护,我们增加preperties配置,在dataSource中读取配置中的信息。

  1. 首先将数据连接的配置信息放到配置文件中,在sources新建db.preperties文件,存放数据库连接配置信息

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username=root
    password=123456
    
  2. 在mybatis-config.xml文件中增加properties配置,source设置为刚刚创建的db.properties

    <properties resource="db.properties" />
    
  3. 这样,mybatis会自动读取配置文件中的内容,我们可以修改dataSource中的引用

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

这样看起来是不是简洁了许多,并且把数据库信息的维护都放在了配置文件中。

4.4、类型别名(typeAliases)

解决了mybatis-config.xml中的冗余,在UserMapper.xml中,可以看到parameType的全路径类名也是一个冗余的存在,写起来确实很烦。

image-20210805160810641

  • 方法一:

    1.在mybatis-config.xml中增加配置typeAliases,为com.luca.pojo.User这个实体类设置一个别名,然后在Mapper.xml中都是用别名代替全名

    mybatis-config.xml

    <typeAliases>
      <typeAlias alias="user" type="com.luca.pojo.User" />
    </typeAliases>
    

    2.替换UserMapper.xml中的com.luca.pojo.User为别名user

    image-20210805161659152

  • 方法二:

    1.在mybatis-config.xml中不指定某一个实体类,而是指定一个包的路径,mybatis会自动扫描包下的实体类,别名自动设置为实体类的类名。

    mybatis-config.xml

    <typeAliases>
      <package name="com.luca.pojo"/>
    </typeAliases>
    

    2.在UserMapper.xml中仍用user代替com.luca.pojo.User,运行测试用例结果正常。

4.5、设置(settings)

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。

image-20210805162518521

4.6、映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。

  • 在上面的例子中我们的mapper是直接指定了一个接口实现类的xml文件

    <mappers>
      <mapper resource="com/luca/dao/UserMapper.xml"/>
    </mappers>
    
  • 除此之外,我们也可以使用接口实现类的类名,像这样

    <mappers>
      <mapper class="com.luca.dao.UserMapper"/>
    </mappers>
    
  • 或者在实现类有很多的情况下,我们直接指定包名,Mybatis会自动查找包下面的接口实现类

    <mappers>
      <package name="com.luca.dao"/>
    </mappers>
    

需要注意的是,后两种方式需要接口和接口实现类的名称是一致的,否则会导致Mybatis找不到对应的接口实现类xml文件!

4.7、生命周期和作用域

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。

SqlSessionFactoryBuilder

  • 一旦创建了SqlSessionFactory,就不再需要它了
  • 所以应该把SqlSessionFactoryBuilder作为局部变量

SqlSessionFactory

  • 说白了可以想象为数据库连接池
  • SqlSessionFactory一旦创建就应该在应用运行期间一直存在,没有理由丢弃它或者重新创建另一个实例
  • 因此SqlSessionFactory的最佳作用域是应用作用域
  • 最简单就是使用单例模式或者静态单例模式

SqlSession

  • 相当于连接到连接池的一个请求
  • SqlSession 实例不是线程安全的,因此不能被共享,所以它的最佳作用域是每次请求或者方法作用域
  • 用完之后应该赶紧关闭,避免资源的浪费

image.png

在这里没一个Mapper相当于一个具体的业务。

posted @ 2021-09-12 21:48  LucaZ  阅读(92)  评论(0编辑  收藏  举报