Mybatis—配置文件分析

导读:本篇文章讲解 Mybatis—配置文件分析,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1.配置解析

1.1、核心配置文件

1.2、environments(环境配置)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中

不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。

<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”)。

1.事务管理器的配置(transactionManager)

在 MyBatis 中有两种类型的事务管理器(也就是 type=“[JDBC|MANAGED]”)默认的是JDBC:

  • JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。

  • MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。例如:

    <transactionManager type="MANAGED">
      <property name="closeConnection" value="false"/>
    </transactionManager>
    

2.数据源(dataSource)

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

  • 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的,但如果要启用延迟加载特性,就必须配置数据源。

有三种内建的数据源类型(也就是 type=“[UNPOOLED|POOLED|JNDI]”),默认的是POOLED

1.3、属性(properties)

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

这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。

编写一个配置文件db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
password=123456

在核心配置文件mybatis-config.xml中映入

<properties resource="db.properties">
<!--在这里面可以补充些数据-->
    <property name="name" value="root"/>
</properties>
  • 可以直接映入外部文件
  • 也可以在引入的时候增加数据
  • 如果引入时添加的和外部文件是同一个字段,优先使用.xml里面配置的
  • 在核心配置文件中,编写配置要按照顺序编写,像properties外部配置要放在最前面

在这里插入图片描述

1.4、类型别名(typeAliases)

  • 类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。
<!--    可以给实体类取别名-->
    <typeAliases>
        <typeAlias alias="User" type="pojo.User"/>
    </typeAliases>

在后面resulttype里面就可以直接用User来代替pojo.User

  • 也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean,比如:

扫描实体类的包,它的默认别名就是包里面类的类名,首字母小写

<typeAliases>
  <package name="pojo"/>
</typeAliases>

则User的别名就是user

用扫描包的话,如果想更改别名为user02,就得使用注解

@Alias("user02")
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

1.5、设置(settings)

Mybatis重要的调整设置,会改变MyBatis的运行时行为

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

1.6映射器(mappers)

MapperRegistry:注册绑定我们的Mapper文件

方式一:

<!--    每一个mapper.xml都需要在mybatis核心配置文件中注册-->
<mappers>
    <mapper resource="dao/UserMapper01.xml"/>
</mappers>

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

<mappers>
    <mapper class="dao.UserMapper01"/>
</mappers>

注意:

  • 接口和其对应的Mapper配置文件必须同名
  • 接口和其对应的Mapper配置文件必须在同一个包下

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

<mappers>
    <package name="dao"/>
</mappers>

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

在这里插入图片描述

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

SqlSessionFactoryBuilder:

  • 一旦创建了SqlSessionFactory,就不需要它了
  • 可以当成局部变量

SqlSessionFactory:

  • 可以看作成是:数据库连接池
  • SqlSessionFactory一旦创建就应该在运行期间一直存在,不能丢弃它或者重新创建另一个实例
  • 因此SqlSessionFactory的最佳作用域是应用作用域
  • 最简单的就是使用单例模式或者静态单例模式

SqlSession:

  • 连接到连接池的一个请求
  • SqlSession的实例不是线程安全的,因此不能被共享,所以它的最佳作用域是请求或方法作用域
  • 用完需要赶紧关闭,否则资源会被占用

2.解决属性名字段名不一致的问题(ResultMap)

数据库中的字段名和实体类中的属性名不一致

如实体类中是password,数据库中是pwd,则查询的时候会出现

在这里插入图片描述

密码查不出来,解决方案如下:

  • 第一种:起别名
<select id="getUserById" parameterType="int" resultType="pojo.User">
    select id,username,pwd as password from mybatis.user where id = #{id}
</select>
  • 第二种:使用ResultMap
<!--    结果集映射-->
    <resultMap id="UserMap" type="User">
<!--        column表示数据库的字段,property实体类中的属性-->
        <result column="pwd" property="password"></result>
    </resultMap>
    <select id="getUserById" parameterType="int" resultMap="UserMap">
        select id,username,pwd  from mybatis.user where id = #{id}
    </select>
  • resultMap 元素是 MyBatis 中最重要最强大的元素。
  • ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
  • ResultMap 的优秀之处——你完全可以不用显式地配置它们。

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

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

(0)
小半的头像小半

相关推荐

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