我在上一篇博客中介绍了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配置文件中的元素。
对于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中可以根据需要来修改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>
这个和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中定义多个environment环境,每个environment元素都有一个id属性,我们可以通过将environments节点的default属性修改为某个environment节点的id值来快速切换环境。
environment包含两个属性,分别是transactionManager和dataSource。
transactionManager的type属性支持两个值,JDBC和MANAGED。
dataSource节点是用来配置数据库连接字符串的参数的。它的type属性支持三个值,分别是UNPOOLED,POOLED,JNDI。
节点中。较多用于生产环境。在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的子节点定义了mapper配置文件的位置。我们可以依次定义每一个配置文件的位置,也可以像typeAliases那样通过定义一个package来指向这个包下的所有XML文件。
<mappers>
<mapper resource="mappers/StudentMapper.xml" />
<package name="mappers" />
mappers>