MyBatis框架核心简介

Hibernate和MyBatis的区别?

两者的增删改查,对于业务逻辑层来说大同小异,对于映射层而言H的配置不需要接口和SQL,而M需要.因为H提供好了自动完全映射,同时提供了日志,缓存,级联等特性此外还提供HQL(Hibernate Query Languaue)对POJO操作.但是,正因为无须SQL,当多表关联查询超过3个时候H的级联会很慢.
而M可以解决上面问题,M可以自由书写SQL,支持动态SQL,动态生成表名,支持存储过程.推荐在性能要求高,响应快系统下使用.
M的最大成功点:

  • 不屏蔽SQL,可以更加精确地定位SQL语句,可以方便的对其SQL优化.
  • 提供灵活的映射机制,提供动态SQL功能,可以根据不同条件组装SQL.
  • 提供了使用Mapper的接口编程,只要一个接口和一个XML就能创建映射器,开发者更集中于业务逻辑.

MyBatis的核心组件

  • SqlSessionFactoryBuilder(构造器):会根据配置或代码生成SqlSessionFactory,采用分步构建的Builder模式一步步构建SqlSessionFactory.
  • SqlSessionFactory(工厂接口):来生成SqlSession,使用工厂模式.
  • SqlSession(会话):不推荐使用
  • SQL Mapper(映射器):由一个java接口和xml文件(或注解)构成,需要给出对应的SQL和映射规则.
    注意:无论映射器还是会话都可以发送SQL到数据库执行并返回结果.

组件详情

一.SqlSessionFactory(工厂接口)
可以使用xml或者代码去生产工厂接口,每个基于mybatis的应用都是以一个sqlsessionfactory的实例为中心的.
构建过程分两步:1.通过XMLConfigBuilder解析配置的XML文件,读出所配置的参数并存入Configuration类对象中,该对象采用单例模式.2.使用Configuration对象去创建SqlSessionFactory,其默认实现类DefaultSqlSessionFactory.
其中,Configuration的作用:

  • 读入配置文件,包括基础XML和映射器XML(或注解).
  • 初始化一些基础配置,比如mybatis别名等.
  • 提供单例,提供配置的参数.
  • 执行一些重要对象的初始化方法.

他会做如下初始化:全局参数properties,别名,插件Plugins,环境设置settings,数据库环境environments,类型转换器typeHandlers,映射器Mappers等等.
二.SqlSession(会话)
该接口有两个实现类,DefaultSqlSession(单线程使用)和SqlSessionManager(多线程使用).sqlsession的作用类似于JDBC中的connection对象,代表着一个连接资源的启用.具体地,它有三个作用:(1)获取Mapper接口(2)发送SQL给数据库(3)控制数据库事务.
注意:sqlsession的获取Mapper接口和发送SQL功能需要先实现映射器的功能.
sqlsession只是一个门面接口,真正干活的是Executor.
sqlsession运行过程:

sql.getMapper();
configuration.getMapper();
他又运用了映射器的注册器mapperRegistry.getMapper();
它首先判断是否注册了一个Mapper,若有就会启动MapperProxyFactory工厂来生成一个代理实例.
如果mapper是一个JDK动态代理,那么就运行到invoke方法里面,invoke首先判断mapper是不是一个类,
若不是,会生成MapperMethod对象,最后执行execute方法,把SqlSession和当前运行的参数传进去,
实际上最后就是通过SqlSession对象去运行对象的SQL而已.

这就是为什么mybatis只用mapper接口就能运行对应SQL了,因为mapper的XML文件的命名空间对应的是这个接口的全限定名,而方法就是那条SQL的id,这样就可以根据全路径和方法名,将其和代理对象绑定起来.通过动态代理技术让这个接口运行起来,而后采用命令模式,根据上下文跳转到任何方法中.
实际上SqlSession的执行过程是通过Executor,StatementHandler,ParameterHandler和ResultSetHandler来完成数据库操作和结果返回的.
executor()执行器),由它来调度后三个来执行对应SQL.
statementHandler(数据库会话器)作用是使用数据库的statement(preparedstatement)执行操作,起到承上启下作用,核心.
parameterHandler(参数处理器)用来处理SQL参数的.
resultsethandler(结果处理器)是进行数据集(resultset)的封装返回处理的.
SqlSession运行总结:通过执行器调度statementHandler来运行,而statementHandler经过3步:

  • prepared预编译SQL
  • parameterize设置参数
  • query/update执行SQL

其中,parameterize是调用parameterHandler的方法设置的,而参数是根据类型处理器typeHandler处理的,query/update方法通过resultsethandler进行处理结果的封装,如果是update就返回整数,否则就通过typeHandler处理结果类型,然后用objectFactory提供的规则组装对象,返回给调用者.
三.映射器
主要作用是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库,并定义一些关于缓存等的内容.
它由一个接口和对应的XML文件(或注解)组成.但是XML的配置会覆盖掉注解的相关配置.
对比SqlSession和Mapper两种发送SQL方法:

//sqlsession方式
Role role=(Role)sqlSession.selectOne("com.learn.ssm.mapper.Rolemapper.getRole",1L);
//mapper方式
RoleMapper roleMapper=sqlSession.getMapper(RoleMapper.class);
Role role=roleMapper.getRole(1L);

建议使用sqlsession获取mapper接口再发送方式,理由:使用接口编程可以消除sqlsession带来的功能性代码,而sqlsession发送SQL,需要一个SQL id去匹配SQL.另外,使用第一种方式只有在运行中才知道是否会产生错误,而第二种方式会直接提示错误和校验.
mybatis中的级联分3中:
鉴别器(discriminator):根据某些条件决定采用具体实现类,像java的switch…case…
一对一(association)
一对多(collection)
注:不支持多对多,因为比较复杂而且可以用多个一对多级联进行替换.
mybatis中缓存分为一级缓存和二级缓存:
一级是在sqlsession上的缓存,二级在sqlsessionfactory上.默认开启一级缓存,这个缓存不需要POJO对象可序列化.
为了使sqlsession对象之间共享相同的缓存,需要开启二级缓存,只需要在映射文件上加入< cache/ >,这个时候会序列化和反序列化对应的POJO,即必须实现java. io.Serializable接口.如果没有实现该接口,那么mybatis会抛出异常.
各组件的生命周期
1.SqlSessionFactoryBuilder
只能存在于创建SqlSessionFactory的方法中,而不能长期存在.
2.SqlSessionFactory
可以被认为是一个数据库连接池,MyBatis的本质就是java对数据库的操作,所以生命周期存在于整个mybatis应用之中,一般应用中希望作为一个单例.
3.SqlSession
相当于数据库连接(connection),所以存活在一个业务请求中,处理完整个请求后应该关闭这条连接.
4.Mapper
它由SqlSession创建,所以生命周期最多和SqlSession一致,所以生命周期应该小于等于SqlSession的生命周期.SqlSession的关闭,它的数据库连接资源也会消失.

动态SQL

if:单条件分支判断
choose(when,otherwise):相当于java中的switch和case语句,多条件分支判断
trim,where,set:辅助元素,用于处理特定的SQL拼装问题,比如去掉多余的and,or等
foreach:在in语句等列举条件常用的循环语句
test属性:判断字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值