MyBatis配置详解

我在上一篇博客中介绍了mybatis最简单的使用方式,为的是让初学者快速入门,接下来的几篇博客,会对mybatis进行更加详细地介绍。本篇来详细介绍mybatis的配置。

配置文件模板

下面是一个比较完整的mybatis配置文件



<configuration>
    <properties resource="application.properties">
        <property name="password" value="errorpassword" />
    properties>
    <settings>
        <setting name="cacheEnabled" value="true" />
    settings>
    <typeAliases>
        <typeAlias type="blog.zdk.mybatis.mybatis_beginning_demo.Student" alias="Student"/>
        <package name="blog.zdk.mybatis.mybatis_beginning_demo" />
    typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="${url}" />
                <property name="username" value="${username}" />
                <property name="password" value="${password}" />
            dataSource>
        environment>
        <environment id="production">
            <transactionManager type="MANAGED" />
            <dataSource type="JNDI">
                <property name="data_source" value="java:comp/jdbc/MyBatisDemoDS" />
            dataSource>
        environment>
    environments>
    <mappers>
        <mapper resource="mappers/StudentMapper.xml" />
        
        
        <package name="mappers" />
    mappers>
configuration>

这个配置文件中包含了properties、settings、typeAliases、environments和mappers这些常用的元素,请注意,这几个元素的先后顺序是不能调换的。

mybatis配置文件是用来创建SqlSessionFactory类的,每次与数据库交互,都需要一个SQLSession类,这个类是由SqlSessionFactory工厂创建的。以上是mybatis文件的用途。接下来,我们来逐个了解mybatis配置文件中的元素。

properties

对于Java程序员来说,properties的概念大家都不陌生,在maven配置文件和spring配置文件中都有这个概念。简单来说,properties的作用就是,将一个值定义在一个特定的地方(配置文件内部中的properties的子节点,或一个外部文件),在配置文件中,可以通过占位符来引用这个值。并不是每一个值都需要这么处理,一般用于一些多次重复使用的或比较容易发生变化的值。

<properties resource="application.properties">
    <property name="password" value="errorpassword" />
properties>

上面的代码中,properties的resource属性指定了一个外部文件,在这个文件中可以定义一些被重复使用的或经常发生变化的值,以键值对的形式出现,下面是application.properties文件的内容

url=jdbc:mysql://localhost:3306/test
username=root
password=root

properties属性的子节点中也可以定义一些属性值。如果properties属性的子节点和resource指定的外部文件中包含相同的key,则以外部文件中定义的值为准,properties属性的子节点中的值将会被覆盖。在本例中,properties属性的子节点中定义的password将会被覆盖。

如何使用这些键值对呢?

"POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />

如上述代码,在其他地方可以这样通过key来使用对应的值。dataSource的相关介绍见下文。

settings

在settings中可以根据需要来修改mybatis的默认设置,下面是所有mybatis的设置项以及默认值,程序员可以按需修改

<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="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25000"/>
    <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>

typeAliases

这个和Java中的import有几分相似。我们在mapper配置文件中会定义一些增删改查的元素,每个元素都可能会定义参数类型和返回值类型,类型的名字一般包含长长的包名,如果每次使用这些类型都要使用完整的包名,那是很痛苦的(如果某个包名被修改了将更痛苦),为了解决这个问题,我们可以通过typeAliases节点来预先定义一些类的别名,如:

<typeAlias type="blog.zdk.mybatis.mybatis_beginning_demo.Student" alias="Student"/>

我们这样定义以后,在mapper配置文件中,使用Student就可以代指blog.zdk.mybatis.mybatis_beginning_demo.Student,而不需要每次都使用blog.zdk.mybatis.mybatis_beginning_demo.Student这一长串名字。如果你还不知道mapper配置文件是什么东东,请先阅读开始使用mybatis

在大型项目中,需要这么定义的类很多,并且会慢慢增加。为了让编写mapper配置文件的同事(也可能是你自己)无忧无虑地编写代码而不需考虑包名的问题,我们可以直接引入整个包,类似于这样

<package name="blog.zdk.mybatis.mybatis_beginning_demo" />

定义一个包名后,如果这个包下又新增了一个Teacher类,那么,在mapper配置文件中可以直接使用Teacher来代替blog.zdk.mybatis.mybatis_beginning_demo.Teacher

我之所以认为typeAliases跟Java的import比较相似,是因为我们可以通过import java.io.InputStream来引入这一个类,也可以通过import java.io.*来引入整个包。

environments

我们可以在environments中定义数据源和事务管理器对象。environments的意思是环境,我们编写的代码可能会跑在不同的环境中,我们可以在environments中定义多个environment环境,每个environment元素都有一个id属性,我们可以通过将environments节点的default属性修改为某个environment节点的id值来快速切换环境。

environment包含两个属性,分别是transactionManager和dataSource。

transactionManager

transactionManager的type属性支持两个值,JDBC和MANAGED。

  • JDBC:由应用程序自己来处理事务相关的事情,如rollback,commit等
  • MANAGED:将事务相关的事情交给容器来处理

dataSource

dataSource节点是用来配置数据库连接字符串的参数的。它的type属性支持三个值,分别是UNPOOLED,POOLED,JNDI。

  • UNPOOLED:mybatis将对每次请求都重新建立一个连接,请求结束后关闭连接。适用于请求较少的小型应用。
  • POOLED:mybatis将建立一个连接池(pool),每次请求都从连接池中获取连接,请求结束后,将这个连接放回连接池中,可以被下次请求继续使用。
  • JNDI:mybatis将从JNDI数据源中获取连接字符串,JNDI数据源定义在web容器的节点中。较多用于生产环境。

在web容器中,可以这样来定义一个JNDI数据源

 <database>
 <jndi-name>jdbc/slave_1</jndi-name>
     <driver type="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
        <url>jdbc:mysql://localhost:3306/test
        <user>root</user>
        <password>root</password>
     </driver>
   <prepared-statement-cache-size>8</prepared-statement-cache-size>
   <max-connections>20</max-connections>
   <max-idle-time>30s</max-idle-time>
   <connection-wait-time>30s</connection-wait-time>
   <transaction-timeout>30s</transaction-timeout>
</database>

mappers

mappers的子节点定义了mapper配置文件的位置。我们可以依次定义每一个配置文件的位置,也可以像typeAliases那样通过定义一个package来指向这个包下的所有XML文件。

<mappers>
    <mapper resource="mappers/StudentMapper.xml" />
    
    <package name="mappers" />
mappers>

你可能感兴趣的:(mybatis)