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映射文件里。