Mybatis04:配置解析

本文详细介绍了Mybatis的配置解析,包括核心配置文件SqlMapConfig.xml,环境配置、属性配置、类型别名、设置、其他配置、映射器的配置以及作用域和生命周期。重点讲解了环境配置中的事务管理和连接池,类型别名的使用,以及设置中的缓存、日志和懒加载等关键选项。此外,还提到了映射器的配置方式以及SqlSessionFactory和SqlSession的作用域和生命周期管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4、配置解析

1、核心配置文件

  • 我这里写的叫做:SqlMapConfig.xml,但是标准文档中叫做:mybatis-config.xml

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

  • configuration(配置)
        properties(属性)
        settings(设置)
        typeAliases(类型别名)
        typeHandlers(类型处理器)
        objectFactory(对象工厂)
        plugins(插件)
        environments(环境配置)
    		environment(环境变量)
                transactionManager(事务管理器)
                dataSource(数据源) 连接池
        databaseIdProvider(数据库厂商标识)
        mappers(映射器)
    

    绑定xml映射文件的核心配置文件如下:

    <?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">
    
    <!--mybatis的主配置文件-->
    <configuration>
    
        <!--引入外部的配置文件-->
        <properties resource="db.properties"/>
    
        <!--设置:使用标准的日志工厂-->
        <settings>
            <setting name="logImpl" value="LOG4J"/>
        </settings>
    
        <!--给实体类起一个别名 User或者user-->
        <typeAliases>
            <package name="cn.edu.cxtc.domain"></package>
        </typeAliases>
    
    
        <!--配置环境  这里默认是选择mysql,这只是一个名字,可以配置多个-->
        <environments default="mysql">
            <!--配置mysql的环境-->
            <environment id="mysql">
                <!--配置事物的类型-->
                <transactionManager type="JDBC"></transactionManager>
                <!--配置数据源(连接池)-->
                <dataSource type="POOLED">
                    <!--配置连接数据库的4个基本信息-->
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
        <mappers>
            <!--指定配置文件的位置-->
            <mapper resource="cn/edu/cxtc/dao/UserMapper.xml"></mapper>
        </mappers>
    </configuration>
    

2、环境配置(environment)

Mybatis可以配置成适应多种环境

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

学会用配置多套运行环境!!

Mybatis默认的事务管理器就是JDBC,连接池:POOLED

3、属性(properties)

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

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

  1. 在resources中编写一个properties配置文件

db.properties

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatisdb
username = root
password = root
  1. 在核心配置文件中引入db.properties:在写properties标签时要按照顺序写

  2. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBvi5sWw-1590794861058)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525155236099.png)]

  3. <!--引入外部的配置文件-->
    <properties resource="db.properties"/>
    
  4. 在environment中引入DataSource数据源

  5. <dataSource type="POOLED">
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
    
  6. :就相当于我将要连接的信息写到了外部的properties配置文件中,不用在mybatis-config.xml主配置文件中写,直接引入配置文件就行了,和之前的相似。

4、类型别名(typeAliases)

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

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

  • **简言之:**在dao的映射配置文件中,resultType是方法的返回值类型,但是cn.edu.cxtc.domain.User太冗余,给他起个名字。

  • 方法一:直接给实体类起别名:

    <!--给实体类起一个别名-->
    <typeAliases>
        <typeAlias type="cn.edu.cxtc.domain.User" alias="User"></typeAlias>
    </typeAliases>
    
  • 方法二:也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean

    • 每一个在包 cn.edu.cxtc.domain 中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写或者大写的非限定类名来作为它的别名 -->推荐使用小写,但是我使用大写 --> User或者user都可以
    <typeAliases>        
        <package name="cn.edu.cxtc.domain"></package>
    </typeAliases>
    

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

    如果实体类十分多,建议使用第二种

    第一种可以DIY别名(自定义取名字),第二种不行,必须是实体的名字首字母大写或者小写

  • 方法三:可以在domain下的实体类中加一个注解:@Alias(“别名”)

    • @Alias这个包是在Mybatis下的
    • 使用注解定义了别名,在别处使用的时候就可以使用别名
  • 建议三种方法不要混合使用

  • 去官网查看Mybatis默认的一些类型别名

5、设置(settings)

设置是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为 =>查看帮助文档

  • 官网

  • 缓存开启和关闭

  • 懒加载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qzRh3ynm-1590794861062)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525163105798.png)]

  • 日志实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ttQ1gfYz-1590794861072)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525163143211.png)]

6、其他配置

  • 对象工厂(objectFactory)

  • 类型处理器(typeHandlers)

  • 插件(plugins)

    • mybatis-generator-core
    • Mybatis-plus
    • 通用mapper

7、映射器(mappers)

我们需要告诉 MyBatis 到哪里去找到这些SQL语句。所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。

这些配置会告诉 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了

方式一:使用相对于类路径的资源引用 -->推荐

<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
    <!--指定配置文件的位置-->
    <mapper resource="cn/edu/cxtc/dao/UserMapper.xml"></mapper>
</mappers>

方式二:使用映射器接口实现类的完全限定类名

<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
  <mapper class="cn.edu.cxtc.dao.UserDao"/>
</mappers>

方式三:将包内的映射器接口实现全部注册为映射器

只要指定了包,这个包下面的所有dao接口的配置文件都能够被指定

<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
  <package name="cn.edu.cxtc.dao"/>
</mappers>

**注:**使用方法二和方法三时:

* 接口和他的Mapper配置文件必须同名
* Mapper配置文件的包结构目录必须和dao接口的包目录相同,并且分级

8、作用域(Scope)和生命周期

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciuSkT6J-1590794861082)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525190930584.png)]

SqlSessionFactoryBuilder

* 一旦创建了SqlSessionFactory,就不在需要它了
* 所以SqlSessionFactoryBuilder是一个局部变量

SqlSessionFactory

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

SqlSession

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值