mybatis 配置文件详解

mybatis 因为其简单易用性,被广泛使用。它既简化了我们对DB curd操作,同时也保留了我们写sql语句的权利(不是自动生成),这样我们就可以基于sql做更多的优化(如加hint)。
下面我们来解析一下mybatis的配置文件

<?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">
<configuration>

  <properties resource="application.properties">
    <property name="username" value="db_user"/>
    <property name="password" value="verysecurepwd"/>  
  </properties>
  <settings>
  <setting name="cacheEnabled" value="true"/>
</settings>
  <typeAliases>
    <typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor"/>
    <package name="com.mybatis3.domain"/>
  </typeAliases>
  
  <typeHandlers>
    <typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler"/>
    <package name="com.mybatis3.typehandlers"/>
  </typeHandlers>

  <environments default="development">
  <environment id="development">
  <transactionManager type="JDBC"/>
  <dataSource type="POOLED">
  <property name="driver" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.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="com/mybatis3/mappers/StudentMapper.xml"/>
  <mapper url="file:///D:/mybatisdemo/mappers/TutorMapper.xml"/>
  <mapper class="com.mybatis3.mappers.TutorMapper"/>
  </mappers>
    
</configuration>

Environments
我们首先看其中最重要的部分 environments
mybatis支持配置多个数据源,这样可以带来两个好处

  1. 方便我们将程序部署到多个不同的环境上面。我们通常都会有dev环境,QA环境,prod环境等等。 我们将他们都配置到environments里面,当我们在不同环境切换的时候只需要简单的改动到连接到的environment id即可。这里我们默认连接的是development 环境。
  2. 有时候我们的程序需要同时连接多个db. 这种情况下,我们这里配置多个environments, 然后可以根据不同的environment 初始化出来多个sqlSessionFactory 即可。
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
defaultSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
cartSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development");
reportSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"production");

其中第二个参数为我们定义environment时给定的id,如果不提供这个参数则使用 default指定的environment.
dataSource
environment里面最重要的就是datasource了,它定义了我们连接db的各种属性。

<dataSource type="POOLED">
  <property name="driver" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
  </dataSource>

其中, type 定义了数据源获取db连接的方式,它有以下三个取之:

  • UNPOOLED 不使用缓存池,每次查询开启一个新的connection,执行结束后关闭该connection
  • POOLED 使用缓存池,Mybatis 会提前创建一个连接池,每次db操作,从池中取一个空闲连接使用,操作完毕将该连接还回连接池。
  • JNDI 从JNDI数据源获取连接。该方式通常用在生产环境中
    其他参数看名字就很容易理解了,我们不再解释

TransactionManager
environment中另外一个属性是transactionManager, 它有两个取值

  • JDBC application自己管理事务
  • MANAGED application所在的服务器来帮我们管理事务,如weblogic
    下面跳出environments,我们在看看其他配置
    properties
<properties resource="application.properties">
  <property name="jdbc.username" value="db_user"/>
  <property name="jdbc.password" value="verysecurepwd"/>  
</properties>

<dataSource type="POOLED">
  <property name="driver" value="${jdbc.driverClassName}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</dataSource>

properties可以指定一个外部文件作为resource,然后我们可以通过placeholder 读取其中的值。
假如application.properties的value如下

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatisdemo
jdbc.username=root
jdbc.password=admin

则dataSource中的placeholder在运行的时候的值将被application.properties中的值替代
我们也可以指定properties的默认值

TypeAlias

 <typeAliases>
    <typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor"/>
    <package name="com.mybatis3.domain"/>
  </typeAliases>

当我们在sql mapper configuration 文件中指定javabean名字的时候,我们需要给定类的全名(包含package name). 这个时候如果包名很长的话将会显得很冗余。这是我们就可以为其取一个别名(alias) ,来缩短名字长度。
当我们要为某个包下面的多个javabean起别名的时候也可以通过指定<pacakge>的形式来简化。通过这种方式,它将会给com.mybatis3.domain下面的所有类都取一个将类名首字母小写的alias.
在spring中我们也可以以注解@Alias("aliasName")的方式指定,这种方式会覆盖我们在配置文件里面的Alias.

TypeHandler
接下来我们看一个结构和TypeAlias类似的TypeHandler

 <typeHandlers>
    <typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler"/>
    <package name="com.mybatis3.typehandlers"/>
  </typeHandlers>

看它的名字,我们大概也能猜到,它的作用是进行类型转换。
对于java常用的基本数据类型,mybatis已经为我们自动提高了类型转换函数. 而对于一些用户自定义变了,我们则需要自己定义类型转换函数来告诉mybatis如果将它map成oracle数据库数据类型,反之亦然
mybatis提高了一个BaseTypeHandler<?>,我们可以通过继承它来提供我们自己的类型转换类

public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>
{

  @Override
  public void setNonNullParameter(PreparedStatement ps, int i,
      PhoneNumber parameter, JdbcType jdbcType) throws SQLException {
    ps.setString(i, parameter.getAsString());
  }

  @Override
  public PhoneNumber getNullableResult(ResultSet rs, String columnName)
      throws SQLException {
    return new PhoneNumber(rs.getString(columnName));
  }

  @Override
  public PhoneNumber getNullableResult(ResultSet rs, int columnIndex)
      throws SQLException {
    return new PhoneNumber(rs.getString(columnIndex));
  }

  @Override
  public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)
      throws SQLException {
    return new PhoneNumber(cs.getString(columnIndex));
  }
}

Settints
设置一下db的配置参数

<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>

Mappers
指定了存储sql语句和statement id 映射关系的文件路径

<mappers>
  <mapper resource="com/mybatis3/mappers/StudentMapper.xml"/>
  <mapper url="file:///D:/mybatisdemo/app/mappers/TutorMapper.xml"/>
  <mapper class="com.mybatis3.mappers.TutorMapper"/>
  <package name="com.mybatis3.mappers"/>
  </mappers>

其中根据mapper文件所在路径的不同,有四种指定方式

  1. resource 当mapper文件在classpath下面时使用
  2. url 当mapper文件在filesystem 或者 远程server时使用
  3. class 用来指定mapper interface
  4. package 在该目录下面找mapper interface
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容