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发送给数据库执行)
存储过程 存储过程游标
分表
分页
上传文件导服务器
在映射中使用枚举
多对多级联