【2】Mybatis核心配置文件mybatis-config.xml、mapper.xml详解

4、配置解析

1、核心配置文件

  • mybatis-config.xml 系统核心配置文件

  • MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。

  • 能配置的内容如下:

    configuration(配置)
    properties(属性)
    settings(设置)
    typeAliases(类型别名)
    typeHandlers(类型处理器)
    objectFactory(对象工厂)
    plugins(插件)
    environments(环境配置)
    environment(环境变量)
    transactionManager(事务管理器)
    dataSource(数据源)
    databaseIdProvider(数据库厂商标识)
    mappers(映射器)
    <!-- 注意元素节点的顺序!顺序不对会报错 -->
    

2、环境配置

<environments default="development">
 <environment id="development">
   <transactionManager type="JDBC">
     <property name="..." value="..."/>
   </transactionManager>
   <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>
  • 配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上,必须指定其中一个为默认运行环境(通过default指定)

  • 子元素节点:environment

    • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。

    • 数据源是必须配置的。

    • 有三种内建的数据源类型

      type="[UNPOOLED|POOLED|JNDI]")
      
    • unpooled:这个数据源的实现只是每次被请求时打开和关闭连接。

    • pooled:这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来 , 这是一种使得并发 Web 应用快速响应请求的流行处理方式。

    • jndi:这个数据源的实现是为了能在如 Spring 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。

    • 数据源也有很多第三方的实现,比如dbcp,c3p0,druid等等…

    • 详情:点击查看官方文档

    • 这两种事务管理器类型都不需要设置任何属性。

    • 具体的一套环境,通过设置id进行区别,id保证唯一!

    • 子元素节点:transactionManager - [ 事务管理器 ]

      <!-- 语法 -->
      <transactionManager type="[ JDBC | MANAGED ]"/>
      
    • 子元素节点:数据源(dataSource)

3、属性(properties)

可以通过properties属性来实现引用配置文件

这些属性都是可外部配置且可动态替换的,既可以在典型的java文件【db.properties】中配置,也可在properties元素的子元素来传递。

在这里插入图片描述

其中db.properties文件:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/bigdata?userSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root

在核心配置文件直接中引入:

	<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/bigdata?userSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
  • 可以直接引入外部文件
  • 可以在其中增加一些属性配置
  • 如果两个文件有同一个字段,优先使用外部配置文件

4、类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。
  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

给实体类起别名:

	<typeAliases>
        <!--<package name="com.kuber.pojo"/>-->
        <typeAlias type="com.kuber.pojo.User" alias="User"/>
    </typeAliases>

也可以指定一个包名,mybatis会在包名下面搜索需要的Java Bean(扫描这个实体类的包,它的默认别名就是这个类名,首字母小写(其实大小写都可以,直接用类名就行)):

    <!--类型别名-->
    <typeAliases>
        <package name="com.kuber.pojo"/>
    </typeAliases>

在实体类比较少的时候,使用第一种方式;

如果实体类十分多,则可使用第二种,我这里以后全部用第二种。

第一种可以diy别名,第二种不可以,如果使用第二种非要改,则需要在实体类上增加注解(注意:是基于第二种方法使用的!并且需要把注解扫描打开,我暂时还是使用第二种吧)

@Alias("nihaoa")
public class User {
    
    }

下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。(官方表格)

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

5、设置(settings)

设置名 描述 有效值 默认值
cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。 true | false true
lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。 true | false false
logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未设置

6、其他配置(先做了解)

  • 类型处理器(typeHandlers)

  • 对象工厂(objectFactory)

  • 插件(plugins)

    • MyBatis Generator Core
    • MyBatis Plus
    • 通用mapper

7、映射器(mappers)

MapperRegistry

  • 既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。

  • 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。

  • 在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。

  • 你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等

方式一:我暂时都使用这种

    <!--每一个mapper.xml都需要在mybatis核心配置文件中进行注册,进行映射-->
    <mappers>
        <mapper resource="com/kuber/dao/UserMapper.xml"/>
    </mappers>

方式二:使用class文件绑定注册

    <mappers>
        <mapper class="com.kuber.dao.UserMapper"/>
    </mappers>

注意:

  • 接口和他的mapper.xml配置文件必须同名
  • 接口和他的mapper.xml配置文件必须在同一个包下

方式三:使用扫描包进行注入绑定

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

注意:

  • 接口和他的mapper.xml配置文件必须同名
  • 接口和他的mapper.xml配置文件必须在同一个

8、生命周期

在这里插入图片描述

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

SqlSessionFactoryBuilder

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

SqlSessionFactory

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

SqlSession

  • 连接到连接池的一个请求

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

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

  • 用完之后需要赶紧关闭,否则资源被占用

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43215322/article/details/109546247