一、初识Mybatis框架

  mybatis是一个持久层的框架,是apache下的顶级项目。
  mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
  mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。
  mybatis可以将向 preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。(输出映射)
 

二、Mybatis框架的原理

  
  Mybatis的核心组件主要有以下几个:
  1)SqlSessionFactoryBuilder(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分步构建的Builder模式。
 
  2)SqlSessionFactory(工厂模式):依靠它来生成SqlSession,使用的是工厂模式。
 
  3)SqlSession(会话):一个既可以发送SQL 执行返回结果,也可以获取Mapper的接口。在现在技术中,一般会让其在业务代码中消失,而是采用Mybatis提供的 SQL Mapper接口编程技术,它能够提高代码的可读性和可维护性。
    在Mybatis中,SqlSession是其核心接口。在Mybatis中有两个实现类,DefaultSqlSession 和 SqlSessionManager。DefaultSqlSession 是单线程使用的,而SqlSessionManager是多线程使用的。SqlSession的作用类似于JDBC 中的Connection对象,代表着一个连接资源的作用。常用的作用主要有三个:获取Mapper接口;发送SQL给数据库;控制数据库事务。
    SqlSession发送SQL给数据库主要有两种方式,一种是SqlSession直接发送,另外一种是通过SqlSession获取Mapper接口再发送。综合比较来看,后者是一种更好的方式。主要是因为使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高可读性,而SqlSession发送SQL,需要一个SQL id去匹配SQL,比较晦涩难懂。使用Mapper接口,类似于roleMapper.getRole(1L),是完全面向对象的语言,更能体现业务的逻辑。此外,使用Mapper.getRole(1L)的方式,编译器会进行错误的校验,这样更能方便查看是否存在错误。
 
  4)SQL Mapper(映射器):它是由一个Java接口和XML 文件(或注解)构成,需要给出相应的SQL 和映射原则。它负责发送SQL去执行,并返回结果。
    映射器是Mybatis中最重要、最复杂的组件,它可以配置以下内容:
   ①描述映射规则;
   ②提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息;
   ③配置缓存;
   ④提供动态SQL
 

三、resultMap元素

  resultMap的作用是定义映射规则、级联的更新、定制类型转化器等。resultMap定义的主要是一个结果集的映射关系,也就是SQL到Java Bean的映射关系的定义,它也支持级联等特性。

  resultMap主要包含的元素有 constructor(配置构造方法)、id(表示哪个键是主键,允许有多个主键构成联合主键)、result(配置POJO到SQL列名的映射关系)、association和collection和discriminator(配置级联问题)。一条SQL语句执行后,就会返回结果,而结果可以使用map存储,也可以使用POJO 进行存储。

  

  级联:

  Mybatis中的级联分为三种:

  ①鉴别器(discriminator):它是一个根据某些条件决定采用具体实现类级联的方案,比如体检表要分性别去区分。

  ②一对一(association):比如学生证和学生就是一对一的关系,雇员和工牌就是一对一的级联。

  ③一对多(collection):比如班主任和学生就是一对多的关系。

  在实际业务中,级联关系更为复杂,可以看下图的分析:

  N+1问题与延迟加载

  假设现在有N 个关联关系完成了级联,那么只要再加入一个关联关系,就变成了N+1个级联,所有的级联SQL都会被执行,这样显然造成了很多资源的浪费,这就是所谓的 N+1问题。为了应对这个问题,Mybatis提供了延迟加载的功能。即一次性地把常用的级联数据通过SQL直接查询出来,而对于那些不常用的级联数据不要取出,而是等待要用时才取出,这些不常用的数据可以采用延迟加载的功能。

  在Mybatis的setting的配置中存在两个元素可以配置级联。

  ①lazyLoadingEnabled是延迟加载的开关。在开启时,所有的关联对象都会被延迟加载。在特定关联关系中,可以通过设置fetchType属性来覆盖该项的开关状态,默认值是false。

  ②aggressiveLazyLoading:当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载,反之,则每种属性按需加载。在版本3.4.1之前默认是true,后面默认是false。

四、Mybatis中的缓存

  在Mybatis中允许使用缓存,缓存一般都放置在可高速读/写的存储器上,比如服务器的内存,它能有效提高系统的性能,因为数据库在大部分场景下时把存储在磁盘上的数据索引出来。

  Mybatis中的缓存可以分为一级缓存和二级缓存。一级缓存是在SqlSession上的缓存,二级缓存是在SqlSessionFactory 上的缓存。默认情况下,即没有任何配置的情况下,Mybatis会默认开启一级缓存,这个缓存不需要POJO 对象可序列化(实现java.io.Serialization接口)。

  

  

Mybatis核心知识点的更多相关文章

  1. javascript中的一些核心知识点以及需要注意的地方

    前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...

  2. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  3. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  4. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  5. mybatis的知识点

    mybatis核心配置文件的配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...

  6. MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

    在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...

  7. MyBatis核心配置文件详解

    ------------------------siwuxie095                                     MyBatis 核心配置文件详解         1.核心 ...

  8. Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  9. 1.2(Mybatis学习笔记)Mybatis核心配置

    一.Mybatis核心对象 1.1SqlSeesionFactory SqlSessionFactory主要作用是创建时SqlSession. SqlSessionFactory可通过SqlSessi ...

随机推荐

  1. 【渗透实战】web渗透实战,手动拿学校站点 得到上万人的信息(漏洞已提交)

    ------------恢复内容开始------------ ’‘’版权tanee转发交流学校请备注漏洞已经提交学校管理员关键过程的截图和脚本代码已经略去.希望大家学习技术和思路就好,切勿进行违法犯罪 ...

  2. codewars--js--vowels counting+js正则相关知识

    问题描述: Return the number (count) of vowels in the given string. We will consider a, e, i, o, and u as ...

  3. 【爬虫】 爬虫请求json数据,返回乱码问题的解决

    from django.http import JsonResponse from rest_framework.utils import json from utils import request ...

  4. C# 多线程之通过Timer开启线程的例子

    本例通过Timer的tick()方法触发TimerCallback委托来开辟新的线程,线程中的具体工作通过一个静态方法作为参数给TimerCallback委托. using System; using ...

  5. Android eclipse环境配置

    需下载软件: JDK eclipse ADT SDK JDK的下载安装: 从官网下载JDK:http://www.oracle.com/: 安装好以后还需要进行jdk的环境配置: eclipse下载安 ...

  6. 怎样将应用程序快捷方式添加到win10开始菜单栏中去

    怎样将应用程序快捷方式添加到win10开始菜单栏中去 找到需要固定的应用程序的安装文件的位置,右键,在弹出的菜单中选择“固定到开始屏幕”即可. 或者是找到需要固定到开始菜单的应用程序的快捷方式,右键, ...

  7. 字节码操作、javassist使用

    一.功能 1.动态生成新的类 2.动态改变某个类的结构(添加.删除.修改   新的属性.方法) 二.优势 1.比反射开销小,性能高 2.JAVAasist性能高于反射,低于ASM 使用javassis ...

  8. 【已解决】pyinstaller UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 110: invalid continuation byte

    转载自勤奋的小青蛙本文链接地址: [已解决]pyinstaller UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in positi ...

  9. 安装Linux系统时LSI RAID卡的驱动挂载

    转载原文地址:https://www.jianshu.com/p/64415712401e 当使用较新的SAS卡来安装Linux系统时,经常会遇到在系统安装界面读不到RAID的情况,这时就需要考虑Li ...

  10. P3983 赛斯石(赛后强化版)

    链接:Miku ------------- 题目描述一脸懵逼 ------------ 这道题本质上是两个完全背包而已.首先,对于每个船,他所能装的最大货物价值是一定的, 我们可以跑完全背包求出每艘船 ...