当前位置: 首页 > news >正文

Mybatis Java API - SqlSessionFactoryBuilder

在MyBatis中,用于与数据库进行交互的主要Java接口是SqlSession。通过这个接口,您可以执行命令、获取映射器并管理事务。稍后我们将更详细地讨论SqlSession本身,但首先我们必须学习如何获取SqlSession的实例。SqlSession是由SqlSessionFactory实例创建的。SqlSessionFactory包含了各种创建SqlSession实例的方法。SqlSessionFactory本身是由SqlSessionFactoryBuilder创建的,可以从XML、注解或手动编写的Java配置创建SqlSessionFactory。

注意:当使用Spring或Guice等依赖注入框架与MyBatis结合使用时,SqlSession会由DI框架创建和注入,因此您无需使用SqlSessionFactoryBuilder或SqlSessionFactory,可以直接进入到SqlSession部分。请参考MyBatis-Spring或MyBatis-Guice手册以获得更多信息。

SqlSessionFactoryBuilder提供了五种不同的build()方法,每种方法都允许您从不同的来源构建SqlSessionFactory。

SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

前四种方法是最常见的,因为它们接受一个指向XML文档的InputStream实例,或者更具体地说,是上面提到的mybatis-config.xml文件。可选参数是environment和properties。environment确定要加载的环境,包括数据源和事务管理器。例如:

<environments default="development"><environment id="development"><transactionManager type="JDBC">...<dataSource type="POOLED">...</environment><environment id="production"><transactionManager type="MANAGED">...<dataSource type="JNDI">...</environment>
</environments><environments default="development"><environment id="development"><transactionManager type="JDBC">...<dataSource type="POOLED">...</environment><environment id="production"><transactionManager type="MANAGED">...<dataSource type="JNDI">...</environment>
</environments>

如果调用了带有environment参数的build方法,MyBatis将使用该环境的配置。当然,如果指定了一个无效的环境,将会收到错误消息。如果调用不带environment参数的build方法之一,将使用默认环境(在上面的示例中指定为default="development")。

如果调用了接受Properties实例的方法,MyBatis将加载这些属性,并使其在配置中可用。您可以使用${propName}的语法,在配置中使用这些属性替代大多数值。

请记住,属性还可以从mybatis-config.xml文件中引用,或直接在其中指定。因此,了解优先级是非常重要的。我们在本文档中之前提到过它,但为了方便参考,这里再次列出:

如果一个属性在这些位置中的多个地方都存在,MyBatis按以下顺序加载它们。

  • 首先读取在`properties`元素内部指定的属性,
  • 其次读取从`properties`元素的classpath资源或url属性加载的属性,并覆盖任何已经指定的重复属性,
  • 最后读取作为方法参数传递的属性,并覆盖可能从properties体和resource/url属性加载的任何重复属性。

因此,最高优先级的属性是作为方法参数传递的属性,其次是resource/url属性,最后是在properties元素体内指定的属性。

总结一下,前面四种方法在很大程度上是相同的,只是在允许您选择性地指定环境和/或属性时进行了覆盖。下面是从mybatis-config.xml文件构建SqlSessionFactory的示例: 

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

 请注意,我们正在使用 ​Resources​实用类,它位于 ​org.apache.ibatis.io​包中。​Resources​类顾名思义,帮助您从类路径、文件系统甚至网络URL加载资源。快速查看该类的源代码或通过IDE进行检查将揭示其一系列明显有用的方法。以下是一个快速列表:

URL getResourceURL(String resource)
URL getResourceURL(ClassLoader loader, String resource)
InputStream getResourceAsStream(String resource)
InputStream getResourceAsStream(ClassLoader loader, String resource)
Properties getResourceAsProperties(String resource)
Properties getResourceAsProperties(ClassLoader loader, String resource)
Reader getResourceAsReader(String resource)
Reader getResourceAsReader(ClassLoader loader, String resource)
File getResourceAsFile(String resource)
File getResourceAsFile(ClassLoader loader, String resource)
InputStream getUrlAsStream(String urlString)
Reader getUrlAsReader(String urlString)
Properties getUrlAsProperties(String urlString)
Class classForName(String className)

最后一个 ​build()​方法接受一个 ​Configuration​实例作为参数。​Configuration​类包含了关于 ​SqlSessionFactory​实例的所有可能需要了解的内容。​Configuration​类对于内部检查配置非常有用,包括查找和操作SQL映射(不推荐在应用程序接受请求之后进行操作)。​Configuration​类提供了之前学到的每个配置开关,只是以Java API的形式暴露出来。以下是一个简单示例,展示如何手动创建一个 ​Configuration​实例,并将其传递给 ​build()​方法来创建一个 ​SqlSessionFactory​。

DataSource dataSource = BaseDataTest.createBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);
configuration.setLazyLoadingEnabled(true);
configuration.setEnhancementEnabled(true);
configuration.getTypeAliasRegistry().registerAlias(Blog.class);
configuration.getTypeAliasRegistry().registerAlias(Post.class);
configuration.getTypeAliasRegistry().registerAlias(Author.class);
configuration.addMapper(BoundBlogMapper.class);
configuration.addMapper(BoundAuthorMapper.class);SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(configuration);

现在您拥有一个可以用于创建 ​SqlSession​实例的 ​SqlSessionFactory​了。

相关文章:

  • 【ROS2】MOMO的鱼香ROS2(三)ROS2入门篇——ROS2第一个节点
  • SSH 端口转发:如何将服务绑定到本地 IP 地址
  • 观察者模式概述
  • 基于rk3568 Android H265推流SRS低延迟网页播放方案
  • Node.js--》node环境配置及nvm和nvm-desktop安装教程
  • 数字IC设计流程
  • MongoDB 数据类型
  • WPF 消息日志打印帮助类:HandyControl+NLog+彩色控制台打印+全局异常捕捉
  • Matlab仿真2ASK/OOK、2FSK、2PSK、QPSK、4QAM在加性高斯白噪声信道中的误码率与归一化信噪比的关系
  • Python入门学习篇(十四)——模块文件操作
  • java之树筛选
  • 判断电话号码是否重复-excel
  • x-cmd pkg | openssl - 密码学开源工具集
  • 【JavaFX】基于JavaFX11 构建可编辑、对象存储、修改立即保存、支持条件过滤的TableView
  • LeetCode976. Largest Perimeter Triangle
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【知识碎片】第三方登录弹窗效果
  • Angular4 模板式表单用法以及验证
  • emacs初体验
  • gops —— Go 程序诊断分析工具
  • HTML-表单
  • HTTP中的ETag在移动客户端的应用
  • Java 多线程编程之:notify 和 wait 用法
  • Java 最常见的 200+ 面试题:面试必备
  • Joomla 2.x, 3.x useful code cheatsheet
  • js操作时间(持续更新)
  • Linux链接文件
  • PV统计优化设计
  • React as a UI Runtime(五、列表)
  • Redash本地开发环境搭建
  • Terraform入门 - 1. 安装Terraform
  • uva 10370 Above Average
  • vuex 学习笔记 01
  • 翻译--Thinking in React
  • - 概述 - 《设计模式(极简c++版)》
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 机器学习中为什么要做归一化normalization
  • 基于webpack 的 vue 多页架构
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 我与Jetbrains的这些年
  • hi-nginx-1.3.4编译安装
  • Java数据解析之JSON
  • Python 之网络式编程
  • 移动端高清、多屏适配方案
  • #每日一题合集#牛客JZ23-JZ33
  • #数学建模# 线性规划问题的Matlab求解
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (7)svelte 教程: Props(属性)
  • (9)STL算法之逆转旋转
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)球球大作战
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖