mybatis配置文件详解

3次阅读

共计 15543 个字符,预计需要花费 39 分钟才能阅读完成。

MyBatis 最关键的组成部分是 SqlSessionFactory,我们可以从中获取 SqlSession,并执行映射的 SQL 语句。
SqlSessionFactory 对象可以通过基于 XML 的配置信息或者 JavaAPI 创建。

1. 使用 xml 配置 Mybatis

构建 SqlSessionFactory 最常见的方式是基于 XML 配置。myBatis 的配置文件一般命名为 mybatis-config.xml,
下面的 mybatis-config.xml 展示了一个典型的 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="Student" type="com.briup.pojo.Student" /> 
        <package name="com.briup.pojo" /> 
      </typeAliases> 
    
      <typeHandlers> 
        <typeHandler handler="com.mybatis3.typehandlers.PhoneTypeHandler" /> 
        <package name="com.briup.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/briup/mappers/StudentMapper.xml" /> 
        <mapper url="file:///D:/mybatisdemo/mappers/StudentMapper.xml" /> 
        <mapper class="com.briup.mappers.StudentMapper" /> 
      </mappers> 
    </configuration> 

1.1 myBatis 配置文件中的元素

environments 元素

environments 是配置 mybatis 当前工作的数据库环境的地方

MyBatis 支持配置多个 dataSource 环境,可以将应用部署到不同的环境上,
比如:DEV(开发环境)、TEST(测试环境)、QA(质量评估环境)、UAT(用户验收环境)、PRODUCTION(生产环境),
不同的环境可能使用的数据库环境不都一样。这时候,我们可以通过将默认 environments 值(default 属性)设置成想要的 environment 的 id 值。

有时候,我们可能需要在相同的应用下使用多个数据库,
比如:我们可能用一个 shoppingcart 数据库来存储所有的订单明细,在使用一个 reports 数据库存储订单明细的合计,用作报告。(也就是如果系统在运行期间如果有切换数据库环境的需求,mybatis 中也可以很轻松的实现)。

如果你的应用需要连接多个数据库,你需要将每个数据库配置成独立的环境,并且为每一个数据库创建一个 SqlSessionFactory

例如,现有 mybatis-config.xml 文件中,配置有两个数据库信息,:

    <environments default="shoppingcart"> 
          <environment id="shoppingcart"> 
            <transactionManager type="MANAGED" /> 
            <dataSource type="JNDI"> 
              <property name="data_source" value="java:comp/jdbc/ShoppingcartDS" /> 
            </dataSource> 
          </environment> 
          <environment id="reports"> 
            <transaction Managertype="MANAGED" /> 
            <dataSource type="JNDI"> 
              <property name="data_source" value="java:comp/jdbc/ReportsDS" /> 
            </dataSource> 
          </environment> 
        </environments> 

我们可以为以上每个环境创建一个 SqlSessionFactory, java 代码:

    inputStream = Resources.getResourceAsStream("mybatis-config.xml"); 
    // 默认的环境
    defaultSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    // 统计明细的环境
    cartSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "shoppingcart"); 

    // 统计报表的环境
    reportSqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "reports");    

注意:对于 environments,我们可以在其中配置多个 environment 子元素,同时还需要在 environment 中配置 dataSource 和 transactionManager 元素。

dataSource 元素

dataSource 表示的是数据源,至少会包括该连接数据库的各种信息

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

dataSource 的类型 type 属性可以配置成其内置类型之一,如:UNPOOLED,POOLED,JNDI。

UNPOOLED:MyBatis 会为每一个数据库操作创建一个新的连接,使用完了并关闭它,该方式适用于只有小规模数量并发用户的简单应用程序上。POOLED:MyBatis 会创建一个数据库连接池,连接池中的一个连接将会被用作数据库操作。一旦数据库操作完成,MyBatis 会将此连接返回给连接池。JNDI(Java Naming and Directory Interface,Java 命名和目录接口,是 SUN 公司提供的一种标准的 Java 命名系统接口)MyBatis 从在应用服务器向配置好的 JNDI 数据源 dataSource 获取数据库连接。

transactionManager 元素:事务管理器

MyBatis 支持两种类型的事务管理器:JDBC 和 MANAGED.

JDBC 事务管理器 ,是在【jdbc 程序】负责管理数据库连接的生命周期(提交、回退等等)的时候。如果将 TransactionManager 属性设置成 JDBC,MyBatis 内部将使用 JdbcTransactionFactory 类创建 TransactionManager。
例如,部署到 ApacheTomcat 的应用程序,需要应用程序自己管理事务。因为 ApacheTomcat 不会帮我们管理事务。

MANAGED 事务管理器 ,是在【应用服务器】负责管理数据库连接生命周期的时候。如果将 TransactionManager 属性设置成 MANAGED 时,MyBatis 内部使用 ManagedTransactionFactory 类创建事务管理器 TransactionManager。
例如,当一个 Java EE 的应用程序部署在类似 JBoss,WebLogic,GlassFish 应用服务器上时,它们会使用 EJB 进行应用服务器的事务管理能力。在这些管理环境中,你可以使用 MANAGED 事务管理器。

注:Managed 是托管的意思,即我们编写的应用程序本身不去管理事务,而是把事务管理交给应用所在的服务器进行管理。

简单记忆:如果设置为 JDBC,则需要程序员自己设置事务提交,如果设置为 MANAGED,则会将事务提交委托给 web 容器,web 容器会帮我们事务提交。(不过这要看 web 容器是否支持,比如,Tomcat 不能帮我们手动提交,所以在使用 Tomcat 的时候,只能设置为 JDBC)

properties 元素

属性配置元素 properties 可以将配置值写死到 mybatis-config.xml 中,
也可以具体到一个属性文件中,并且使用属性文件的 key 名作为占位符。

在上述的配置中,我们将数据库连接属性配置到了 application.properties 文件中,
并且为 driver,URL 等属性使用了占位符.

在 applications.properties 文件中配置数据库连接参数,如下所示:

    jdbc.driverClassName=oracle.jdbc.driver.OracleDriver 
    jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
    jdbc.username=briup 
    jdbc.password=briup

在 mybatis-config.xml 文件中,为属性使用 application.properties 文件中定义的占位符:

    <!-- 读取 application.properties 文件中的数据 key-value 的形式 -->
    <properties resource="application.properties">
      <!-- 注意: 是 applications.properties 文件中的值优先级高 -->
      <property name="jdbc.username" value="briup" /> 
      <property name="jdbc.password" value="briup" /> 
    </properties> 
    <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> 
    </environments>  

typeAliases 元素: 类型别名

在 SQLMapper 配置文件中,对于 resultType 和 parameterType 属性值,我们需要使用 JavaBean 的完全限定名。
例如:

    <select id="findStudentById" parameterType="int" resultType="com.briup.pojo.Student"> 
            SELECT STUD_ID AS ID, NAME, EMAIL, DOB  
            FROM STUDENTS WHERE STUD_ID=#{Id} 
    </select> 
    <update id="updateStudent" parameterType="com.briup.pojo.Student"> 
            UPDATE STUDENTS  
            SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}  
            WHERE STUD_ID=#{id} 
    </update> 

注:parameterType 表示,将来调用这个 sql 语句的时候所传的参数的类型,(参数值或者参数对象里面的属性值 用来替换 sql 语句中的占位符)
resultType 表示,将来调用这个 sql 语句的时候所返回的结果的类型(方便 mybatis 给我们自动封装结果集)

这里我们为 resultType 和 parameterType 属性值设置为 Student 类型的完全限定名:com.briup.com.Student

我们可以为完全限定名取一个别名(alias),然后就可以在需要使用完全限定名的地方使用别名,而不是到处使用完全限定名。如果不取别名,会默认按类名去查找

如下例子所示,为完全限定名起一个别名:

    <typeAliases> 
          <typeAlias alias="Student" type="com.briup.pojo.Student" /> 
          <typeAlias alias="Teacher" type="com.briup.pojo.Teacher" /> 
    </typeAliases> 

然后在 SQLMapper 映射文件中,,如下使用 Student 的别名:

    <select id="findStudentById" parameterType="int" resultType="Student"> 
            SELECT STUD_ID AS ID, NAME, EMAIL, DOB  
            FROM STUDENTS WHERE STUD_ID=#{id} 
    </select> 
    <update id="updateStudent" parameterType="Student"> 
            UPDATE STUDENTS  
            SET NAME=#{name}, EMAIL=#{email}, DOB=#{dob}  
            WHERE STUD_ID=#{id} 
    </update> 

我们还可以不用为每一个 JavaBean 单独定义别名,可以为配置出需要取别名的类的所在的包 (package),MyBatis 会自动扫描包内定义的类,然后分别为每个类注册一个小写字母开头的简单类名形式的别名。
如下所示:

 <typeAliases> 
          <package name="com.briup.pojo" /> 
    </typeAliases> 

如果 Student.java 和 Teacher.java 定义在 com.briup.pojo 包中,
则 com.briup.pojo.Student 的别名会被注册为 student,而 com.briup.pojo.Teacher 别名将会被注册为 teacher。

还有另外一种方式为 JavaBeans 起别名,使用注解 @Alias,

  @Alias("stu") 
    public class Student{....} 

@Alias 注解将会覆盖配置文件中的 <typeAliases> 定义。

typeHandlers 元素: 类型处理器

当 MyBatis 将一个 Java 对象作为输入参数执行 INSERT 语句操作时,它会创建一个 PreparedStatement 对象,并且使用 setXXX()方法对占位符设置相应的参数值。这里,XXX 可以是 Int,String,Date 等 Java 对象属性类型的任意一个。
示例如下:

    <insert id="insertStudent" parameterType="Student"> 
        INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB)  
        VALUES(#{stud Id},#{name},#{email},#{dob}) 
    </insert> 

为执行这个语句,MyBatis 将采取以下一系列动作:
1)创建一个有占位符的 PreparedStatement 接口,如下:

 PreparedStatement ps = connection.prepareStatement ("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)"); 

2)检查 Student 对象的属性 studId 的类型,然后使用合适的 setXXX 方法去设置参数值。
这里 studId 是 integer 类型,所以会使用 setInt()方法:

ps.setInt(1,student.getStudId()); 

类似地,对于 name 和 email 属性都是 String 类型 MyBatis 使用 setString()方法设置参数。
至于 dob 属性,MyBatis 会使用 setDate()方法设置 dob 处占位符位置的值。
MyBaits 会将 java.util.Date 类型转换为 java.sql.Timestamp 并设值:

ps.setTimestamp(4, new Timestamp((student.getDob()).getTime())); 

但 MyBatis 是怎么知道对于 Integer 类型属性使用 setInt()和 String 类型属性使用 setString()方法呢?
其实 MyBatis 是通过使用类型处理器 typeHandlers 来决定这么做的。

MyBatis 对于以下的类型使用内建的类型处理器:
所有的 基本数据类型、基本类型的包装类型、byte[]、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚举类型等。
所以当 MyBatis 发现属性的类型属于上述类型,他会使用对应的类型处理器将值设置到 PreparedStatement 中,
同样地,当 SQL 结果集封装成 java 类对象的时候,也有类似的过程。

那如果有一个自定义的类型,怎么存储存储到数据库呢?
示例如下:
假设表 STUDENTS 有一个 PHONE 字段,类型为 VARCHAR2(15),而 Student 类有一个自定义类型属性

java 代码:PhoneNumber 类定义类型的 phoneNumber 属性。

public class PhoneNumber{ 
    private String countryCode; 
    private String stateCode; 
    private String number; 
    public PhoneNumber(){} 

    public PhoneNumber(String countryCode, String stateCode, String number) { 
        this.countryCode = countryCode; 
        this.stateCode = stateCode; 
        this.number = number; 
    } 

    public PhoneNumber(String str){if(str!=null){String[] args = str.split("-");
            this.countryCode =     args[0];
            this.stateCode =     args[1];
            this.number =         args[2];
        }
    }
    public String getAsString() {return countryCode + "-" + stateCode + "-" + number;} 
    // Setters and getters 
    ...
} 
//Student 类中引入 PhoneNumber 对象 
public class Student{ 
    private Integer id; 
    private String name; 
    private String email; 
    private PhoneNumber phone; 
    // Setters and getters 
    ...
} 

StudentMapper.xml 配置:

<insert id="insertStudent" parameterType="Student"> 
    insert into students(name,email,phone) 
    values(#{name},#{email},#{phone}) 
</insert> 

这里,参数对象中的属性 phone 的值需要传递给 #{phone};参数对象的属性 phone 是 PhoneNumber 类型。
此时,MyBatis 并不知道该怎样来处理这个类型的对象。为了让 MyBatis 明白怎样处理这个自定义的 Java 对象类型,如 PhoneNumber,我们可以创建一个自定义的类型处理器。
MyBatis 提供了抽象类 BaseTypeHandler<T>,我们可以继承此类创建自定义类型处理器。

代码如下所示:

public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{

    // 遇到 PhoneNumber 参数的时候应该如何在 ps 中设置值
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter.getAsString());
    }

    // 查询中遇到 PhoneNumber 类型的应该如何封装(使用列名封装)
    @Override
    public PhoneNumber getNullableResult(ResultSet rs, String columnName) 
            throws SQLException {return new PhoneNumber(rs.getString(columnName));
    }

    // 查询中遇到 PhoneNumber 类型的应该如何封装(使用列的下标)
    @Override
    public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) 
            throws SQLException {return new PhoneNumber(rs.getString(columnIndex));
    }

    //CallableStatement 使用中遇到了 PhoneNumber 类型的应该如何封装
    @Override
    public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) 
            throws SQLException {return new PhoneNumber(cs.getString(columnIndex));
    }

}

注意:使用 ps.setString()和 rs.getString()方法是因为在数据库的表中,phone 列是 VARCHAR 类型。

最后,一旦我们实现了自定义的类型处理器,我们需要在 mybatis-config.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> 
    <typeHandlers> 
        <typeHandler handler="com.briup.typehandlers.PhoneTypeHandler" /> 
    </typeHandlers> 
</configuration> 

注册 PhoneTypeHandler 后,MyBatis 就能够将 Phone 类型的对象值存储到 VARCHAR 类型的列上。

settings 元素: 全局参数设置

注意:大多数情况下,【这些参数使用它们的默认值即可】
为满足应用特定的需求,MyBatis 默认的全局参数设置可以被覆盖掉,如下所示:

<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,hash Code ,to String"/> 
    <setting name="proxyFactory" value="JAVASSIST" /> 
    <setting name="aggressiveLazyLoading" value="true" /> 
    <setting name="logImpl" value="LOG4J" /> 
    <setting name="logPrefix" value="LOG4J" /> 
    <setting name="callSettersOnNulls" value="false" /> 
</settings> 
<settings>
    <!-- 这个配置使全局的映射器启用或禁用缓存 -->
    <setting name="cacheEnabled" value="true" />

    <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 -->
    <setting name="lazyLoadingEnabled" value="true" />

    <!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)-->
    <setting name="multipleResultSetsEnabled" value="true" /> 

    <!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 -->
    <setting name="useColumnLabel" value="true" /> 

    <!-- 允许 JDBC 支持生成的键。需要适合的驱动。-->
    <setting name="useGeneratedKeys" value="false" /> 

    <!-- 指定 MyBatis 如何自动映射列到字段 / 属性。PARTIAL 只会自动映射简单、没有嵌套的结果。FULL 会自动映射任意复杂的结果(嵌套的或其他情况)-->
    <setting name="autoMappingBehavior" value="PARTIAL" />

    <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->
    <setting name="defaultExecutorType" value="SIMPLE" /> 

    <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 -->
    <setting name="defaultStatementTimeout" value="25000" /> 

    <!-- 允许在嵌套语句中使用分页(RowBounds)默认 false -->
    <setting name="safeRowBoundsEnabled" value="false" /> 

    <!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。默认 false -->
    <setting name="mapUnderscoreToCamelCase" value="false" /> 

    <!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。-->
    <setting name="localCacheScope" value="SESSION" /> 

    <!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。-->
    <setting name="jdbcTypeForNull" value="OTHER" />

    <!-- 指定对象的哪个方法触发一次延迟加载。-->
    <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode ,toString" /> 

    <!-- CGLIB | JAVASSIST 默认 JAVASSIST(MyBatis 3.3 or above)  -->
    <!-- 指定 Mybatis 创建具有延迟加载能力的对象所用到的代理工具。-->
    <setting name="proxyFactory" value="JAVASSIST" /> 
    <!-- 当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。-->
    <setting name="aggressiveLazyLoading" value="true" /> 

    <!-- 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。-->
    <setting name="logImpl" value="LOG4J" /> 

    <!-- 指定 MyBatis 增加到日志名称的前缀。值可以是任意字符串 -->
    <setting name="logPrefix" value="LOG4J" /> 

    <!-- 指定当结果集中值为 null 的时候是否调用映射对象的 setter(map 对象时为 put)方法,这对于有 Map.keySet() 依赖或 null 值初始化的时候是有用的。注意基本类型(int、boolean 等)是不能设置成 null 的。默认 false-->
    <setting name="callSettersOnNulls" value="false" /> 
</settings> 

mappers 元素: SQL 映射

SQLMapper 文件中主要是对 SQL 语句的映射,表明这个 sql 语句对应哪个方法的调用。
我们需要在 mybatis-config.xml 文件中配置 SQLMapper 文件的位置。

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

以上每一个 <mapper> 标签都可以从不同类型的资源中加载映射 mapper:


resource 属性:用来指定在 classpath 中的 mapper 文件。url 属性:用来通过完全文件系统路径或者 web URL 地址来指向 mapper 文件
class 属性:用来指向一个 mapper 接口
package 属性:用来指向可以找到 Mapper 接口的包名

2. 使用 Java API 配置 MyBatis

(属于了解的内容,因为有了灵活的 xml 配置方法,这个方式几乎不用)

MyBatis 的 SqlSessionFactory 接口除了使用基于 XML 的配置创建外也可以通过 JavaAPI 编程式地被创建。每个在 XML 中配置的元素,都可以编程式的创建。

因为 mybatis 框架在读取了我们配置的 mybatis-config.xml 中配置信息之后,利用这些信息去执行代码创建出我们需要的 SqlSessionFactory,再进一步得到 sqlSession,最后再进行各种数据库操作。所以其实我们完全可以不去配置任何信息直接把信息写在代码中。只是这样做再大多数时候都会降低代码的灵活性,所以我们基本上接触的框架都是有相应的配置文件的.

例如:使用 Java API 创建 SqlSessionFactory 对象:
之前是读取配置文件之后再创建,现在是自己把信息写到代码中,然后再创建该对象

 public static SqlSessionFactory getSqlSessionFactory() { 
    SqlSessionFactory sqlSessionFactory = null; 
    try {DataSource dataSource = DataSourceFactory.getDataSource(); 
        TransactionFactory transactionFactory = new JdbcTransactionFactory(); 
        Environment environment = new Environment("development", transactionFactory, dataSource); 
        Configuration configuration = new Configuration(environment); 

        configuration.getTypeAliasRegistry().registerAlias("student",Student.class); 
        configuration.getTypeHandlerRegistry().register(PhoneNumber.class, PhoneTypeHandler.class);
        configuration.addMapper(StudentMapper.class); 
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 
    } 
    catch (Exception e) {throw new RuntimeException(e); 
    } 
    return sqlSessionFactory; 
} 

类似的,每个在 XML 中配置的元素,都可以编程式的创建.
注:这里就不一一介绍了,因为绝大多数情况下我们还是不会把配置信息直接写到代码中的

3. 自定义 MyBatis 日志(属于了解的内容)

MyBatis 使用其内部 LoggerFactory 作为真正的日志类库使用的门面。其内部的 LaggerFactory 会将日志记录任务委托给如下的所示某一个日志实现,
日志记录优先级由上到下顺序递减:

        SLF4J 
        Apache Commons Logging 
        Log4j2 
        Log4j 
        JDK logging 

注意:查看 org.apache.ibatis.logging.LogFactory 源码可知

如果 MyBatis 未发现上述日志记录实现,则 MyBatis 的日志记录功能无效,如果你的运行环境中,在 classpath 中有多个可用的日志类库,并且你希望 MyBaits 使用某个特定的日志实现,你可以在代码中通过调用以下其中一个方法:

    org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); 
    org.apache.ibatis.logging.LogFactory.useLog4JLogging(); 
    org.apache.ibatis.logging.LogFactory.useLog4J2Logging(); 
    org.apache.ibatis.logging.LogFactory.useJdkLogging(); 
    org.apache.ibatis.logging.LogFactory.useCommonsLogging(); 
    org.apache.ibatis.logging.LogFactory.useStdOutLogging(); 

注: 如果你想自定义 MyBatis 日志记录,你应该在调用任何其它方法之前调用以上的其中一个方法

正文完
 0