XML 映射配置文件(官方结构)

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置(settings)和属性(properties)信息。文档的顶层结构如下:

以上是mybatis官方提供的全局配置文件的结构内容,下面我们来看看如何配置这些属性:

properties属性配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--
  7. 1、mybatis可以使用properties来引入外部properties配置文件的内容;
  8. resource:引入类路径下的资源
  9. url:引入网络路径或者磁盘路径下的资源
  10. 2.通过${属性key}来使用属性值
  11. -->
  12. <properties resource="dbconfig.properties">
  13. <!-- 其他属性,jdbc.url会被外部配置文件中的jdbc.url值覆盖 -->
  14. <property name="jdbc.url" value="jdbc:mysql://47.100.244.76:3306/mybatis01"/>
  15. </properties>
  16.  
  17. <environments default="dev_mysql">
  18. <environment id="dev_mysql">
  19. <transactionManager type="JDBC"></transactionManager>
  20. <dataSource type="POOLED">
  21. <property name="driver" value="${jdbc.driver}" />
  22. <property name="url" value="${jdbc.url}" />
  23. <property name="username" value="${jdbc.username}" />
  24. <property name="password" value="${jdbc.password}" />
  25. </dataSource>
  26. </environment>
  27. <environment id="dev_oracle">
  28. <transactionManager type="JDBC" />
  29. <dataSource type="POOLED">
  30. <property name="driver" value="${orcl.driver}" />
  31. <property name="url" value="${orcl.url}" />
  32. <property name="username" value="${orcl.username}" />
  33. <property name="password" value="${orcl.password}" />
  34. </dataSource>
  35. </environment>
  36. </environments>
  37. </configuration>

如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:

– 在 properties 元素体内指定的属性首先被读取。
– 然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
也就是说:外部引入配置文件中的额属性值优先级比properties 元素体内的高。

settings属性配置

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--
  7. 1、settings包含很多重要的设置项
  8. setting:用来设置每一个设置项
  9. name:设置项名
  10. value:设置项取值
  11. -->
  12. <settings>
  13. <!-- 表字段名称转驼峰命名映射到javabean -->
  14. <setting name="mapUnderscoreToCamelCase" value="true"/>
  15. <!-- 解决Oracle对Null的值解析出错的处理 -->
  16. <setting name="jdbcTypeForNull" value="NULL"/><!-- 默认为OTHER,会使Oracle出错 -->
  17. <!--延迟加载开关,配置所有关联对象是否延迟加载,默认为false -->
  18. <setting name="lazyLoadingEnabled" value="true"/>
  19. <setting name="aggressiveLazyLoading" value="false"/>
  20. <!-- 开启二级缓存,默认为false -->
  21. <setting name="cacheEnabled" value="true"/>
  22. </settings>
  23. </configuration>

typeAliases 类型别名属性配置

给mybatis可以使用到的类型,取一个映射别名,可以用在SQL Mapper映射文件的resultType,parameterType等属性以及其他填写类型的属性值。

1)单个类型配置

  1. <!--
  2. 配置好了以后,以后再sql mapper映射文件中,resultType 就可以使用obj来代表全类名。
  3. -->
  4. <typeAliases>
  5. <typeAlias type="java.lang.Object" alias="obj"/>
  6. </typeAliases>

2) 整包范围配置

  1. <!--
  2. 为某个包下的所有类批量起别名 ,类的别名为,类名首字母小写。
  3. -->
  4. <typeAliases>
  5. <package name="com.atguigu.mybatis.bean"/>
  6. </typeAliases>

3)注解形式 (给实体类中添加注解@Alias("name"))

这种形式优先级最高,其次typeAlias,最后package形式。

示例:

mybatis内建类型别名:

typeHandlers 类型处理器

主要提供给mybatis在预编译时参数设值的时候做参数类型转换处理,以及结果集处理时数据类型转换。自定义的类型转换器需要实现接口org.apache.ibatis.type.TypeHandler。

以下为接口源码:

  1. package org.apache.ibatis.type;
  2. import java.sql.CallableStatement;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6.  
  7. /**
  8. * @author Clinton Begin
  9. */
  10. public interface TypeHandler<T> {
  11.  
  12. void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
  13.  
  14. T getResult(ResultSet rs, String columnName) throws SQLException;
  15.  
  16. T getResult(ResultSet rs, int columnIndex) throws SQLException;
  17.  
  18. T getResult(CallableStatement cs, int columnIndex) throws SQLException;
  19.  
  20. }

StringTypeHandler.java源码:(处理String类型的参数和结果数据)

  1. package org.apache.ibatis.type;
  2. import java.sql.CallableStatement;
  3. import java.sql.PreparedStatement;
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6.  
  7. /**
  8. * @author Clinton Begin
  9. */
  10. public class StringTypeHandler extends BaseTypeHandler<String> {
  11.  
  12. @Override
  13. public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
  14. throws SQLException {
  15. ps.setString(i, parameter);
  16. }
  17.  
  18. @Override
  19. public String getNullableResult(ResultSet rs, String columnName)
  20. throws SQLException {
  21. return rs.getString(columnName);
  22. }
  23.  
  24. @Override
  25. public String getNullableResult(ResultSet rs, int columnIndex)
  26. throws SQLException {
  27. return rs.getString(columnIndex);
  28. }
  29.  
  30. @Override
  31. public String getNullableResult(CallableStatement cs, int columnIndex)
  32. throws SQLException {
  33. return cs.getString(columnIndex);
  34. }
  35. }

1) 单个配置形式:

  1. <typeHandlers>
  2. <typeHandler handler="org.apache.ibatis.type.IntegerTypeHandler" javaType="java.lang.Integer"/>
    </typeHandlers>

2)整包配置形式:

  1. <typeHandlers>
  2. <package name="org.apache.ibatis.type"/>
  3. </typeHandlers>

plugins 插件配置

  插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。后面会有专门的章节我们来介绍mybatis运行原理以及插件

  四大对象:

  1. Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
  2. ParameterHandler (getParameterObject, setParameters)
  3. ResultSetHandler (handleResultSets, handleOutputParameters)
  4. StatementHandler (prepare, parameterize, batch, update, query)

environments 环境

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--
  7. 1、environments:环境们,mybatis可以配置多种环境 ,default指定使用某种环境。可以达到快速切换环境。
  8. environment:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识
  9. transactionManager:事务管理器;
  10. type:事务管理器的类型;JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
  11. 自定义事务管理器:实现TransactionFactory接口.type指定为全类名
  12.  
  13. dataSource:数据源;
  14. type:数据源类型;UNPOOLED(UnpooledDataSourceFactory)
  15. |POOLED(PooledDataSourceFactory)
  16. |JNDI(JndiDataSourceFactory)
  17. 自定义数据源:实现DataSourceFactory接口,type是全类名,定义数据源的获取方式。
  18. -->
  19. <environments default="dev_mysql">
  20. <environment id="dev_mysql">
  21. <transactionManager type="JDBC"></transactionManager>
  22. <dataSource type="POOLED">
  23. <property name="driver" value="${jdbc.driver}" />
  24. <property name="url" value="${jdbc.url}" />
  25. <property name="username" value="${jdbc.username}" />
  26. <property name="password" value="${jdbc.password}" />
  27. </dataSource>
  28. </environment>
  29.  
  30. <environment id="dev_oracle">
  31. <transactionManager type="JDBC" />
  32. <dataSource type="POOLED">
  33. <property name="driver" value="${orcl.driver}" />
  34. <property name="url" value="${orcl.url}" />
  35. <property name="username" value="${orcl.username}" />
  36. <property name="password" value="${orcl.password}" />
  37. </dataSource>
  38. </environment>
  39. </environments>
  40. </configuration>

备注:实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置。

databaseIdProvider 数据库厂商标识配置

  1. <!-- 1、databaseIdProvider:支持多数据库厂商的;
  2. type="DB_VENDOR":VendorDatabaseIdProvider
  3. 作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),mybatis就能根据数据库厂商标识来执行不同的sql;
  4. MySQL,Oracle,SQL Server,xxxx
  5. -->
  6. <databaseIdProvider type="DB_VENDOR">
  7. <!-- 为不同的数据库厂商起别名 -->
  8. <property name="MySQL" value="mysql"/>
  9. <property name="Oracle" value="oracle"/>
  10. <property name="SQL Server" value="sqlserver"/>
  11. </databaseIdProvider>

1)如何使用呢?

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper">
  6. <!--
  7. namespace:名称空间;指定为接口的全类名
  8. id:唯一标识
  9. resultType:返回值类型
  10. #{id}:从传递过来的参数中取出id值
  11. -->
  12. <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee">
  13. select * from tbl_employee where id = #{id}
  14. </select>
  15. <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
  16. databaseId="mysql">
  17. select * from tbl_employee where id = #{id}
  18. </select>
  19. <select id="getEmpById" resultType="com.atguigu.mybatis.bean.Employee"
  20. databaseId="oracle">
  21. select EMPLOYEE_ID id,LAST_NAME lastName,EMAIL email
  22. from employees where EMPLOYEE_ID=#{id}
  23. </select>
  24. </mapper>

在SQL标签中,可以通过databaseId属性来指定数据库来源,只有当前数据库与之匹配时才用这条定制化SQL。SQL方法ID相同的SQL,优先使用指定databaseId的SQL 。

如上,当数据库为mysql时,会使用第二个select sql,当数据库为sql server时,会使用第一个select sql。同时可以在mapper.xml文件中通过_databaseId获取当前数据库的所对应的databaseId值。

mappers 映射器设置

用来注册写好的SQL Mapper映射文件。

1)单个注册方式:

  1. <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
  2. <!-- 1、mappers:将sql映射注册到全局配置中 -->
  3. <mappers>
  4. <!--
  5. mapper:注册一个sql映射
  6. 注册配置文件
  7. resource:引用类路径下的sql映射文件
  8. mybatis/mapper/EmployeeMapper.xml
  9. url:引用网路路径或者磁盘路径下的sql映射文件
  10. file:///var/mappers/AuthorMapper.xml
  11.  
  12. 注册接口
  13. class:引用(注册)接口,
  14. 1、有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
  15. 2、没有sql映射文件,所有的sql都是利用注解写在接口上;
  16. 推荐:
  17. 比较重要的,复杂的Dao接口我们来写sql映射文件
  18. 不重要,简单的Dao接口为了开发快速可以使用注解;
  19. -->
  20. <!-- 注册单个配置文件 -->
  21. <mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
  22. <!-- 注册单个接口 -->
  23. <mapper class="com.atguigu.mybatis.dao.EmployeeMapperAnnotation"/>
  24. </mappers>

2)整包注册方式:

  1. <mappers>
  2. <!-- 批量注册: -->
  3. <!-- 配置文件与包中接口的类路径保持一致 -->
  4. <!--
  5. 简单来说就是默认注册classpath:/com/atguigu/mybatis/dao/下所有xml文件
  6. 和 com.atguigu.mybatis.dao包下的接口注册
  7. -->
  8. <package name="com.atguigu.mybatis.dao"/>
  9. </mappers>

示例:

总结

  1)通过配置文件的方式创建SqlSessionFactory时,会先通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析全局xml配置文件,将解析的结果放到内存org.apache.ibatis.session.Configuration对象,这是一个全局对象,在mybatis整个生命周期都有效的内存对象。

  2)同理,也可以直接创建org.apache.ibatis.session.Configuration对象,再由Configuration来创建SqlSessionFactory对象。

  官方提供的创建SqlSessionFactory的硬编码方式:

  1. //BlogDataSourceFactory为自定义的数据库连接池工厂
  2. DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
  3. TransactionFactory transactionFactory = new JdbcTransactionFactory();
  4. Environment environment = new Environment("development", transactionFactory, dataSource);
  5. //直接创建Configuration 内存全局对象
  6. Configuration configuration = new Configuration(environment);
  7. //硬编码的方式配置Mapper,也可以配置其他属性,不配置时使用mybatis内部默认值
  8. configuration.addMapper(BlogMapper.class);
  9. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

三、MyBatis-全局配置文件的更多相关文章

  1. Spring+SpringMVC+MyBatis深入学习及搭建(三)——MyBatis全局配置文件解析

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6874672.html 前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)——My ...

  2. Mybatis全局配置文件详解(三)

    每个基于Mybatis应用都是以一个SqlSessionFactory实例为中心.SqlSessionFactory实例可以由SqlSessionFactoryBuild获得,而SqlSessionF ...

  3. Mybatis学习(3)关于mybatis全局配置文件SqlMapConfig.xml

    比如针对我这个项目的mybatis全局配置文件SqlMapConfig.xml做一些说明: <?xml version="1.0" encoding="UTF-8& ...

  4. MyBatis 全局配置文件详解(七)

    MyBatis 配置文件作用 MyBatis配置文件包含影响 MyBatis 框架正常使用的功能设置和属性信息.它的作用好比手机里的设置图标,点击这个图标就可以帮助我们查看手机的属性信息和设置功能.其 ...

  5. MyBatis全局配置文件MyBatis-config.xml代码

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  6. MyBatis全局配置文件mybatis-config.xml

    1.在官方下载的mybatis-3.4.5.zip压缩包中,有我们需要的mybatis核心jar包和mybatis的快速入门的pdf文件 在mybatis的快速入门的pdf文件中,复制如下代码到我们项 ...

  7. mybatis全局配置文件

    一.properties:引入外部配置文件 1.resource :引入类路径下的全局配置文件,例如:<properties resource="conf/dbconfig.prope ...

  8. (六)mybatis 全局配置文件讲解

    目录 properties (属性) settings 全局参数配置 typeAliases 别名设置 typeHandlers 类型处理器 mapper (映射器) 细节 properties (属 ...

  9. MyBatis全局配置文件的各项标签3

    mapper 将sql映射注册到全局配置中,这个我们在上一章已经使用过了, resource 这个属性是用来引用类路径下的sql映射文件 url 这个属性是用来引用网络路径或磁盘路径下的sql映射文件 ...

  10. MyBatis全局配置文件标签详解

    一.全局配置文件结构 configuration 配置 properties 属性:可以加载properties配置文件的信息 settings 设置:可以设置mybatis的全局属性 typeAli ...

随机推荐

  1. open 函数处理文件

    open函数用于文件处理 操作文件时,一般需要经历如下步骤:1 打开文件    2  操作文件 f =  open("文件名"     ,  '  打开文件方式'  ) 文件句柄 ...

  2. CruiseControl.NET配置

    CruiseControl.NET简介 CruiseControl.NET是.net平台下,一个开源的自动化持续集成工具. 它是一个程序套件,但其核心是一个叫做CruiseControl.NET Se ...

  3. C++模板声明与实现分开--由此想到的编译,链接原理

    参考了以下两篇文章: C++编译链接原理简介  语言程序编译过程 2 问题来源:当模板文件的实现与声明分开在不同文件中时,链接时会提示找不到相应模板函数,如下 一,编译和链接的大概原理: 1,编译,遍 ...

  4. [转] python关于ctypes使用char指针与bytes相互转换的问题

    最近研究人脸识别,需要用python调用so动态库,涉及到c/c++中的指针字符串转Python的bytes对象的问题. 按照ctypes的文档,直观方式是先创建对应的类型数组,再将指针取地址一一赋值 ...

  5. sh/bash/csh/Tcsh/ksh/pdksh等shell的区别

    w shell confusion..what is diff between bash, ksh, csh, tcsh..??  http://www.linuxquestions.org/ques ...

  6. firefox的group群组功能很好!

    ================================ /usr/share/themes中有一些主题,包括: adwaita: 阿德维塔, 不二论 anaconda等等. 计算机环境: f ...

  7. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_2_集合框架介绍

  8. tensorflow学习笔记二:入门基础 好教程 可用

    http://www.cnblogs.com/denny402/p/5852083.html tensorflow学习笔记二:入门基础   TensorFlow用张量这种数据结构来表示所有的数据.用一 ...

  9. mysql新建表

    CREATE TABLE table( id int(20) not null auto_increment primary key, //auto_increment当为空时自动补全,注意,类型应该 ...

  10. PYTHON2.7之前需要独立安装pip

    如果python2版本是>=2.7.9, python3版本是>=3.4, pip已将一起随python安装成功了. 对于Python 2.6,你需要更旧setuptools.适用于Pyt ...