Mybatis超容易理解!!

Mybatis是一个持久化框架,基于JDBC但对其进行封装,提供更便捷的对象操作数据库方式。它通过配置文件或注解将SQL与Java接口绑定,支持动态SQL。Mybatis有Simple、Reuse、Batch三种Executor执行器,其中Batch执行器适用于批量操作。Mybatis的缓存分为一级和二级,一级缓存默认开启,作用于SqlSession,二级缓存可配置开启,作用于SqlSessionFactory。此外,Mybatis支持延迟加载、分页和插件机制,实现灵活的数据库交互。
摘要由CSDN通过智能技术生成

mybatis 含义

:mybatis是一个用来将java数据持久化到数据库的,因为java是运行在jvm中的,一断电,数据就会丢失。所以要进行持久化操作(持久化,意思是将数据写在一些磁盘文件之中,例如文件,数据库。)而mybatis就是做这件事情!但是mybatis不是直接对java数据进行操作的!!!其实java开发商,为了可以进行java数据的持久化,开辟了一个模块叫JDBC,这个模块上层对java编程折(java程序员,给程序员们提供一些操作接口,供程序员进行调用,持久化的目标。下层对应数据库厂商,例如mysql,Oracle,等。**可以说JDBC是java编程语言和数据库的唯一连接!**因为JDBC是java开发者提出来的,对java程序员来说属于比较原生的操作api,所以有一些大牛就对JDBC进行了包装,,封装了一些模板,只对Java程序员暴漏出一些符合java编程的接口。可以说mybaitis底层依旧是JDBC。

原生的JDBC的弊端

  1. 频繁创建数据库连接对象,释放,造成了系统资源的浪费。因为数据库连接对象属于第三方的资源,JVM无法进行垃圾管理,需要自己手动进行释放。对此诞生了数据库连接池(连接对象的池化技术)的概念,,但是原生的JDBC是需要自己手动实现数据库连接池的!!
  2. sql语句的定义,参数的使用,结果集处理的难度很大。实际项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布
  3. 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
  4. 结果集处理存在重复代码,处理麻烦。如果可以映射成Java对象会比较方便
    orm(对象关系的映射)框架的诞生
    由于调用原生的JDBC对数据的操作比较难度大,不太友好,,所以诞生了一些以对象为思想的持久化框架,例如全映射的hibernate和半映射的mybatis。我们可以以对象的思想去操作数据库,从思想上解放了。。所谓的全还是半映射是根据映射的程度来说的,全映射是指已经在对象的思想在,连同一些对象的基本的增删改查的sql语句都写好,用起来更加快速和方便,但是正是因为对单表的增删改查的sql都写好了,导致全映射的框架的灵活度不够高。而半映射框架依旧是以对象的思想操作数据库,但是没有事先写好sql语句,在使用的时候需要自己去实现sql语句,增加了工作量,但是可以根据自己的需求去编写sql语句,可以对sql语句进行一些优化。所以半映射的框架更加的灵活!!

Mybatis的解析和运行原理

mybatis的工作原理

  1. 读取Mybatis配置文件mybatis-config.xml作为全局的配置,其实会产生一个configuration对象,这个对象可以用来获得SqlsessionFactoryBuilder。当然也可以通过注解的方法代替xml文件的配置
  2. 读取mapper.xml文件,就是sql映射文件,会在mybatis-config的配置文件中配置mapper.xml的资源位置。在mybatis-config.xml的文件中可以配置多个mapper.xml文件。每个映射文件对应着一张表。
  3. 构建sqlsessionFactory会话工厂。通过configuration全局对象中获取的sqlsessionfactorybuilder获取sqlsessionFactory对象,通常是单例,相当于一个工具类,主要是用来获取sqlsession。
  4. 创建sqlsession对象,相当于JDBC中的connection对象。其实这个对象可以执行sql语句,但是由于版本的迭代,将sql的执行放在了mapper之中。
  5. Executor执行器:Mybatis底层定义的一个Executor接口用来操作数据库,它根据session传递的参数动态地生成sql语句,同时负责参数缓存的维护。
  6. MappedStatement对象:在Executor接口的执行方法中,有一个MappedStatement 类型的参数,这个参数是对映射信息的封装,用于存储sql语句的id参数等信息。
  7. 输入参数映射:输入的参数类型可以是map,list等集合类型,也可以是基本数据类型。输入参数映射的过程类似于JDBC对preparedStatement对象设置参数的过程。
  8. 输出结果映射:输出结果类型可以是Map,list等集类型,也可以是基本数据类型。输出结果的映射过程类似于jdbc对结果集的解析过程。

Mybatis都有那些executor执行器?他们之间的区别?

Mybatis有三种基本的Executor执行器,simlpeExecutor。reuseExecutor,BatchExecutor三种执行器
simpleExecutor:每执行一次update或者 是select,就开启一个statement对象,用完立刻销毁对象。
reuseExecutor: 执行update或者select,以sql作为key查找statement对象,存在就使用,不存在就创建,用完之后,不会立刻销毁对象,而是将其放入Map<string,Statement>中,等待检索。
batchExecutor:执行update(没有select,jdbc批处理不支持select),将有sql都添加到批处理中(addBatch)
等待统一执行(executeBatch()),它缓存了多个satement对象,每个statement对象都是addBatch()完毕后,等待逐一执行executorBatch()批处理
作用范围:Executor的这些特点,都严格限制在SqlSession生命周期范围内

Mybatis中如何指定使用哪一种Executor执行器?

在Mybatis配置文件中,在设置(settings)可以指定默认的ExecutorType执行器类型,也可以手动给DefaultSqlSessionFactory的创建SqlSession的方法传递ExecutorType类型参数,如SqlSession openSession(ExecutorType execType)。

MyBatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,,分别是一对一和一对多的查询。在Mybatis配置文件中可以配置是否启用延迟加载lazyLoadingEnabled=true|false。

它的原理是,使用CGLIB创建目标对象大的代理对象,当调用目标方法是,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询关联B对象的sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。这就是延迟加载的基本原理。

Mapper映射器

#{}和${}的区别

  • #{}是占位符,预编译处理;${}是拼接符,字符串直接拼接,没有预编译处理
  • Mybatis在处理#{}时,#{}传入参数时以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。
  • Mybatis在处理${}时。是原值传入,就是把{}替换成变量的值,相当于JDBC中的statement处理
  • 变量替换后,#{}对应的变量自动加上单引号‘’;变量替换之后,${}的对应的变量是不会添加单引号的
  • #{}可以有效的防止sql注入,提高系统安全性;${}不能防止sql注入

Mapper中如何传递多个参数

方法1:顺序传参法:直接根据dao接口的方法的参数,和mapper中的sql语句参数按顺序一一对应

public User selectUser(String name, int deptId);

<select id="selectUser" resultMap="UserResultMap">
    select * from user
    where user_name = #{
   0} and dept_id = #
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值