mybatis-config.xml 配置文件

一、安装mybatis

要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。
如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>x.x.x</version>
</dependency>

二、配置文件

引入约束文件

在mybatis-config.xml 的配置文件中,根据mybatis的版本命名域中需要引入
http://mubatis.org/dtd/mybatis-3-config.dtd” 这样的内容,且引入之后编辑文件,使用ALT + / 会有提示

属性(properties)

引入外部可动态替换的属性,也可以通过properties元素的子元素来传递。

<!--1.url 允许我们使用网络路径的资源或者磁盘资源-->
<properties url="http://www.xxx.com/cad/db.properties"></properties>

<!--2.resource 则允许我们使用类路径下的资源-->
<properties resource="com/zengg/db.properties"></properties>

<!--3.直接配置信息-->
<properties resource="org/mybatis/example/config.properties">
 <property name="username" value="dev_user"/>
 <property name="password" value="F2Fa3!33TYyg"/>
</properties>

完成引入之后,配置文件的其他地方想要使用properties文件中的内容,则使用${key}这样的EL表达式即可。例如:

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

如果一个属性有多次配置,那么Mybatis将按照下面的顺序来加载:

  • 在 properties 元素体内指定的属性首先被读取。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。(有兴趣可以了解sqlSessionFactory)

既然properties的使用是按照EL表达式来做的,那么它同样可以使用到一些EL表达式的用法,例如:

<!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'ut_user' -->
<property name="username" value="${username:ut_user}"/> 

<!-- 如果在key中使用了“:” 或者是因为三元表达式定义了“:” 那么上面的例子中,则需要使用 “?:” 去区分 -->
<!-- key是db:username -->
<property name="username" value="${db:username?:ut_user}"/>
设置(setting)

Setting配置的示例如下:

<settings>
  <!-- 采用驼峰命名 -->
  <setting name="mapUnderscoreToCamelCase" value="true"/>
   <!-- 允许JDBC自动生成主键 -->
  <setting name="useGeneratedKeys" value="true"/>
</settings>

实际上,官网文档中提供了许多我们可以配置的参数:


官方文档
类型别名(typeAliases)

typeAliases 的作用是为了在映射文件中使用这些javaBean的时候能更加简洁

<typeAliases>
  <typeAlias alias="Eemployee" type="com.zengg.Employee"/>
  <typeAlias alias="dept" type="com.zengg.Dept"/>
  <typeAlias alias="role" type="com.zengg.Role"/>
  <typeAlias alias="permission" type="com.zengg.Permission"/>
  <typeAlias alias="section" type="com.zengg.Section"/>
  <typeAlias alias="tag" type="com.zengg.Tag"/>
</typeAliases>

当然这样做有一个明显的弊端,就是每新增一个javaBean的类,就需要在这里新增一条typeAlias的记录,我们可以指定一个包名,这样做的作用是会自动将此包下面的所有javaBean的首字母小写的非限定类名作为别名,比如说com.zengg.EmpDept 的别名就应该是empDept

<typeAliases>
    <package name="com.zengg"/>
</typeAliases>

除此之外还有一种情况,就是此包下的不同文件夹内有两个同名的类,按照规则他们转换的typeAlias的别名会一样。此时我们可以使用一个注解去区分,即

@Alias("author")
public class Author {
   ...
}

最后,mybatis官方还为一些常见的Java类型建立了默认的别名


类型处理器( typeHandler)

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
平时使用最多的类型处理器如jdbcType的Varchar对应了java.lang.String等等

下面是一个官方文档的示例,这个示例介绍了如何自定义一个处理器,并覆盖已经存在的String和Varchar的类型处理器( 要注意 MyBatis 不会通过窥探数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明那是 VARCHAR 类型的字段, 以使其能够绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行时才清楚数据类型。)

@MappedJdbcTypes(JdbcType.VARCHAR)
public class ExampleTypeHandler extends BaseTypeHandler<String> {

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

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

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

  @Override
  public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
    return cs.getString(columnIndex);
  }
}
<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
插件(plugins)

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)
    使用插件的时候需要注意,因为如果插件的作用不仅仅是监听的话,需要改变一些逻辑。可能会影响到底层Mybatis的核心行为。
    以前做过一个拦截器的例子:

环境配置

先上示例

<!-- Mybatis 允许我们配置多种环境-->
<!-- 
     一些具体的配置信息代表的类信息查看在Configuration.class中可以查看 

    environment : 配置一个环境的具体信息
          @ id属性:代表了环境的唯一标识,在最外层environments 的default属性中使用,表示使用哪个环境作为默认环境
          # transactionManager :{
                  @ type : 配置事务管理器的类型  JDBC(JDBCTransactionFactory)或者MANAGED(ManagedTransactionFactory) 两种类型
                  自定义事务管理器:实现TransactionFactory接口,Type直接使用实现类的全类名即可
          # dataSource:{
                   @type 数据源类型n :  可选择JNDI | POOLED | UNPOOLED
                         详情可查看官方文档http://www.mybatis.org/mybatis-3/zh/configuration.html#
                         自定义数据源则实现org.apache.ibatis.datasource.DataSourceFactory接口即可
                  }
                         
          }
 -->
<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC"/>
    <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>

<environment id="product">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="UNPOOLED">
      <property name="driver" value="${driver1}"/>
      <property name="url" value="${url1}"/>
      <property name="username" value="${username1}"/>
      <property name="password" value="${password1}"/>
    </dataSource>
  </environment>
</environments>


数据库厂商标识(databaseIdProvider)

databaseIdProvider的作用就是提供多厂商支持,在配置好不同的厂商后。在mapper.xml文件中,往往一个语句的id表示唯一执行sql,但是不同厂商需要的sql是不一致的。例如mysql和oracle这两种常用的。我们可以使用一下方式来处理

<databaseIdProvider type="DB_VENDOR">
  <property name="SQL Server" value="sqlserver"/>
  <property name="DB2" value="db2"/>
  <property name="Oracle" value="oracle" />
  <property name="MySQL" value="mysql" />
</databaseIdProvider>
<!-- 通过databaseId来区分 -->
<select id="getEmpById" resultType="employee"  databaseId="mysql">
      select * from tb1_employee where id = #{id}
</select>

<select id="getEmpById" resultType="employee"  databaseId="oracle">
      select e.id,e.lastName  from tb1_employee e where id = #{id}
</select>


映射器(mappers)

映射器有一些地方和properties的使用相似,例如resource 也是引入类路径下的资源,url 还是引入磁盘或者网络资源的。

<!-- 1 使用相对于类路径的资源引用(resource) -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>
<!-- 2 使用完全限定资源定位符(URL) -->
<mappers>
  <mapper url="file:///var/mappers/AuthorMapper.xml"/>
</mappers>
<!-- 3 使用类名的方式注册接口(Class)这种注册的方式要求必须让接口和xml文件的位置在同一包路径下 -->
<!-- 当然这并不是要求我们一定非要放在同一个包里,我们可以使用相同路径,将接口和xml文件放在src 和 resources 的两个路径下 -->
<mappers>
  <mapper class="org.mybatis.builder.AuthorMapper"/>
</mappers>

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

推荐阅读更多精彩内容