MyBatis有两个基本的配置文件,一个用来配置环境信息(mybatis.xml),一个用来写SQL语句(xxMapper.xml)。

mybatis.xml:

<?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="db.properties"/> <!-- 设置一个默认的连接环境信息 -->
<environments default="mysql_developer">
<environment id="mysql_developer">
<!-- mybatis使用jdbc事务管理方式 -->
<transactionManager type="JDBC"></transactionManager>
<!-- mybatis使用连接池方式来获取连接 -->
<dataSource type="POOLED">
<!-- 配置与数据库交互的4个必要属性,不要直接写,单独写在一个配置文件中 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
<!-- 连接环境信息,取一个任意唯一的名字 -->
<environment id="oracle_developer">
<!-- mybatis使用jdbc事务管理方式 -->
<transactionManager type="jdbc"/>
<!-- mybatis使用连接池方式来获取连接 -->
<dataSource type="pooled">
<!-- 配置与数据库交互的4个必要属性 -->
<property name="driver" value="${oracle.driver}"/>
<property name="url" value="${oracle.url}"/>
<property name="username" value="${oracle.username}"/>
<property name="password" value="${oracle.password}"/>
</dataSource>
</environment>
</environments> <!-- 加载映射文件-->
<mappers>
<mapper resource="com/winner/entity/StudentMapper.xml"/>
</mappers> </configuration>

xxMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace可以写类的全限定名,这样做的好处是
  sqlSession.insert(Student.class.getName()+".addStudent");
-->
<mapper namespace="com.winner.entity.StudentMapper">   <!--实体与表的映射,type是类名,但是没有表名,可以理解表名在下面的sql语句中-->
<resultMap id="studentMap" type="com.winner.entity.Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sal" column="sal"/>
</resultMap>
<insert id="addStudent" parameterType="com.winner.entity.Student">
<![CDATA[
INSERT INTO student(id,name,sal) VALUES (#{id},#{name},#{sal})
]]>
</insert>
</mapper>

从配置文件中可以看出,映射关系中并没有致命表的名字,可以这么理解,因为下面的sql语句中有表名,这里就省略了.

下面分析一下sql语句:

<insert id="addStudent" parameterType="com.winner.entity.Student">
<![CDATA[
INSERT INTO student(id,name,sal) VALUES (#{id},#{name},#{sal})
]]>
</insert>

#{id},#{name},#{sal}使用Student的getId(),getName(),getSal()替换.
new Student(1, "zhangsan", 1000d)->getId:1,getName:zhangsan,getSal:1000d
所以上述的sql语句实际上等价于:
INSERT INTO student(id,name,sal) VALUES (1,"zhangsan",1000d)

typeAliases
别名是一个较短的Java 类型的名称,typeAliases是为Java类型命名一个短的名字,它只和XML配置有关,用来减少类完全限定名的多于部分,例如:

<typeAliases>
<typeAlias type="com.winner.entity.Student" alias="Student"/>
</typeAliases>

有了这个配置,"Student"可以任意用来代替"com.winner.entity.Student"所使用的地方。这个设置在mybatis.xml文件中配置.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.winner.entity.StudentMapper">
<resultMap id="studentMap" type="student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="sal" column="sal"/>
</resultMap>
<insert id="addStudent" parameterType="Student">
<![CDATA[
INSERT INTO student(id,name,sal) VALUES (#{id},#{name},#{sal})
]]>
</insert>
</mapper>

environments
  MyBatis能够配置多套运行环境,这有助于将SQL 映射到多个数据库上。例如,在开发、测试、生产环境中,可能有不同的配置。或者可能有多个共享同一schema 的生产用数据库,或者想将相同的SQL映射应用到两个数据库等等许多用例。
  但是请记住:虽然可以配置多个运行环境,但是每个SqlSessionFactory实例只能选择一个运行环境。
  因此,如果想连接两个数据库,就需要创建两个SqlSessionFactory实例,一个数据库对应一个SqlSessionFactory 实例。如果是三个数据库,那就创建三个实例,如此类推。

  每个数据库对应一个SqlSessionFactory实例。要指定哪个运行环境被创建,只需要简单地将运行环境作为可选参数传递给SqlSessionFactoryBuilder,下面是两个接受运行环境的方法

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);

如果环境参数被忽略,那默认的环境配置将被加载,如下面

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties);

environments 元素定义了运行环境是怎么配置的。

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
  <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>
</environments>

注意这里关键的部分:
--默认的运行环境ID,引用一个已经定义好的运行环境ID(例如:default="development")
--每个定义的运行环境ID(例如:id="development")
--事务管理器配置(例如:type="JDBC")
--数据源配置(例如:type="POOLED")

<environments default="test">
  <environment id="development">
  ......
  </environment>
  <environment id="production">
  ......
  </environment>
  <environment id="test">
  ......
  </environment>
</environments>

上面例子中, <environments default="test">配置表明,目前使用的是test的运行环境。
当然,您也可以修改为使用production的运行环境: <environments default="production">

事务管理器
MyBatis有两种事务管理类型(即type=”[JDBC|MANAGED]” ):
--JDBC – 这个配置直接使用JDBC的提交和回滚功能。它依赖于从数据源获得连接来管理事务的生命周期。
--MANAGED – 这个配置基本上什么都不做。它从不提交或者回滚一个连接的事务。而是让容器(例如: Spring或者J2EE应用服务器)来管理事务的生命周期 。默认情况下,它会关闭连接,但是一些容器并不会如此,因此,如果您需要通过关闭连接来停止事务,将
属性closeConnection设置为false。例如:

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

这两个事务管理类型都不需要任何属性。然而它们都是类型别名,换句话说,您可以设置成指向己实现了TransactionFactory接口的完整类名或者别名。

public interface TransactionFactory {
  void setProperties(Properties props);
  Transaction newTransaction(Connection conn, boolean autoCommit);
}

实例化后,任何在XML文件配置的属性都将传递给setProperties()方法。在您的实现中还需要创建一个非常简单的Transaction接口的实现:

public interface Transaction {
  Connection getConnection();
  void commit() throws SQLException;
  void rollback() throws SQLException;
  void close() throws SQLException;
}

通过这两个接口,您能够完全自定义MyBatis如何来处理事务。
dataSource元素
dataSource元素使用标准的JDBC数据源接口来配置JDBC连接对象源。大部分MyBatis应用都像上面例子那样配置一个数据源,但这不是必须的。需要认清的
是,只有使用了延迟加载才需要数据源。MyBatis内置了三种数据源类型.
--UNPOOLED – 这个类型的数据源实现只是在每次需要的时候简单地打开和关闭连接。虽然有点慢,但是对于不需要立即响应的简单的应用来说,不失为一种好的选择。不同的数据库在性能方面也会有所不同,因此对于一些数据库,不使用连接池时,这个配置就是比较理想的。UNPOOLED数据源有四个配置属性:
---driver – 指定JDBC驱动器。
---url – 连接数据库实例的JDBC URL。
---username –登陆数据库的用户名。
---password - 登陆数据库的密码。
---defaultTransactionIsolationLevel – 指定连接的默认事务隔离级别。
另外,您也可以通过在属性前加前缀“ driver” 的方式,把属性传递给数据库驱动器,例如:
---driver.encoding=UTF8
这将会通过DriverManager.getConnection(url, driverProperties) 方法,将值是UTF8”的属性“ encoding”传递给数据库驱动器。
-POOLED – 这个数据源的实现缓存了JDBC连接对象,用于避免每次创建新的数据库连接时都初始化和进行认证,加快程序响应。并发WEB应用通常通过这种做法来获得快速响应。另外,除了上面(UNPOOLED)的属性外,对POOLED数据源,还有很多属性可以设置。
---poolMaximumActiveConnections – 在任何特定的时间内激活(能够被使用)的连接数量,默认是10。
---poolMaximumIdleConnections –在任何特定的时间内空闲的连接数。
---poolMaximumCheckoutTime – 在连接池被强行返回前,一个连接能够“ 检出” 的总时间。默认是20000ms( 20秒)。
---poolTimeToWait – 这是一上比较底层的设置,如果连接占用了很长时间,能够给连接池一个机会去打印日志,并重新尝试连接。默认是20000ms( 20秒)。
---poolPingQuery –Ping Query 是发送给数据库的Ping 信息,测试数据库连接是否良好和是否准备好了接受请求。默认值是“ NO PING QUERY SET” ,让大部分数据库都不使用Ping,返回一个友好的错误信息(译者注: MyBatis通过向数据执行SQL语句来确定与数据库连接状况)。
---poolPingEnabled – 这是允许或者禁ping query 的开关。如果允许,您同时也要用一条可用的(并且应该是最高效的) SQL 语句来设置poolPingQuery 属性的值。默认是:false(即禁止)。
---poolPingConnectionsNotUsedFor – 这个属性配置执行poolPingQuery 的间隔时间。通常设置为与数据库连接的超时时间,来避免不必要的pings 。默认是: 0(允许所有连接随时进行ping 测试,当然只有poolPingEnabled 设置为true 才会生效)。
-JNDI – 这个数据源的配置是为了准备与像Spring 或应用服务器能够在外部或者内部配置数据源的容器一起使用,然后在JNDI 上下文中引用它。这个数据源只需配置两个属性:
---initial_context – 这个属性被用来从InitialContext 中查找一个上下文。如:initialContext.lookup(initial_context)这个属性是可选的,如果忽略,那么数据源就会直接从InitialContext中查找。
---data_source – 这个属性是引用一个能够被找到的数据源实例的上下文路径。它会查找根据initial_context 从 initialContext中搜寻返回的上下文。或者在initial_context 没有提供的情况下直接在InitialContext 中进行查找。
Mappers元素
现在, MyBatis的行为属性都已经在上面的配置元素中配置好了,接下来开始定义映射SQL语句。但首先,我们需要告诉MyBatis在哪里能够找到我们定义的映射SQL语句。在这方面,JAVA自动发现没有提供好的方法,因此最好的方法是告诉MyBatis在哪里能够找到这些映射文件。您可以使用类资源路径或者URL(包括file:/// URLs),例如:

// Using classpath relative resources
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// Using url fully qualified paths
<mappers>
  <mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
  <mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
  <mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>

这些配置告诉MyBatis在哪里找到SQL映射文件。而其它的更详细的信息配置在每一个SQL映射文件里。

MyBatis的两个配置文件的更多相关文章

  1. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  2. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  3. Mybatis学习--XML映射配置文件

    学习笔记,选自Mybatis官方中文文档:http://www.mybatis.org/mybatis-3/zh/configuration.html MyBatis 的配置文件包含了影响 MyBat ...

  4. Mybatis(1、核心配置文件、Properties、Settings、typeAliases...)

    Mybatis(1.核心配置文件.Properties.Settings.typeAliases...) 2017年04月23日 22:52:36 阅读数:1527 此章主要介绍sqlMapConfi ...

  5. SpringBoot从入门到精通二(SpringBoot整合myBatis的两种方式)

    前言 通过上一章的学习,我们已经对SpringBoot有简单的入门,接下来我们深入学习一下SpringBoot,我们知道任何一个网站的数据大多数都是动态的,也就是说数据是从数据库提取出来的,而非静态数 ...

  6. Spring整合SpringMVC + Mybatis基础框架的配置文件

    目录 前言 1. Mybatis层编写 2. Spring层编写 1. Spring整合Mybatis 2. Spring整合service 3. SpringMVC层编写 1. 编写web.xml ...

  7. mybatis中两种取值方式?谈谈Spring框架理解?

    1.mybatis中两种取值方式? 回答:Mybatis中取值方式有几种?各自区别是什么? Mybatis取值方式就是说在Mapper文件中获取service传过来的值的方法,总共有两种方式,通过 $ ...

  8. mybatis 中的 xml 配置文件中 ‘<’、 ‘>’ 处理

    mybatis 中的 xml 配置文件中 '<'. '>' 处理 1.使用转义字符将 '<'. '>' 替换掉. 描述 字符 转义字符 小于号 < < 大于号 &g ...

  9. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

随机推荐

  1. java访问webservice服务(二)

    欢迎转载,出处http://www.cnblogs.com/shizhongtao/p/3433679.html 利用cxf的框架实现 import javax.xml.namespace.QName ...

  2. [GeekBand] STL与泛型编程(1)

    在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...

  3. [android]netd与NetworkManagementService初印象

    [功能]Netd是什么,主要负责什么功能 为什么这次会接触Netd主要是因为在设置防火墙时候碰到了.关于Netd可以干什么可以从Netd的源码中CommandListener中得到答案.按照我的理解, ...

  4. java基础-基础类型包装类型

    想要对基本类型数据进行更多的操作,最方便的方式就是将其封装成对象. 为啥呢?因为在对象描述中就可以定义更多的属性和行为对该基本数据类型进行操作. [八种基本数据类型的包装类] byte --Byte ...

  5. JAVA_SE复习(异常)

    异常.调试和断言 一. 异常的分类 1. 可查异常    例: 2. 不可查异常  例:Runtime Exception 3. 异常的分类结构: 1. 不执行finally 子句的唯一情况是虚拟机关 ...

  6. CentOS-6.5安装配置JDK-7|Tomcat-8

    安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...

  7. Beaglebone Back学习三(开发环境搭建)

    开发环境搭建 1 Ubuntu环境搭建 2 Window环境搭建 3 开发板环境搭建 1 Ubuntu环境搭建 (1)安装必要的网络工具 samba nfs tftp vmware-tools sam ...

  8. c#中sqlhelper类的编写(一)

    在.net平台的项目开发中,凡是用到数据库交互的,都有必要了解SqlHelper类的原理. 步骤一: 我就拿WPF项目开发作为例子.首先要新建一个App.config(应用程序配置文件).注意,在VS ...

  9. iOS开发学习路线图

    很多初学iOS开发的人会经常问:“我想学iOS应该从何入手呢?”.作为一个做了2年多各种iOS开发的程序员,只想写写自己的一些心得体会,好和体验与不好的体验.写的不好,请多包涵.希望能起到抛砖引玉的作 ...

  10. UIImageView加抖动效果(转)

    CGAffineTransform moveRight = CGAffineTransformTranslate(CGAffineTransformIdentity, 20, 0); CGAffine ...