Mybatis核心知识点总结(一)

一、初识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接口)。

  

  

原文地址:https://www.cnblogs.com/Demrystv/p/9196554.html

时间: 2024-10-09 20:24:37

Mybatis核心知识点总结(一)的相关文章

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

1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过start方法启动线程--->线程变为可运行可执行状态,然后通过数据产生共享,线程产生互斥---->线程状态变为阻塞状态---->阻塞状态想打开的话可以调用notify方法. 这里Java5中提供了封装好的类,可以直接调用然后构造阻塞状态,以保证数据的原子性. 2.如何实现? 主要是实现Blo

Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是CountDownLatch? 倒计时计数器,调用CountDownLatch对象的CountDown()方法就将计数器减一,当计数到达0时,则所有等待者或者全部等待者开始执行. 2.如何用? new CountDownLatch(1); 直接new,其构造函数必须传一个int类型的参数,参数的意思是: c

javascript系列之核心知识点(一)

JavaScript. The core. 1.对象 2.原型链 3.构造函数 4.执行上下文堆栈 5.执行上下文 6.变量对象 7.活动对象 8.作用域链 9.闭包 10.this值 11.总结 这篇文章是"ECMA-262-3 in detail"系列的一个摘要和总结.每一部分包含了对应章节的连接引用,所以你可以仔细去阅读得到一个更深刻的理解.适合的读者:资深程序员,专家.我们从探讨对象的概念开始,这也是ECMAScript的奠基石. 对象 ECMAScript,一个高度抽象的面向

MyBatis核心接口和类

MyBatis核心接口和类 SqlSessionFactoryBuilder: SqlSessionFactoryBuilder负责构建SqlSessionFactory.它的最大特点是:用过即丢.一旦创建了SqlSessionFactory对象之后,这个类就不需要存在了,因此SqlSessionFactoryBuilder的最佳范围就是存在于方法体内,也就是局部变量而已. SqlSessionFactory: SqlSessionFactory简单的理解就是创建SqlSession实例的工厂.

mybatis的知识点

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

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

一.MyBatis配置文件概要 MyBatis核心配置文件在初始化时会被引用,在配置文件中定义了一些参数,当然可以完全不需要配置文件,全部通过编码实现,该配置文件主要是是起到解偶的作用.如第一讲中我们用到conf.xml文件: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN&

Mybatis学习——Mybatis核心配置

MyBatis的核心配置 在使用MyBatis框架时,设计两个核心的d对象:SqlSessionFactory和SqlSession. SqlsessionFactory SqlSessionFactory是单个数据库映射关系经过编译后的内存镜像,其主要作用用来创建SqlSession对象,SqlSessionFactory实例对象是可以通过SqlSessionFactoryBulider对象来构建,而SqlSessionFactoryBulider对象可以通过XML文件或者Configurat

【SpringBoot MQ 系列】RabbitMq 核心知识点小结

[MQ 系列]RabbitMq 核心知识点小结 以下内容,部分取材于官方教程,部分来源网络博主的分享,如有兴趣了解更多详细的知识点,可以在本文最后的文章列表中获取原地址 RabbitMQ 是一个基于 AMQP 协议实现的企业级消息系统,想要顺畅的玩耍的前提是得先了解它,本文将主要介绍 rabbitmq 的一些基本知识点 特点 基本概念 消息投递消费的几种姿势 事务 集群 I. 基本知识点 它是采用 Erlang 语言实现的 AMQP(Advanced Message Queued Protoco

疫情在家10天,总结了一份Java架构师核心知识点PDF

从结束春节假期到今天,已经过去了五天时间,不知道你所在的城市复工了吗?一场突如其来的疫情,打乱了这个春节应有的节奏,也改变了无数人的生活.工作方式. 这几天在家疯狂的整理资料,总结了一份[Java架构师核心知识点PDF],其中的知识点基本可以让从事Java开发1-5年的学习到一些架构师必备的知识点,欢迎大家来找我私信取阅! 关注作者转发文档后私信回复[文档]即可免费获取到! 接下来给大家分享一下这份PDF里面都有哪些知识点 重要部分: 01,Spring原理 Spring AOP ,Spring