mybatis配置解析介绍

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 mybatis配置解析介绍,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

4.配置解析

4.1 核心配置文件

  • mybatis-config.xml个元素的使用

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

4.2 环境配置environments

  • MyBatis 可以配置成适应多种环境
  • 尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
  • environments 元素定义了如何配置环境。
<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>
  • 默认使用的环境 ID(比如:default=“development”)。
  • 每个 environment 元素定义的环境 ID(比如:id=“development”)。
  • 事务管理器的配置(比如:type=“JDBC”)。
  • 数据源的配置(比如:type=“POOLED”)。

4.3 事务管理器(transactionManager)

  • MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)
  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚功能,它依赖从数据源获得的连接来管理事务作用域。
  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器(EJB)来管理事务的整个生命周期, 默认情况下它spring会关闭连接。然而一些容器并(EJB)不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:

4.4 数据源(dataSource)

  • dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。
  • 有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”):
  • 默认是使用了POOLED连接池。
  • jndi是供EJB使用的

4.5 属性(properties)

  • 可以通过properties属性来实现引用配置文件
<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>
  • 这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。【db.properties】
  • 编写配置文件db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username=root
password123456
  • 在核心配置文件中引入。

  • 引入时各属性存在顺序

The content of element type “configuration” must match “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)

  • 引入方式1:优先使用外部配置方式
<!--引入外部配置文件-->
<properties resource="db.properties">
</properties>
<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>
  • 引入方式2:
<properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="123123"/>
</properties>
<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.6 类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。

  • 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

  • 方式一:可以给实体类起别名

<!--可以给实体类起别名-->
<typeAliases>
    <typeAlias type="com.zk.pojo.User" alias="user"/>
</typeAliases>
  • 方式二:也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
<typeAliases>
    <package name="com.zk.pojo"/>
</typeAliases>
  • 每一个在包 domain.blog 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。
  • 若有注解,则别名为其注解值。见下面的例子:
@Alias("author")
public class Author {
    ...
}

在实体类少的时候用第一种

在实体类多的时候用第二种

第一种可以自定义别名,第二种需要通过注解的方式定义别名

优先级:类型别名 > 注解别名 > 包别名

  • 常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
  • 基本类型为_int,包装类型为int

4.7 设置(settings)

  • 这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。
  • 一个配置完整的 settings 元素的示例如下:
<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
  <setting name="multipleResultSetsEnabled" value="true"/>
  <setting name="useColumnLabel" value="true"/>
  <setting name="useGeneratedKeys" value="false"/>
  <setting name="autoMappingBehavior" value="PARTIAL"/>
  <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
  <setting name="defaultExecutorType" value="SIMPLE"/>
  <setting name="defaultStatementTimeout" value="25"/>
  <setting name="defaultFetchSize" value="100"/>
  <setting name="safeRowBoundsEnabled" value="false"/>
  <setting name="mapUnderscoreToCamelCase" value="false"/>
  <setting name="localCacheScope" value="SESSION"/>
  <setting name="jdbcTypeForNull" value="OTHER"/>
  <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

cacheEnabled 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存 true

lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态 false

useGeneratedKeys 允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。 false

mapUnderscoreToCamelCase 是否开启驼峰命名自动映射,即从经典数据库oracle列名 A_COLUMN 映射到经典 Java 属性名 aColumn。 oracle数据库字段都会转大写可读性差,所以才加xxx_xxx False

logImpl 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 未设置

4.8 其他配置

MyBatis Plus简化MyBatis

MyBatis Generator Core

Mybatis_PageHelper

4.9 映射器(mappers)

  • MapperRegistry:注册绑定mapper文件

  • 方式1:使用相对于类路径的资源引用

<mappers>
    <mapper resource="com/zk/dao/UserMapper.xml"/>
</mappers>
  • 可以通配
<mapper resource="com/zk/dao/*.xml"/>
  • 方式2:使用映射器接口实现类的完全限定类名,class类名
<mappers>
    <mapper class="com.zk.dao.UserMapper"/>
</mappers>
  • 方式2问题:

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

接口和他的mapper配置文件必须同名

  • 方式3:将包内的映射器接口实现全部注册为映射器。包扫描
<mappers>
    <package name="com.zk.dao"/>
</mappers>

也存在方式2问题

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

接口和他的mapper配置文件必须同名

4.10 作用域(Scope)和生命周期

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

  • SqlSessionFactoryBuilder:一旦创建了 SqlSessionFactory,就不再需要它了。

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

  • SqlSessionFactory:可以视为数据库连接池,程序运行期间一直存在回收分配SqlSession
  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次

因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

  • SqlSession:数据库连接池连进去的一个请求,每个线程都应该有它自己的 SqlSession 实例。

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

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

SqlSession 放在一个和 HTTP 请求相似的作用域中,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。你应该把这个关闭操作放到 finally 块中

  • 用完之后即刻关闭,否则资源被占用。
    在这里插入图片描述
  • 这里面的每个mapper视为一个具体的业务

本专栏下一篇:MyBatis元素resultMap介绍及使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123924.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!