启动相关的类主要位于session包下。

参照mybatis官方文档,从xml中构建SqlSessionFactory后,可以获取SqlSession,然后使用SqlSession查询数据库得到结果。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
}

SqlSessionFactoryBuilder做为程序的入口,没有提供任何构造方法,所以可以直接使用无参构造。

  public SqlSessionFactory build(Reader reader)

  public SqlSessionFactory build(Reader reader, String environment)

  public SqlSessionFactory build(Reader reader, Properties properties)

  public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
} public SqlSessionFactory build(InputStream inputStream) public SqlSessionFactory build(InputStream inputStream, String environment) public SqlSessionFactory build(InputStream inputStream, Properties properties) public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
} public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}

主要实现了通过reader或者builder来读取并解析配置文件,其中解析配置文件的类为 XMLConfigBuilder(位于builder包下)。生成Cconfiguration类,然后初始化DefaultSqlSessionFactory.

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>
<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>
</environments>
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>

如果你调用了参数有environment的build方法,那么MyBatis将会使用configuration对象一来配置这个environment。当然,如果指定了一个不合法的environment,就会得到错误的提示。如果你调用了不带environment参数的build方法,那么就使用默认的environment(在上南的示命名中指这来devault='develemtn"的代码)。

如果你调用了参数有properties实例的方法,那么MyBatis就会加载那些properties(属性配置文件),并在配置中可用。那些属性可以用${propName}语法多次用在配置文件中。

从3.4.2开始,可以为占位符指定一个默认值,如

<property name="username" value="${username:ut_user}" />

该特性默认是关闭的,需要指定开启:

<properties resource="org/mybatis/example/config.properties">
<!-- ... -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 -->
</properties>

如果一个属性存在于这些位置,那么 MyBatis 将会按照下面的顺序来加载它们:

  • 首先读取在 properties 元素体中指定的属性;
  • 其次,读取从 properties 元素的类路径 resource 或 url 指定的属性,且会覆盖已经指定了的重复属性;
  • 最后,读取作为方法参数传递的属性,且会覆盖已经从 properties 元素体和 resource 或 url 属性中加载了的重复属性。

因此,通过方法参数传递的属性的优先级最高,resource 或 url 指定的属性优先级中等,在 properties 元素体中指定的属性优先级最低。

builder包下的类主要功能是解析mybatis的配置文件。

org.apache.ibatis.builder.xml包下主要有三个builder 都 extend abstract class BaseBuilder:

  • XMLConfigBuilder 主要解析xml配置文件,全局配置
  • XMLMapperBuilder 主要解析mapper xml
  • XMLStatementBuilder

XMLConfigBuilder解析mybatis的配置文件,配置文件的层次如下:

configuration(配置)

最新文章

  1. 转:详解Eclipse断点
  2. /etc/fstab 参数详解及如何设置开机自动挂载
  3. Oracle Ebs R12 SLA与GL关系变化
  4. [stm32] LED
  5. Java的访问控制
  6. kerboros安装
  7. httpclient模拟浏览器訪问站点
  8. 单片微机原理P0:80C51结构原理
  9. mongoDB初接触
  10. Word常用实用知识3
  11. (转发)RequestDispatcher的include()方法和forward()方法的区别
  12. netty 入门(一)
  13. vector作为函数返回值
  14. dos.orm的事务处理
  15. [批处理]使用Log.io监控日志变化
  16. Java之Servlet
  17. python3安装xadmin出现 UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode byte 0xa4 in position 3444: illegal multibyte sequence
  18. javaweb-Excel导入导出后台代码
  19. LDA模型应用实践-希拉里邮件主题分类
  20. ABAP很厉害是怎么一种体验?

热门文章

  1. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
  2. AxMath_V2.5.0.0安装和激活
  3. c++ mfc和win32项目
  4. win10电脑配置
  5. Java语言基础(9)
  6. 51Nod 1714 1位数SG异或打表
  7. python学习笔记-(十三)线程、进程、多线程&amp;多进程
  8. Python——变量的作用域
  9. Linux用户组账号文件——group和gshadow
  10. System.nanoTime与System.currentTimeMillis