概述

MyBatis将用户从JDBC的访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以面向对象的方式进行持久层操作。底层数据库连接的获取、数据访问的实现、事务控制等都无须用户关心,从而将应用层从底层的JDBC API中抽取出来,通过配置文件管理JDBC的连接,使用MyBatis解决持久化访问的实现。

MyBatis的体系结构


MyBatis中常用的对象有SqlSessionFactory和SqlSession。

SqlSessionFactory


SqlSessionFactory是MyBatis的关键对象,是单个数据库映射关系经过编译后的内存镜像。该对象的实例通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。

它是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建,建议使用单例模式。SqlSessionFactory是SqlSession的工厂,使用SqlSessionFactory.openSession()方法创建SqlSession对象(前文连接:https://www.jianshu.com/p/063a5ca8874c)。

SqlSession


SqlSession是MyBatis的关键对象,是执行持久化操作的对象,类似于JDBC中的Connection。它是应用程序与持久存储层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。

SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行已经映射的SQL语句。每个线程都应该有自己的SqlSession实例。

SqlSession实例不能被共享,也是线程不安全的,绝对不能将SqlSession实例的引用放在任何类型的管理范围中,应该确保使用完SqlSession之后将它关闭。

SqlSession的方法见如下源码程序:

  1 public interface SqlSession extends Closeable {
2 <T> T selectOne(String var1);
3
4 <T> T selectOne(String var1, Object var2);
5
6 <E> List<E> selectList(String var1);
7
8 <E> List<E> selectList(String var1, Object var2);
9
10 <E> List<E> selectList(String var1, Object var2, RowBounds var3);
11
12 <K, V> Map<K, V> selectMap(String var1, String var2);
13
14 <K, V> Map<K, V> selectMap(String var1, Object var2, String var3);
15
16 <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4);
17
18 <T> Cursor<T> selectCursor(String var1);
19
20 <T> Cursor<T> selectCursor(String var1, Object var2);
21
22 <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3);
23
24 void select(String var1, Object var2, ResultHandler var3);
25
26 void select(String var1, ResultHandler var2);
27
28 void select(String var1, Object var2, RowBounds var3, ResultHandler var4);
29
30 int insert(String var1);
31
32 int insert(String var1, Object var2);
33
34 int update(String var1);
35
36 int update(String var1, Object var2);
37
38 int delete(String var1);
39
40 int delete(String var1, Object var2);
41
42 void commit();
43
44 void commit(boolean var1);
45
46 void rollback();
47
48 void rollback(boolean var1);
49
50 List<BatchResult> flushStatements();
51
52 void close();
53
54 void clearCache();
55
56 Configuration getConfiguration();
57
58 <T> T getMapper(Class<T> var1);
59
60 Connection getConnection();
61 }
62

具体解释,此处不做记录,使用时查询即可。

注意:

实际应用中很少直接使用DriverManager来获取数据库连接,通常使用DataSource来获取数据库连接,SqlSessionFactory底层封装了DataSource。

MyBatis的配置文件


此处回顾前文的test测试类文件代码:

  1 public class Test {
2 public static void main(String[] args) throws IOException {
3 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
4 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
5 SqlSession sqlSession = sqlSessionFactory.openSession();
6 User user = new User("Snow","男",20);
7 sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);
8 sqlSession.commit();
9 sqlSession.close();
10 }
11 }

首先,读取mybatis-config.xml配合文件:

  1 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

然后初始化mybatis,创建SqlSessionFactory的实例:

  1 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

最后获取SqlSession对象,执行SQL语句:

  1 SqlSession sqlSession = sqlSessionFactory.openSession();
2 ...
3 sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);

由此可见,MyBatis的初始化过程要经过以下步骤:

1.调用SqlSessionFactoryBuilder对象的build(inputStream)方法。

2.SqlSessionFactoryBuilder会根据输入流inputStream等信息创建XMLConfigBuilder对象。

3.SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法。

4.XMLConfigBuilder对象解析XML配置文件返回Configuration对象。

5.SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessionFactory对象。

6.SqlSessionFactoryBuilder返回DefaultSessionFactory对象给客户端,供客户端使用。

配置文件属性


MyBatis的配置文件包含了如下结构:

1.properties属性

properties中的属性都是可外部配置且可动态替换的,既可以在典型的Java属性文件中配置,也可以通过properties元素的子元素来传递。

2.settings设置

settings是MyBatis中非常重要的设置,会改变MyBatis的运行时行为,settings元素示例如下:

  1 <settings>
2 <!--指定Mybatis所用日志的具体实现,开启日志-->
3 <setting name="logImpl" value="Log4J"/>
4 <!--开启二级缓存-->
5 <setting name="cacheEnabled" value="true"/>
6 </settings>

其他选项,开发项目时可以按需查询使用,下面列出部分参数:

参数 描述 有效值
cacheEnabled 该配置影响所有映射器缓存的全局开关 true/false
lazyLoadingEnabled 延迟加载的全局开关 true/false
useGenaratedKeys 允许JDBC支持自动生成主键 true/false
logImpl 指定MyBatis所用日志的具体实现,未指定时自动查找 SLF4J/LOG4J/LOG4J2

1.tpyeAliases类型命名

类型别名为Java类型设置一个简短的别名,只和XML配置有关,存在的意义仅在于减少类完全限定名的冗余。

  1 <typeAliases>
2 <typeAlias type="User" alias="com.snow.dcl.domain.User"/>
3 </typeAliases>

这样配置时,User可以用在任何使用com.snow.dcl.domain.User的地方。

  1 <typeAliases>
2 <package name="com.snow.dcl.domain"/>
3 </typeAliases>

这样配置时,每一个在com.snow.dcl.domain包中的Java Bean,在没有注解的情况下,会使用Bean的首字母小写的非限定类名来作为别名,例如:com.snow.dcl.domain.User别名为user。

  1 @Alias("user")
2 public class User {
3 ...
4 }

若有注解,则别名为注解值。

1.typeHandlers类型处理器

无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型。

2.objectFactory对象工厂

MyBatis每次创建结果对象的新实例时,都会使用一个对象工厂实例来完成。

3.plugins插件

4.environments环境
   environment环境变量
   transactionManager事务管理器
   dataSource数据源

MyBatis的环境配置实际就是数据源的配置。MyBatis可以配置多种环境,这种机制使得MyBatis可以将SQL映射应用于多种数据库中。

注意:

尽管可以配置多个环境,但是每个SqlSessionFactory实例只能选择一个环境。所以若想连接两个数据库,需要创建两个SqlSessionFactory实例。

前文配置内容如下:

  1 <!--环境配置,连接的数据库-->
2 <environments default="mysql">
3 <environment id="mysql">
4 <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
5 <transactionManager type="JDBC"></transactionManager>
6 <!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
7 <dataSource type="POOLED">
8 <property name="driver" value="com.mysql.jdbc.Driver"></property>
9 <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8"></property>
10 <property name="username" value="root"></property>
11 <property name="password" value="****"></property>
12 </dataSource>
13 </environment>
14 </environments>

默认的环境ID(default="mysql")。

每个environment元素定义的环境ID(id="mysql")。

事务管理器配置( type="JDBC")。

数据源的配置(type="POOLED")。

环境ID可以随意命名,默认环境ID一定要匹配定义的其中一个环境ID。

1.databaseIDProvider数据库厂商标识

2.mappers映射器

MyBatis开着需要自己写SQL语句,mapper映射器配置告诉MyBatis到哪里去找映射文件,进而找到这些SQL语句:

  1 <mappers>
2 <!--告诉Mybatis持久化类的映射文件路径-->
3 <mapper resource="mapping/UserMapper.xml"></mapper>
4 </mappers>

以上就是对MyBatis的结构和配置文件记录。

MyBatis的结构和配置的更多相关文章

  1. MyBatis—mapper.xml映射配置

    SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用: 1:用于区分不同的mapper,全局唯一. 2:绑定DAO接口,即面 ...

  2. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

  3. Springboot+Mybatis+Pagehelper+Aop动态配置Oracle、Mysql数据源

      本文链接:https://blog.csdn.net/wjy511295494/article/details/78825890 Springboot+Mybatis+Pagehelper+Aop ...

  4. Mybatis的二级缓存配置

    一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的.  Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的 ...

  5. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(七)-- 结构化配置

    本篇将记录.Net Core里颇有特色的结构化配置的使用方法. 相比较之前通过Web.Config或者App.Config配置文件里使用xml节点定义配置内容的方式,.Net Core在配置系统上发生 ...

  6. 【转】MyBatis学习总结(三)——优化MyBatis配置文件中的配置

    [转]MyBatis学习总结(三)——优化MyBatis配置文件中的配置 一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的con ...

  7. Mybatis非mapper代理配置

    转: Mybatis非mapper代理配置 2017年04月26日 20:13:48 待长的小蘑菇 阅读数:870   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  8. node-webkit学习(2)基本结构和配置

    node-webkit学习(2)基本结构和配置 文/玄魂 目录 node webkit学习(2)基本结构和配置 前言 2.1  基本程序结构 2.2  package.json 2.2.1 必须的配置 ...

  9. MyBatis 源码分析——配置信息

    MyBatis框架的启动前期需要加载相关的XML配置信息.从官网上我们可以了解到他具有十几个节点.其中笔者认为比较重要的节点是settings节点.properties节点.environments节 ...

随机推荐

  1. HTML DOM 学习

    HTML DOM 学习 By: Mirror王宇阳 E-mail:2821319009@qq.com 博客主页:https://www.cnblogs.com/wangyuyang1016/ DOM ...

  2. Android 上下文菜单 ContextMenu

    public class MainActivity extends Activity { private ListView listView; @Override protected void onC ...

  3. MySQL MHA /usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted

    在公司随便找3台测试机搭个MHA,下面这个问题折腾了三天,之前没遇到过,查了OS版本发现一致,可能是不同人弄的OS吧,知道是cpan的问题就是搞不定,郁闷...[root@test247 ~]# ma ...

  4. oracle数据库执行sql文件

    使用oracle客户端连接数据库,从oracle官网下载客户端instantclient_18_3工具,到目录下打开cmd命令窗口: 个人网盘客户端工具:https://pan.baidu.com/s ...

  5. linux常用命令补充

    linux补充 apt 是在我们Linux系统安装软件 pip 用来安装python3的模块(第三方库)  ps # 查看运行进程(pid) ps aux # 查看全部任务进程 top # 也可以查看 ...

  6. redlock算法及其问题

    背景 redlock算法是为了解决什么问题呢? 在单redis实例实现分布式锁时,可能会出现线程A设置完锁后,master挂掉,slave提升为master,因为异步复制的特性,线程A设置的锁丢失了, ...

  7. GCC编译警告选项总结

    一 前言 GCC有很多的编译选项,警告选项:指定头文件.库路径:优化选项.本文针整理一下GCC的警告选项,主要依据http://gcc.gnu.org/onlinedocs/gcc/Warning-O ...

  8. 牛客集训 湖南省赛E题 Grid 动态开点线段树

    国庆牛客集训的题,正好准备好好训练线段树,想起来就补一下. 题意很简单,两种操作行合并或者列合并,每个操作后计算有多少个子块. 这题应该先推导公式,行操作或者列操作只有一种的时候,很简单,总数就是n* ...

  9. JDK 安装与环境配置配置——Android开发第一步

    什么是JDK? JDK 即 Java Development Kit,Java开发工具包,用来编译 Java 程序.JRE 在接触JDK的过程中,同时了解到 JRE,JRE 即 Java Runtim ...

  10. Mac-关于升级macOS Catalina后,终端试用问题

    xcrun: error 在终端输入 git clone *****后,提示: xcrun: error: invalid active developer path (/Library/Develo ...