Mybatis理解


ORM模型,就是数据库的表和简单的java对象的映射关系模型,它主要解决数据库数据和POJO对象的相互映射。
Hibernate(全表映射框架) hbm.xml,制定映射规则。 Hibernate.cfg.xml  配置文件
好处:1.消除了代码的映射规则,全部被分离到了xml或注解里去配置      2. 无需管理数据库连接    3.一个会话中,不要操作多个对象,操作一个session对象即可   4. 关闭资源只需要关闭一个session即可
缺点:1. 全表带来的不便,比如更新时需要所有的字段    2.无法根据不同的条件组装不同的sql    3.对多表关联和复杂sql查询支持较差,需要自己写sql,返回后,需要自己将数据组装为POJO    4.不能有效支持存储过程   5.虽然有hsql,但是性能较差。

Mybatis 称它为半自动,因为它需要手工匹配POJO,SQL和映射关系。

Mybatis核心组件:1. SqlSessionFacotryBuilder(构造器),会根据配置信息或者代码来生成SqlSessionFactory(工厂接口)
2.SqlsessionFactory:依靠工厂来生成Session(会话)
3.SqlSession:是一个既可以发送SQL去执行并返回结果,也可以获取Mapper接口
4.SQL Mapper:它是Mybatis新设计的组件,它是由一个java接口和xml文件(或注解)构成的,需要给出对应的SQL和映射规则。它负责发送SQL去执行,并返回结果
Sqlsession的用途:1.获取映射器,让映射器通过命名空间件和方法名称找到敌营的SQL,发送给数据库执行后并返回结果
2.直接通过命名信息去执行SQL并返回结果。
生命周期  SqlSessionFactoryBuilder :生命周期只存在于方法的局部,作用就是生成SqlSessionFactory对象,一旦构建了SqlSessionFactory对象,就失去了意义。
         SqlSessionFactory   作用是创建SqlSession,SqlSession就是一个会话,相当于JDBC中的Conection对象。    SqlSessionFactory应该在Mybatis应用的整个生命周期中    单例(好处在于可以重复利用这个唯一的对象,而对象在内存中读取和运行速度都比较快,同时节约内存)
 SqlSession 生命周期应该是再请求数据库处理事务的过程中。  线程不安全。  及时关闭。
 Mapper 是一个接口,作用是发送SQL,返回我们需要的结果或者是执行SQL修改数据库, 所以它的生命周期在一个SqlSession事务方法之内,是一个方法级别的东西。如果JDBC中一条SQL语句的执行
 
配置:
properties元素
别名
typeHandler类型处理器 :Mybatis在预处理语句(prepareStatement)中设置一个参数时,或者从结果集(ResultSet)中取出一个值时,都会采用注册了的typeHandler进行处理。
typeHandler的作用就是将参数从javaType转化为jdbcType,或者从数据库中取出结果时把jdbcType转化为javaType
ObjectFactory:当mybatis在构建一个结果返回到时候,都会使用ObjectFactory去构建POJO,在Mybatis中可以定制自己的对象工厂。
插件
environments配置环境  :配置环境可以注册多个数据源,每个数据源分为两大部分(1.数据库源的配置 2.数据库事务的配置)
databaseIdProvider数据库厂商标识 
引入映射器的方法 :映射器是mybatis最复杂,最核心的组件
1.文件路径引入 2. 包名引入  3. 类注册引入  4. userMapper.xml引入
映射器:
主要元素:select  insert update delete parameterMap  sql   resultMap(用来描述从数据库结果集中来加载对象,它是最复杂最强大的元素)  cache cache-ref
select 查询传递多个参数  1.使用map传递参数(后续维护和扩展困难)  2.使用注解方式传递参数(参数过多时调用困难)   3. 使用javaBean传递参数(参数个数>5时采用)
insert   使用keyProperty属性指定主键字段,使用useGeneratedKeys属性告诉mybatis是否使用数据库内置策略生成
参数 存储过程支持   特殊字符处理 # 预编译语句
resultMap 作用是:定义映射规则,级联的更新,定制类型转换器等。
级联:一对一,一对多的关系。三种级联 1.association 代表一对一 2.collection 代表一对多  3.discriminator 鉴别器,比如实例化人对象,用男或女去实例化
性能分析和n+1问题,解决n+1问题考虑采用延迟加载的功能。一开始并不取出级联数据,只有当使用它了才发送SQL去取数据
缓存 cache  
系统缓存(一级缓存和二级缓存) 一级缓存只是相对于同一个SqlSession而言    二级缓存,使得缓存在SqlSessionFactory层面上能够提供给各个SqlSession对象共享
动态SQL(体现了mybatis的灵活性,高度可配置性和可维护性)
if 判断语句   choose(when otherwise)相当于java中的case when语句  trim(where set)辅助语句  foreach 循环语句
Mybatis的解析和运行原理(Mybatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程)
    Mapper 动态代理  代理模式:就是在原有的服务上多加一个站位,通过这个占位去控制服务的访问。    为什么要用代理模式:1.一方面可以控制如何访问真正的服务对象,提供额外服务。另一方面有机会通过重写一些类来满足特定的需要
  动态代理分为两种 1.JDK反射机制提供的代理(必须要提供接口),2.CGLIB代理
构建SqlSessionFactory过程 
Configuration的作用 :1.读入配置文件,包含基础配置的XML文件和映射器XML文件     2. 初始化基础配置,比如Mybatis的别名等,一些重要的类对象,例如插件,映射器,ObjectFactory和typeHandler
    3.提供单例,为后续创建SessionFactory服务并提供配置的参数       4. 执行了一些重要的对象方法,初始化配置信息。
映射器的内部构成 :1.MappedStatement,保存映射器的一个节点(select|insert|delete|update) 包含许多我们配置的SQL,SQL的id,缓存信息,resultMap,parameterType,resultType,languageDriver等重要配置内容
  2.SqlSource:提供BoundSql对象的地方,它是MappedStatement的一个属性  BoundSql,它是建立SQL和参数的地方
SqlSession运行过程  SqlSession是一个接口
   SqlSession的四大对象  1.Executor 代表执行器,由它来调度StatementHandler,ParameterHandler,ResultHandler等来执行对应的SQL
2.StatementHandler的作用是使数据库的Statement(preparedStatement)执行操作,它是四大对象的核心,起到承上启下的作用
3.ParameterHandler用于SQL对参数的处理    3.ResultHandler是进行最后数据集(ResultSet)的封装返回处理的。
执行器(Excetor),真正执行java与数据库交互的东西 
数据库会话器(StatementHandler)  参数处理器(parameterHandler)       结果处理器(ResuleSetHandler)

运行总结:SqlSession是通过Executor创建StatementHandler来运行的,而StatementHandler要经过下面三步:1.prepared预编译SQL 2.parameterize设置参数  3.query/update执行sql
  其中paramterize是调用parameterHandler的方法去设置的,而参数是根据类型处理器typeHandler去处理的。query/update方法是通过resultHandler进行处理结果的封装。如果是update的语句,
  它就返回整数,否则它就通过typeHandler处理结果类型,然后用ObjectFactory提供的规则组装对象,返回给调用者。
插件
使用插件,必须实现接口Interceptor 
接口中的三个方法 1.intercept方法,直接覆盖所有拦截对象原有的方法,因此它是插件的核心方法。     2. plugin方法,targin是被拦截对象,它的作用是给被拦截对象生成一个代理对象,并返回它。
        3.setProperties方法,允许在plugin元素中配置所需参数,方法在插件初始化的时候就被调用一次,允许把插件对象存入到配置中,以便以后取出。
插件的初始化是再mybatis初始化的时候完成的
插件的代理和反射设计
插件使用的责任链模式。例如请假请求是一个对象,它经过项目经理,部门经理,总裁等多个角色审批处理,每个角色都可以处理,这就是责任链模式。
责任链模式的作用:让每一个责任链上的角色都有机会去拦截这个对象。 
mybatis提供的常用工具类:Plugin类,用来生成代理对象
常用的工具类MateObject 可以有效读取或修改一些重要对象的属性
插件开发过程和实例 
1.确定需要拦截的签名 
1.确定需要拦截的对象,常用SqlSession四大对象中的StatementHandler(执行Sql的过程,可以重写执行SQL的过程)
2.拦截方法和参数   查询的过程是通过Executor调度StatementHandler来完成的。调度StatementHandler的prepare方法预编译SQL,我们需要拦截的方法就是perpare方法
2.实现拦截方法
3.配置运行
4.插件实例(分页)
mybatis-Spring   mybatis与spring无缝连接,通过mybatis-spring-x.x.x.jar来实现  本书使用的是1.2.3版本
spring的基础知识
IOC基础,是用反射技术实现的。  它不是一种技术。而是一种理念。    IOC的注入方式(3种):1.构造方法注入  2. setter注入  3.接口注入
AOP基础.  动态代理来实现的。   最大的用处是事务的控制  AOP的概念(切面,连接点,通知 ,切入点,目标对象,AOP代理)
Spring 事务管理    事务隔离级别:脏读,读写提交,可重复读,序列化
脏读是指一个事务能够读取到另外一个事务未提交的数据
性能:脏读->读写提交->可重复读->序列化   更多的时候选择的是读写提交   oracle只支持读写提交和序列化  默认的是读写提交       mysql默认隔离级别为可重复读
 传播行为,是指方法之间的调用问题  7种
springmvc基础
核心DispatcherServlet    servlet拦截请求,由核心接收转发跳转
注解  @Controller 控制层  @RequestMapping所配置的路径跳转到对应的控制器和方法中去   @ResponseBody标注视图解析器,把结果转化为JSON,返回给视图层
mybatis-Spring
配置分为以下几个部分:1.配置数据源   2. 配置SqlSessionFactory   3.配置SqlSessionTemplate  4. 配置Mapper    5. 事务处理
实用的场景 
数据库Blob字段读写
mybatis的类型处理器提供了BlobTypeHandler和BlobByteObjectArrayTypeHandler,常用的是前者。
批量更新  修改配置文件中的settings的defaultExecutorType来制定其执行器为批量执行器  (注意:一旦使用了批量执行期,在默认情况下,commit后才发送SQL到数据库   解决办法是执行flushStatements 作用是将当前缓存的SQL发送给数据库执行)
存储过程        存储过程游标
分表
分页
上传文件导服务器
在映射中使用枚举
多对多级联

你可能感兴趣的:(Java)